From a61f9377013c228affd34166f943742c8cbd4216 Mon Sep 17 00:00:00 2001 From: Lazar Milikic Date: Wed, 24 Jun 2026 03:37:41 +0200 Subject: [PATCH] Add Hilton-Milner WIP formalization --- .../AShortProofOfTheHiltonMilnerTheorem.lean | 1 + .../Basic.lean | 82 ++ .../Blueprint.md | 176 +++ .../HiltonMilner.lean | 133 ++ .../Main.lean | 19 + .../MainTechnical.lean | 70 + .../Shifting.lean | 514 +++++++ .../EPFLemmaPrint.lean | 8 + AShortProofOfTheHiltonMilnerTheorem/README.md | 29 + .../docs/2411.02513.source | Bin 0 -> 14764 bytes ...vka_woodroofe2024_hilton_milner.images.txt | 6 + .../bulavka_woodroofe2024_hilton_milner.pdf | Bin 0 -> 126593 bytes .../bulavka_woodroofe2024_hilton_milner.txt | 248 ++++ .../docs/source/00README.json | 17 + ...of_the_Hilton-Milner_theorem_hamsplain.bst | 1285 +++++++++++++++++ ...ort_proof_of_the_Hilton-Milner_theorem.tex | 374 +++++ .../lake-manifest.json | 106 ++ .../lakefile.toml | 23 + .../lean-toolchain | 1 + 19 files changed, 3092 insertions(+) create mode 100644 AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem.lean create mode 100644 AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Basic.lean create mode 100644 AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Blueprint.md create mode 100644 AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/HiltonMilner.lean create mode 100644 AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Main.lean create mode 100644 AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/MainTechnical.lean create mode 100644 AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Shifting.lean create mode 100644 AShortProofOfTheHiltonMilnerTheorem/EPFLemmaPrint.lean create mode 100644 AShortProofOfTheHiltonMilnerTheorem/README.md create mode 100644 AShortProofOfTheHiltonMilnerTheorem/docs/2411.02513.source create mode 100644 AShortProofOfTheHiltonMilnerTheorem/docs/bulavka_woodroofe2024_hilton_milner.images.txt create mode 100644 AShortProofOfTheHiltonMilnerTheorem/docs/bulavka_woodroofe2024_hilton_milner.pdf create mode 100644 AShortProofOfTheHiltonMilnerTheorem/docs/bulavka_woodroofe2024_hilton_milner.txt create mode 100644 AShortProofOfTheHiltonMilnerTheorem/docs/source/00README.json create mode 100644 AShortProofOfTheHiltonMilnerTheorem/docs/source/8_Users_russw_Documents_Research_mypapers_A_short_proof_of_the_Hilton-Milner_theorem_hamsplain.bst create mode 100644 AShortProofOfTheHiltonMilnerTheorem/docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex create mode 100644 AShortProofOfTheHiltonMilnerTheorem/lake-manifest.json create mode 100644 AShortProofOfTheHiltonMilnerTheorem/lakefile.toml create mode 100644 AShortProofOfTheHiltonMilnerTheorem/lean-toolchain diff --git a/AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem.lean b/AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem.lean new file mode 100644 index 0000000..2540e1d --- /dev/null +++ b/AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem.lean @@ -0,0 +1 @@ +import AShortProofOfTheHiltonMilnerTheorem.Main diff --git a/AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Basic.lean b/AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Basic.lean new file mode 100644 index 0000000..e775df4 --- /dev/null +++ b/AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Basic.lean @@ -0,0 +1,82 @@ +import Mathlib + +/-! +Shared definitions for the source-backed Hilton--Milner formalization. +-/ + +namespace AShortProofOfTheHiltonMilnerTheorem + +/-- A finite set system, represented as a finite family of finite subsets of `ℕ`. -/ +@[reducible] def SetFamily : Type := Finset (Finset ℕ) + +/-- The source ground set `[n] = {1, ..., n}`. -/ +def ground (n : ℕ) : Finset ℕ := + Finset.Icc 1 n + +/-- All `k`-element subsets of the source ground set `[n]`. -/ +def kSubsets (n k : ℕ) : SetFamily := + (ground n).powersetCard k + +/-- A finite family all of whose members are subsets of `[n]`. -/ +def FamilyOn (n : ℕ) (𝓕 : SetFamily) : Prop := + ∀ ⦃F : Finset ℕ⦄, F ∈ 𝓕 → F ⊆ ground n + +/-- A finite family of `k`-element subsets of `[n]`. -/ +def UniformFamily (n k : ℕ) (𝓕 : SetFamily) : Prop := + ∀ ⦃F : Finset ℕ⦄, F ∈ 𝓕 → F.card = k ∧ F ⊆ ground n + +/-- Pairwise-intersecting finite set family. -/ +def PairwiseIntersecting (𝓕 : SetFamily) : Prop := + ∀ ⦃F G : Finset ℕ⦄, F ∈ 𝓕 → G ∈ 𝓕 → F ≠ G → (F ∩ G).Nonempty + +/-- Cross-intersecting finite set families. -/ +def CrossIntersecting (𝓐 𝓑 : SetFamily) : Prop := + ∀ ⦃A B : Finset ℕ⦄, A ∈ 𝓐 → B ∈ 𝓑 → (A ∩ B).Nonempty + +/-- The total intersection of the family is empty. -/ +def EmptyTotalIntersection (𝓕 : SetFamily) : Prop := + ∀ x : ℕ, ∃ F : Finset ℕ, F ∈ 𝓕 ∧ x ∉ F + +/-- After deleting any one member, the remaining family has empty total intersection. -/ +def DeletionEmptyTotalIntersection (𝓕 : SetFamily) : Prop := + ∀ ⦃F₀ : Finset ℕ⦄, F₀ ∈ 𝓕 → ∀ x : ℕ, + ∃ F : Finset ℕ, F ∈ 𝓕 ∧ F ≠ F₀ ∧ x ∉ F + +/-- Replace `j` by `i` in a set when `j ∈ F` and `i ∉ F`. -/ +def shiftedSet (i j : ℕ) (F : Finset ℕ) : Finset ℕ := + if j ∈ F ∧ i ∉ F then insert i (F.erase j) else F + +/-- The source combinatorial shifting operation `Shift_{i ← j}` on a set family. -/ +def shiftOperation (i j : ℕ) (𝓕 : SetFamily) : SetFamily := + (𝓕.filter (fun F : Finset ℕ => j ∉ F ∨ i ∈ F ∨ shiftedSet i j F ∈ 𝓕)) ∪ + ((𝓕.filter (fun F : Finset ℕ => j ∈ F ∧ i ∉ F)).image (shiftedSet i j)) + +/-- Shiftedness over the ground set `[n]`. -/ +def ShiftedOn (n : ℕ) (𝓕 : SetFamily) : Prop := + ∀ ⦃i j : ℕ⦄ ⦃F : Finset ℕ⦄, + i ∈ ground n → j ∈ ground n → i < j → F ∈ 𝓕 → j ∈ F → i ∉ F → + shiftedSet i j F ∈ 𝓕 + +/-- The numerical upper bound in the main technical theorem. -/ +def mainTechnicalBound (n k : ℕ) : ℕ := + Nat.choose n (k - 1) - Nat.choose (n - k) (k - 1) + 1 + +/-- The numerical upper bound in the Hilton--Milner theorem. -/ +def hiltonMilnerBound (n k : ℕ) : ℕ := + Nat.choose (n - 1) (k - 1) - Nat.choose (n - 1 - k) (k - 1) + 1 + +/-- +The extremal Hilton--Milner family from the source uniqueness theorem: a single +`k`-set `B`, together with all `k`-sets in `[n]` that contain `i` and intersect +`B`. +-/ +def hiltonMilnerFamily (n k i : ℕ) (B : Finset ℕ) : SetFamily := + insert B ((kSubsets n k).filter (fun F : Finset ℕ => i ∈ F ∧ (F ∩ B).Nonempty)) + +/-- The exact structural conclusion of the Hilton--Milner uniqueness theorem. -/ +def IsHiltonMilnerFamily (n k : ℕ) (𝓕 : SetFamily) : Prop := + ∃ (B : Finset ℕ) (i : ℕ), + B ∈ kSubsets n k ∧ i ∈ ground n ∧ i ∉ B ∧ + 𝓕 = hiltonMilnerFamily n k i B + +end AShortProofOfTheHiltonMilnerTheorem diff --git a/AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Blueprint.md b/AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Blueprint.md new file mode 100644 index 0000000..631f7af --- /dev/null +++ b/AShortProofOfTheHiltonMilnerTheorem/AShortProofOfTheHiltonMilnerTheorem/Blueprint.md @@ -0,0 +1,176 @@ +# Formalization Blueprint: docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex + +- Source: `docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex` +- Nearby PDF checked: `docs/bulavka_woodroofe2024_hilton_milner.pdf` +- Target Lean entry file: `AShortProofOfTheHiltonMilnerTheorem/Main.lean` +- Status: statement/source review approved; strict Hilton--Milner bridge corrections added for proof handoff. Lean proofs remain as `sorry` skeletons for a user-started prove workflow. + +## Planner Checklist + +- [x] Identify definitions and notation that must exist before theorem statements. +- [x] Split large source theorems into Lean-sized lemmas. +- [x] Record source labels/pages/equations for every generated declaration. +- [x] Check local project and Mathlib names before introducing duplicates. +- [x] Verify drafted Lean statements match the source document. +- [x] Run independent statement/source verification review and apply corrections. +- [x] Attach the complete source proof text when available, or explicitly record why it is unavailable. +- [x] Record a natural-language proof strategy or source proof pointer for each theorem/lemma. +- [x] Resolve all construction stubs before proof handoff. +- [x] Mark stable theorem/lemma/example `sorry` declarations ready for a user-started prove workflow. (Checked after independent review stamped every source entry.) + +## Import Plan + +Direct Lean imports expected in generated Lean files only: +- `Mathlib` + +Root coverage: +- `AShortProofOfTheHiltonMilnerTheorem.lean` imports `AShortProofOfTheHiltonMilnerTheorem.Main`. + +## Suggested Search Modules + +Non-gating modules or namespaces to search while proving. Do not force these into `.lean` imports unless the prover actually needs them. +- `Mathlib.Combinatorics.SetFamily.Shadow` for `Finset.shadow`, `Finset.mem_shadow_iff`, and shadow monotonicity. +- `Mathlib.Combinatorics.SetFamily.Intersecting` for Mathlib's `Set.Intersecting` reference definition. +- `Mathlib.Data.Finset.Powerset` for `Finset.powersetCard` and cardinality of fixed-size subsets. +- `Mathlib.Data.Nat.Choose.Basic` and nearby binomial lemmas for Pascal identities. +- `Mathlib.Data.Finset.Interval` for `Finset.Icc` facts about the ground set `[n]`. + +Search notes from the planner refresh: +- `Finset.powersetCard`, `Finset.mem_powersetCard`, and `Finset.card_powersetCard` are the Mathlib fixed-cardinality subset interface. +- `Finset.shadow`, `Finset.mem_shadow_iff`, `Finset.shadow_mono`, and `Finset.shadow_monotone` are the Mathlib shadow interface matching the source shadow under uniformity. +- `Nat.choose_succ_succ`, `Nat.choose_succ_left`, and `Nat.choose_succ_right` are the likely Pascal/binomial recurrence lemmas. + +## Generated File Layout + +- Aggregator entry file: `AShortProofOfTheHiltonMilnerTheorem/Main.lean` +- `AShortProofOfTheHiltonMilnerTheorem/Basic.lean`: finite-family, uniformity, intersection, shifting, and extremal-family definitions. +- `AShortProofOfTheHiltonMilnerTheorem/MainTechnical.lean`: the main technical inequality and shifted/strict variants. +- `AShortProofOfTheHiltonMilnerTheorem/Shifting.lean`: Frankl--Furedi and strengthened shifting reductions. +- `AShortProofOfTheHiltonMilnerTheorem/HiltonMilner.lean`: the HM bound, uniqueness statement, and equality-case bridge lemmas. + +## Lean Representation Plan + +The source works with finite set systems of subsets of `[n] = {1, ..., n}`. The Lean draft uses finite set families directly: + +- `SetFamily := Finset (Finset ℕ)` represents a finite family of finite sets of natural numbers. +- `ground n := Finset.Icc 1 n` represents `[n]`. +- `kSubsets n k := (ground n).powersetCard k` represents all `k`-element subsets of `[n]`. +- `FamilyOn n 𝓕` and `UniformFamily n k 𝓕` record that every member of `𝓕` lies in `[n]` and has cardinality `k`. +- `PairwiseIntersecting 𝓕` says distinct members of `𝓕` have nonempty intersection. +- `CrossIntersecting 𝓐 𝓑` says every `A ∈ 𝓐` intersects every `B ∈ 𝓑`. +- `EmptyTotalIntersection 𝓕` says no natural number is contained in all members of `𝓕`. +- `DeletionEmptyTotalIntersection 𝓕` formalizes the strengthened property in the final lemma: after deleting any fixed `F₀`, the remaining family has empty total intersection. +- `shiftedSet`, `shiftOperation`, and `ShiftedOn n 𝓕` formalize the shifting definition from lines 138-146. +- `Finset.shadow 𝓑` is Mathlib's one-element-deletion shadow. Under `UniformFamily n k 𝓑`, this matches the source shadow of all `(k-1)`-subsets of members of `𝓑`. +- `mainTechnicalBound n k` and `hiltonMilnerBound n k` name the two binomial upper bounds. +- `hiltonMilnerFamily n k i B` represents the extremal family consisting of `B` and all `k`-sets in `[n]` that contain `i` and intersect `B`. +- `IsHiltonMilnerFamily n k 𝓕` names the exact existential conclusion of the uniqueness theorem, so bridge lemmas can pass the HM structure around without duplicating the long existential. + +Representation bridge notes: +- The source's inequalities `2k - 1 ≤ n`, `k ≤ n/2`, and `k < n/2` are encoded over naturals as `2 * k ≤ n + 1`, `2 * k ≤ n`, and `2 * k < n` respectively. +- The draft adds `0 < k` where the source uses `(k-1)`-element families but leaves positivity implicit. This is a domain clarification for natural-number indexing, not intended as a mathematical weakening for the paper's positive-uniformity setting. + +## Source Statement Inventory + +### thm:HM + +- Kind: theorem +- Source locator: `docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex:91-95`; proof at lines 198-223 after Lemma `lem:Frankl-Furedi` is introduced. +- Planned Lean declarations: `hiltonMilner`; supporting definitions `SetFamily`, `ground`, `UniformFamily`, `PairwiseIntersecting`, `EmptyTotalIntersection`, `hiltonMilnerBound`. +- Dependencies: `franklFurediShifted`, `mainTechnical`, shifting definitions, shadow containment for the HM split families. +- Formal statement review: Lean states the cardinal upper bound for any finite family of `k`-element subsets of `[n]` that is pairwise intersecting and has empty total intersection. The source condition `k ≤ n/2` is encoded as `2 * k ≤ n`; the conclusion is `𝓕.card ≤ hiltonMilnerBound n k`. +- Source qualifiers: mathematical object class is a finite family of `k`-element subsets of `[n]`; quantifiers are over natural parameters `n k` and a family `𝓕`; parameter domain includes `k ≤ n/2` and implicit positive `k`; side conditions are pairwise intersection and empty total intersection; output is an upper bound on `|𝓕|` by the stated binomial expression. +- Lean coverage: `UniformFamily n k 𝓕` covers `k`-element subsets of `[n]`; `PairwiseIntersecting 𝓕` covers pairwise-intersecting; `EmptyTotalIntersection 𝓕` covers `⋂_{F∈𝓕} F = ∅`; `2 * k ≤ n` covers `k ≤ n/2`; `hiltonMilnerBound` is exactly `{n-1 choose k-1} - {n-1-k choose k-1} + 1` using `Nat.choose`. +- Scope changes: finite-family representation by `Finset`; explicit `0 < k`; natural-arithmetic encoding of `k ≤ n/2` as `2 * k ≤ n`. +- Statement verification status: approved by codex verifier +- Complete source proof: Given the lemma, the proof of Theorem~\ref{thm:HM} is nearly immediate. Let $\mathcal{F}$ be a shifted family satisfying the conditions of the theorem. Define $\mathcal{A}=\{F\setminus1 : F\in\mathcal{F}\text{ with }1\in\mathcal{F}\}$ and $\mathcal{B}=\{F : F\in\mathcal{F}\text{ with }1\notin\mathcal{F}\}$. Since $\mathcal{F}$ is shifted, if $F\in\mathcal{F}$ does not have $1$, then $(F\setminus i)\cup1\in\mathcal{F}$ for each $i\in F$. It follows that $\partial\mathcal{B}\subseteq\mathcal{A}$. Since $\mathcal{F}$ is intersecting, also $\mathcal{A},\mathcal{B}$ are cross-intersecting systems of subsets of $\{2,\dots,n\}$. Since $\mathcal{F}$ has empty intersection, both of $\mathcal{A},\mathcal{B}$ are nonempty. The desired bound is now immediate from Theorem~\ref{thm:MainTechnical}. +- Source proof / prover notes: First use `franklFurediShifted` to reduce to shifted `𝓕`. Split members according to whether they contain `1`, deleting `1` from the containing part to define `𝓐`, and keeping the non-containing part as `𝓑` on the remaining ground set. Prove shadow containment from shiftedness, cross-intersection from pairwise intersection, and nonemptiness from empty total intersection. Apply `mainTechnical` with the ground set reindexed from `{2, ..., n}` to `[n-1]`; the binomial expression then matches `hiltonMilnerBound`. + +### thm:MainTechnical + +- Kind: theorem +- Source locator: `docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex:106-115`; proof at lines 155-196. +- Planned Lean declarations: `mainTechnical`; supporting definitions `UniformFamily`, `CrossIntersecting`, `mainTechnicalBound`. +- External Mathlib reference in the statement: Finset shadow for the source shadow operator. +- Dependencies: shifting preservation facts, induction on `n`, fixed-size subset counting, binomial/Pascal identities, complement argument in the base case. +- Formal statement review: Lean states the source inequality for finite families `𝓐` of `(k-1)`-sets and `𝓑` of `k`-sets in `[n]`, with cross-intersection, nonempty `𝓑`, and `Finset.shadow 𝓑 ⊆ 𝓐`. +- Source qualifiers: object classes are two uniform finite set families over `[n]`; quantifier order is `n`, `k`, `𝓐`, `𝓑`; parameter domain is `2k-1 ≤ n` and implicit `0 < k`; side conditions are cross-intersection, nonempty `𝓑`, and shadow containment; output is the cardinal inequality with binomial bound `{n choose k-1} - {n-k choose k-1} + 1`. +- Lean coverage: `hkn : 2 * k ≤ n + 1` encodes `2k-1 ≤ n`; `UniformFamily n (k - 1) 𝓐` and `UniformFamily n k 𝓑` cover the uniform families; `CrossIntersecting 𝓐 𝓑` covers cross-intersection; `𝓑.Nonempty` covers nonempty `𝓑`; `Finset.shadow 𝓑 ⊆ 𝓐` covers `∂𝓑 ⊆ 𝓐`; `mainTechnicalBound` covers the exact numeric bound. +- Scope changes: finite-family representation by `Finset`; explicit `0 < k`; natural-arithmetic encoding `2 * k ≤ n + 1`; Mathlib one-step shadow used with the uniformity bridge noted above. +- Statement verification status: approved by codex verifier +- Complete source proof: We carry out a straightforward induction on $n$. If $n=2k-1$, then the upper bound is ${n \choose k-1}$, and the result follows by noticing that if a $(k-1)$-element set is in $\mathcal{A}$, then its complement cannot be in $\mathcal{B}$ (and vice-versa). For the inductive step, we may assume that $\mathcal{A}$ and $\mathcal{B}$ are shifted; otherwise, shift. Let $\mathcal{A}(\neg n),\mathcal{B}(\neg n)$ consist of the subsets in $\mathcal{A},\mathcal{B}$ that do not contain $n$. It is immediate that these are shifted, cross-intersecting, and satisfy the shadow condition. Let $\mathcal{A}(n),\mathcal{B}(n)$ be obtained by taking subsets that contain $n$, then deleting $n$. These are also shifted, cross-intersecting, and satisfy the shadow condition. As $\mathcal{A}$ and $\mathcal{B}$ are shifted, $\mathcal{A}(\neg n)$ and $\mathcal{B}(\neg n)$ are nonempty, so induction gives equation (1): $|\mathcal{A}(\neg n)|+|\mathcal{B}(\neg n)|\leq {n-1\choose k-1}-{n-1-k\choose k-1}+1$. For $\mathcal{A}(n),\mathcal{B}(n)$: if $\mathcal{A}(n)$ is empty then the shadow condition makes $\mathcal{B}(n)$ empty; if $\mathcal{B}(n)$ is empty, shiftedness and nonempty $\mathcal{B}$ give $\{1,\dots,k\}\in\mathcal{B}$, so every set in $\mathcal{A}(n)$ intersects it and $|\mathcal{A}(n)|\leq {n-1\choose k-2}-{n-1-k\choose k-2}$; if $\mathcal{B}(n)$ is nonempty, induction gives equation (2), $|\mathcal{A}(n)|+|\mathcal{B}(n)|\leq {n-1\choose k-2}-{n-1-k\choose k-2}$. Combine with Pascal's identity. +- Source proof / prover notes: Formal proof should introduce no-containing and containing/deleted subfamilies, prove they partition both families by membership of `n`, apply induction to the not-`n` part and either induction or direct counting to the `n` part, then finish with `Nat.choose` Pascal identities. Search `Finset.card_powersetCard`, `Finset.mem_shadow_iff`, and `Nat.choose` recurrence lemmas. + +### lem:Frankl-Furedi + +- Kind: lemma +- Source locator: `docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex:201-206`; proof at lines 230-255. +- Planned Lean declarations: `franklFurediShifted`; supporting definitions `ShiftedOn`, `shiftOperation`, `UniformFamily`, `PairwiseIntersecting`, `EmptyTotalIntersection`. +- Dependencies: combinatorial shifting operation, preservation of pairwise intersection and cardinality under shifts, termination of repeated shifts, and the fallback argument using the boundary of `{1, ..., k+1}`. +- Formal statement review: Lean states existence of a shifted family `𝓕'` on the same ground set with the same uniformity, pairwise-intersection, and empty-total-intersection properties, and with `𝓕.card ≤ 𝓕'.card`. +- Source qualifiers: object class is a pairwise-intersecting family of `k`-element subsets of `[n]`; side condition is empty total intersection; output codomain is an existential shifted family satisfying the same properties and cardinality at least the original. +- Lean coverage: `UniformFamily n k 𝓕`, `PairwiseIntersecting 𝓕`, `EmptyTotalIntersection 𝓕`; existential witness `𝓕' : SetFamily` with `ShiftedOn n 𝓕'`, same properties, and `𝓕.card ≤ 𝓕'.card`. +- Scope changes: finite-family representation by `Finset`; explicit `0 < k`; shiftedness is restricted to `i,j ∈ ground n`, matching shifts over `[n]`. +- Statement verification status: approved by codex verifier +- Complete source proof: Given $\mathcal{F}$ as in Theorem~\ref{thm:HM}, apply shifting operations $\operatorname{Shift}_{i\leftarrow j}$. Each such operation preserves the pairwise-intersecting property and cardinality, but may or may not result in a system with a common element of intersection. If a sequence of shifting operations ends in a shifted system with empty intersection, then we are done. Otherwise, some shift results in a system where every set contains $i_0$. Before this step every set contains either $i_0$ or $j_0$. Relabel to `1` and `2`, continue shifting over all `3 ≤ i < j`. Then `{1,3,...,k+1}` and `{2,3,...,k+1}` are in the system. Since every set contains `1` or `2`, add all `k`-element subsets containing `{1,2}` if needed. Thus the boundary of `{1,...,k+1}` is contained in the system; it has empty intersection and is preserved by further shifts, so shifting to stability gives the result. +- Source proof / prover notes: This is the deepest shifting reduction. The proof likely needs separate lemmas for shift preservation, a finite termination measure for repeated shifts, relabeling invariance, and the boundary subfamily witness for empty intersection. Do not try to prove it by pure simplification. + +### line-224 + +- Kind: remark formalized as a theorem-shaped special case +- Source locator: `docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex:224-227` +- Planned Lean declarations: `mainTechnical_shiftedSpecialCase`. +- Dependencies: same as `mainTechnical`, plus `ShiftedOn n 𝓐` and `ShiftedOn n 𝓑` hypotheses. +- Formal statement review: The source remark is meta-mathematical: the HM proof needs only the shifted case of Theorem 2. The Lean declaration records the mathematical shifted special case by adding shiftedness hypotheses to `mainTechnical` and retaining the same conclusion. +- Source qualifiers: follow-on claim about the preceding proof's dependency on a shifted-special-case theorem. +- Lean coverage: `mainTechnical_shiftedSpecialCase` covers the shifted-special-case theorem. It does not formalize proof-dependency minimality itself. +- Scope changes: partial coverage of a prose remark; converted to a theorem statement rather than a meta-theorem about the proof script. +- Statement verification status: approved by codex verifier +- Complete source proof: no separate proof text; the remark says, "This proof requires only the special case of Theorem~\ref{thm:MainTechnical} where the set systems are shifted." +- Source proof / prover notes: Once `mainTechnical` is proved this special case follows immediately, but in the source it is intended as a possible independent target for the HM proof. + +### proof-discussion-strict-main-technical + +- Kind: theorem helper extracted from proof discussion. +- Source locator: `docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex:303-326` in the uniqueness section. +- Planned Lean declarations: `mainTechnical_shiftedStrictTwoB`. +- Dependencies: shifted version of `mainTechnical`, induction split used in `thm:MainTechnical`, the strict `|𝓑| ≥ 2` case analysis, and binomial inequalities around equation `(2)`. +- Formal statement review: Lean records the shifted strict variant explicitly: for shifted cross-intersecting families satisfying the shadow condition, if `4 ≤ k`, `2k - 1 ≤ n`, and `𝓑` has at least two members, then the same upper bound from `mainTechnical` is not attained. +- Source qualifiers: object classes are the same two uniform shifted finite set families as in the shifted special case of Theorem 2; parameter domain includes `k ≥ 4`, `2k - 1 ≤ n`, and `|𝓑| ≥ 2`; side conditions are cross-intersection, shadow containment, and shiftedness; output is the strict inequality `|𝓐| + |𝓑| < {n \choose k-1} - {n-k \choose k-1} + 1`. +- Lean coverage: `hk4 : 4 ≤ k`; `hkn : 2 * k ≤ n + 1`; `UniformFamily n (k - 1) 𝓐` and `UniformFamily n k 𝓑`; `CrossIntersecting 𝓐 𝓑`; `hcardB : 2 ≤ 𝓑.card`; `Finset.shadow 𝓑 ⊆ 𝓐`; `ShiftedOn n 𝓐`; `ShiftedOn n 𝓑`; conclusion `𝓐.card + 𝓑.card < mainTechnicalBound n k`. +- Scope changes: finite-family representation by `Finset`; natural-arithmetic encoding `2 * k ≤ n + 1`; this helper covers only the shifted proof-discussion variant, not a separate non-shifted theorem. +- Statement verification status: approved by codex verifier +- Complete source proof: The proof for a shifted family requires a straightforward modification of Theorem~\ref{thm:MainTechnical}. Require `k ≥ 4` and strengthen nonempty `\mathcal{B}` to `|\mathcal{B}| ≥ 2`; with this strengthened hypothesis, the inequality is strict. In the induction step, `\mathcal{B}(n)` is empty or nonempty. If empty, then because `\mathcal{B}` has at least two elements, `\mathcal{A}(n)` is strictly smaller than the displayed bound. If nonempty, the bound in equation `(2)` is already strict when `k ≥ 4`. Hence each induction step yields a strict inequality. +- Source proof / prover notes: Reuse the split-family proof of `mainTechnical`, but strengthen the estimates for the containing-`n` part. In the empty `𝓑(n)` case use `2 ≤ 𝓑.card` to avoid equality; in the nonempty case use the strictness of the final binomial comparison for `k ≥ 4`. + +### thm:StrictHM + +- Kind: theorem +- Source locator: `docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex:295-301`; proof discussion at lines 303-326 and dependent lemma at lines 328-363. +- Planned Lean declarations: `strictHiltonMilner`; supporting definitions `hiltonMilnerFamily` and `IsHiltonMilnerFamily`; supporting lemmas `mainTechnical_shiftedStrictTwoB`, `strictHiltonMilner_shifted`, `strictHiltonMilner_nonDeletionEmptyCase`, `strictHiltonMilner_deletionEmptyReduction`, and `strongShiftedReduction`. +- Dependencies: `hiltonMilner`, shifted strict variant `mainTechnical_shiftedStrictTwoB`, shifted classification `strictHiltonMilner_shifted`, the non-deletion-empty maximality bridge, the deletion-empty reflection bridge using `strongShiftedReduction`, and the extremal-family construction. +- Formal statement review: Lean states that if the HM hypotheses hold, `4 ≤ k`, `2 * k < n`, and the HM upper bound is achieved, then `𝓕` equals `hiltonMilnerFamily n k i B` for some `B ∈ kSubsets n k` and `i ∈ ground n` with `i ∉ B`. +- Source qualifiers: object class and hypotheses are those of `thm:HM`; additional parameter domain `4 ≤ k < n/2`; equality/image condition is attaining the upper bound; output is existence of a `k`-set `B` and element `i ∉ B` such that the family consists exactly of `B` plus all `k`-sets containing `i` and intersecting `B`. +- Lean coverage: HM hypotheses are repeated as `UniformFamily`, `PairwiseIntersecting`, and `EmptyTotalIntersection`; `hmax : 𝓕.card = hiltonMilnerBound n k` covers attaining the upper bound; `hiltonMilnerFamily` and `IsHiltonMilnerFamily` cover the exact family description; `B ∈ kSubsets n k`, `i ∈ ground n`, and `i ∉ B` cover the existential qualifiers. +- Scope changes: finite-family representation by `Finset`; strict `k < n/2` encoded as `2 * k < n`; Lean explicitly asserts `i ∈ [n]` and `B ⊆ [n]`, which are implicit in the source family description. +- Statement verification status: approved by codex verifier +- Complete source proof: The source requires `k ≥ 4` to avoid technicalities and reduce to shifted families. For shifted families, modify Theorem~\ref{thm:MainTechnical} by strengthening nonempty `\mathcal{B}` to `|\mathcal{B}| ≥ 2`; with this strengthened hypothesis the inequality is strict. If `\mathcal{B}(n)` is empty, `|\mathcal{B}| ≥ 2` makes `\mathcal{A}(n)` strictly smaller than the bound. If `\mathcal{B}(n)` is nonempty, the bound in equation (2) is already strict when `k ≥ 4`. Thus the induction step yields a strict inequality. Theorem~\ref{thm:StrictHM} follows for shifted families by applying this variant to the same split families as in the HM proof. For non-shifted families, split on `DeletionEmptyTotalIntersection`. If it fails, some `F₀` and center `i` make every other set contain `i`; empty total intersection gives `i ∉ F₀`, and maximality fills exactly the HM family. If it holds, apply the strengthened shifting lemma, use the HM upper bound and maximality to force equality throughout the reduction, classify the shifted witness, and reflect the equality case back through the shifts or standard-family replacement. +- Source proof / prover notes: Use `mainTechnical_shiftedStrictTwoB` to prove the shifted classification `strictHiltonMilner_shifted`. Then prove `strictHiltonMilner_nonDeletionEmptyCase` for the failure of the deletion-empty property. In the deletion-empty case, `strictHiltonMilner_deletionEmptyReduction` must not treat `strongShiftedReduction` as a mere black box: it must carry equality through the reduction and show that the shifted witness having HM form implies the original family already has HM form. +- Proof bridge helper declarations: + - `strictHiltonMilner_shifted`: shifted equality case from the strict variant of the main technical theorem. + - `strictHiltonMilner_nonDeletionEmptyCase`: handles the case where deleting one member leaves a common center in all remaining sets. + - `strictHiltonMilner_deletionEmptyReduction`: uses `strongShiftedReduction` plus equality-case reflection to transfer the shifted HM structure back to the original family. + +### line-328 + +- Kind: lemma +- Source locator: `docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex:328-334`; proof at lines 336-363. +- Planned Lean declarations: `strongShiftedReduction`; supporting definition `DeletionEmptyTotalIntersection`. +- Dependencies: shifting operation, strengthened no-common-intersection-after-deletion invariant, standard family comparison, preservation of boundary subfamilies under shifts. +- Formal statement review: Lean states the strengthened shifting reduction: from a pairwise-intersecting uniform family on `[n]` satisfying the deletion-empty-total-intersection property, there exists a shifted family with the same properties and no smaller cardinality. +- Source qualifiers: object class is a pairwise-intersecting family of `k`-element subsets of `[n]`; additional property is that for every `F₀ ∈ 𝓕`, the intersection over `𝓕 \ {F₀}` is empty; output is a shifted family satisfying the same properties and with cardinality at least the original. +- Lean coverage: `UniformFamily n k 𝓕`, `PairwiseIntersecting 𝓕`, and `DeletionEmptyTotalIntersection 𝓕`; existential witness with `ShiftedOn n`, same properties, and `𝓕.card ≤ 𝓕'.card`. +- Scope changes: finite-family representation by `Finset`; explicit `0 < k`; deletion of a member is represented by requiring, for each natural `x`, a witness `F ∈ 𝓕` with `F ≠ F₀` and `x ∉ F`. +- Statement verification status: approved by codex verifier +- Complete source proof: By the standard family, mean the shifted family with $A=\{2,\dots,k+1\}$, $A'=\{2,\dots,k,k+2\}$, and all `k`-element sets that both contain `1` and intersect `A` and `A'`. It is obvious that the standard family is at least as large as any family where all but two sets contain `1`. Given `𝓕`, perform shifts. If these terminate in a shifted family with the desired properties, we are done. Otherwise, a shift destroys the additional property; stop just before and relabel to get a family containing sets with `1` not `2`, with `2` not `1`, with both `1` and `2`, and possibly `B={3,...,k+2}`. Assume all sets containing both `1,2` and intersecting `B` are present. Since these sets have no common intersection other than `1,2`, shifts over all `3≤i hj hmov.1) (fun hi => hmov.2 hi) + +private lemma shiftOperation_eq_uvCompression (i j : ℕ) (𝓕 : SetFamily) : + shiftOperation i j 𝓕 = UV.compression ({i} : Finset ℕ) ({j} : Finset ℕ) 𝓕 := by + ext G + simp only [shiftOperation, UV.compression, Finset.mem_union, Finset.mem_filter, + Finset.mem_image, shiftedSet_eq_uvCompress] + constructor + · intro hG + rcases hG with hstay | hmove + · rcases hstay with ⟨hGmem, hstay⟩ + left + refine ⟨hGmem, ?_⟩ + rcases hstay with hjnot | hiin | hcompmem + · rw [uvCompress_singleton_eq_self_of_not_movable (Or.inl hjnot)] + exact hGmem + · rw [uvCompress_singleton_eq_self_of_not_movable (Or.inr hiin)] + exact hGmem + · exact hcompmem + · rcases hmove with ⟨a, hmov, hcompaG⟩ + rcases hmov with ⟨ha, hja, hia⟩ + by_cases hGmem : G ∈ 𝓕 + · left + refine ⟨hGmem, ?_⟩ + rw [← hcompaG, UV.compress_idem] + simpa [hcompaG] using hGmem + · right + exact ⟨⟨a, ha, hcompaG⟩, hGmem⟩ + · intro hG + rcases hG with hstay | hmove + · rcases hstay with ⟨hGmem, hcompmem⟩ + left + exact ⟨hGmem, Or.inr (Or.inr hcompmem)⟩ + · rcases hmove with ⟨hpre, hGnot⟩ + rcases hpre with ⟨a, ha, hcompaG⟩ + right + have hja : j ∈ a := by + by_contra hjnot + have hself : UV.compress ({i} : Finset ℕ) ({j} : Finset ℕ) a = a := + uvCompress_singleton_eq_self_of_not_movable (Or.inl hjnot) + have hGa : G = a := hcompaG.symm.trans hself + exact hGnot (by simpa [hGa] using ha) + have hia : i ∉ a := by + by_contra hiin + have hself : UV.compress ({i} : Finset ℕ) ({j} : Finset ℕ) a = a := + uvCompress_singleton_eq_self_of_not_movable (Or.inr hiin) + have hGa : G = a := hcompaG.symm.trans hself + exact hGnot (by simpa [hGa] using ha) + exact ⟨a, ⟨ha, hja, hia⟩, hcompaG⟩ + +private lemma shiftOperation_card (i j : ℕ) (𝓕 : SetFamily) : + (shiftOperation i j 𝓕).card = 𝓕.card := by + rw [shiftOperation_eq_uvCompression] + exact UV.card_compression ({i} : Finset ℕ) ({j} : Finset ℕ) 𝓕 + +private lemma shiftOperation_mem_cases (i j : ℕ) (𝓕 : SetFamily) {A : Finset ℕ} + (hA : A ∈ shiftOperation i j 𝓕) : + (A ∈ 𝓕 ∧ (j ∉ A ∨ i ∈ A ∨ shiftedSet i j A ∈ 𝓕)) ∨ + ∃ F : Finset ℕ, F ∈ 𝓕 ∧ j ∈ F ∧ i ∉ F ∧ shiftedSet i j F = A := by + unfold shiftOperation at hA + simp only [Finset.mem_union, Finset.mem_filter, Finset.mem_image] at hA + rcases hA with hA | hA + · exact Or.inl hA + · rcases hA with ⟨F, hF, rfl⟩ + exact Or.inr ⟨F, hF.1, hF.2.1, hF.2.2, rfl⟩ + +private lemma mem_shiftedSet_inserted_of_movable {i j : ℕ} {F : Finset ℕ} + (hjF : j ∈ F) (hiF : i ∉ F) : + i ∈ shiftedSet i j F := by + unfold shiftedSet + rw [if_pos ⟨hjF, hiF⟩] + simp + +private lemma mem_shiftedSet_of_mem_ne_erased {i j x : ℕ} {F : Finset ℕ} + (hxF : x ∈ F) (hxj : x ≠ j) : + x ∈ shiftedSet i j F := by + unfold shiftedSet + by_cases h : j ∈ F ∧ i ∉ F + · rw [if_pos h] + exact Finset.mem_insert.mpr (Or.inr (Finset.mem_erase.mpr ⟨hxj, hxF⟩)) + · rw [if_neg h] + exact hxF + +private lemma not_mem_shiftedSet_erased_of_movable {i j : ℕ} {F : Finset ℕ} + (hij : i < j) (hjF : j ∈ F) (hiF : i ∉ F) : + j ∉ shiftedSet i j F := by + unfold shiftedSet + rw [if_pos ⟨hjF, hiF⟩] + have hji : j ≠ i := Nat.ne_of_gt hij + simp [hji] + +private lemma mem_of_mem_shiftedSet_ne_inserted_of_movable {i j x : ℕ} {F : Finset ℕ} + (hjF : j ∈ F) (hiF : i ∉ F) + (hx : x ∈ shiftedSet i j F) (hxi : x ≠ i) : + x ∈ F := by + unfold shiftedSet at hx + rw [if_pos ⟨hjF, hiF⟩] at hx + rcases Finset.mem_insert.mp hx with hxi' | hxerase + · exact False.elim (hxi hxi') + · exact (Finset.mem_erase.mp hxerase).2 + +private lemma shiftedSet_ne_self_of_movable {i j : ℕ} {F : Finset ℕ} + (hjF : j ∈ F) (hiF : i ∉ F) : + shiftedSet i j F ≠ F := by + intro h + have hi_shift : i ∈ shiftedSet i j F := mem_shiftedSet_inserted_of_movable hjF hiF + have : i ∈ F := by simpa [h] using hi_shift + exact hiF this + +private lemma shiftedSet_inter_shiftedSet_nonempty_of_movable {i j : ℕ} {F G : Finset ℕ} + (hjF : j ∈ F) (hiF : i ∉ F) (hjG : j ∈ G) (hiG : i ∉ G) : + (shiftedSet i j F ∩ shiftedSet i j G).Nonempty := by + refine ⟨i, ?_⟩ + exact Finset.mem_inter.mpr + ⟨mem_shiftedSet_inserted_of_movable hjF hiF, + mem_shiftedSet_inserted_of_movable hjG hiG⟩ + +private lemma kept_inter_shiftedSet_nonempty_of_pairwise (i j : ℕ) (𝓕 : SetFamily) + (hij : i < j) (hinter : PairwiseIntersecting 𝓕) + {A G : Finset ℕ} + (hA : A ∈ 𝓕) + (hAkeep : j ∉ A ∨ i ∈ A ∨ shiftedSet i j A ∈ 𝓕) + (hG : G ∈ 𝓕) (hjG : j ∈ G) (hiG : i ∉ G) : + (A ∩ shiftedSet i j G).Nonempty := by + by_cases hiA : i ∈ A + · refine ⟨i, ?_⟩ + exact Finset.mem_inter.mpr + ⟨hiA, mem_shiftedSet_inserted_of_movable hjG hiG⟩ + by_cases hjA : j ∈ A + · have hshiftA : shiftedSet i j A ∈ 𝓕 := by + rcases hAkeep with hjnotA | hi_or_shift + · exact False.elim (hjnotA hjA) + · rcases hi_or_shift with hiA' | hshiftA + · exact False.elim (hiA hiA') + · exact hshiftA + have hshiftA_ne_G : shiftedSet i j A ≠ G := by + intro hEq + have hi_shiftA : i ∈ shiftedSet i j A := + mem_shiftedSet_inserted_of_movable hjA hiA + have : i ∈ G := by simpa [hEq] using hi_shiftA + exact hiG this + rcases hinter hshiftA hG hshiftA_ne_G with ⟨x, hx⟩ + have hxShiftA : x ∈ shiftedSet i j A := (Finset.mem_inter.mp hx).1 + have hxG : x ∈ G := (Finset.mem_inter.mp hx).2 + have hxi : x ≠ i := by + intro hxi' + exact hiG (by simpa [hxi'] using hxG) + have hxj : x ≠ j := by + intro hxj' + have : j ∈ shiftedSet i j A := by simpa [hxj'] using hxShiftA + exact not_mem_shiftedSet_erased_of_movable hij hjA hiA this + have hxA : x ∈ A := + mem_of_mem_shiftedSet_ne_inserted_of_movable hjA hiA hxShiftA hxi + refine ⟨x, ?_⟩ + exact Finset.mem_inter.mpr + ⟨hxA, mem_shiftedSet_of_mem_ne_erased hxG hxj⟩ + · have hAG_ne : A ≠ G := by + intro hEq + exact hjA (by simpa [hEq] using hjG) + rcases hinter hA hG hAG_ne with ⟨x, hx⟩ + have hxA : x ∈ A := (Finset.mem_inter.mp hx).1 + have hxG : x ∈ G := (Finset.mem_inter.mp hx).2 + have hxj : x ≠ j := by + intro hxj' + exact hjA (by simpa [hxj'] using hxA) + refine ⟨x, ?_⟩ + exact Finset.mem_inter.mpr + ⟨hxA, mem_shiftedSet_of_mem_ne_erased hxG hxj⟩ + +private lemma shiftOperation_pairwise_of_lt (i j : ℕ) (𝓕 : SetFamily) + (hij : i < j) (hinter : PairwiseIntersecting 𝓕) : + PairwiseIntersecting (shiftOperation i j 𝓕) := by + intro A B hA hB hAB + rcases shiftOperation_mem_cases i j 𝓕 hA with hAkeep | hAmove + · rcases shiftOperation_mem_cases i j 𝓕 hB with hBkeep | hBmove + · exact hinter hAkeep.1 hBkeep.1 hAB + · rcases hBmove with ⟨G, hG, hjG, hiG, hshiftG⟩ + simpa [hshiftG] using + kept_inter_shiftedSet_nonempty_of_pairwise i j 𝓕 hij hinter + hAkeep.1 hAkeep.2 hG hjG hiG + · rcases hAmove with ⟨F, hF, hjF, hiF, hshiftF⟩ + rcases shiftOperation_mem_cases i j 𝓕 hB with hBkeep | hBmove + · rcases kept_inter_shiftedSet_nonempty_of_pairwise i j 𝓕 hij hinter + hBkeep.1 hBkeep.2 hF hjF hiF with ⟨x, hx⟩ + refine ⟨x, ?_⟩ + have hxB : x ∈ B := (Finset.mem_inter.mp hx).1 + have hxShiftF : x ∈ shiftedSet i j F := (Finset.mem_inter.mp hx).2 + exact Finset.mem_inter.mpr ⟨by simpa [hshiftF] using hxShiftF, hxB⟩ + · rcases hBmove with ⟨G, hG, hjG, hiG, hshiftG⟩ + simpa [hshiftF, hshiftG] using + shiftedSet_inter_shiftedSet_nonempty_of_movable hjF hiF hjG hiG + +private lemma mem_shiftOperation_self_or_shifted_of_mem (i j : ℕ) {𝓕 : SetFamily} + {F : Finset ℕ} (hF : F ∈ 𝓕) : + F ∈ shiftOperation i j 𝓕 ∨ shiftedSet i j F ∈ shiftOperation i j 𝓕 := by + classical + unfold shiftOperation + by_cases hmove : j ∈ F ∧ i ∉ F + · by_cases hshift : shiftedSet i j F ∈ 𝓕 + · left + exact Finset.mem_union.mpr + (Or.inl (Finset.mem_filter.mpr ⟨hF, Or.inr (Or.inr hshift)⟩)) + · right + exact Finset.mem_union.mpr + (Or.inr (Finset.mem_image.mpr ⟨F, Finset.mem_filter.mpr ⟨hF, hmove⟩, rfl⟩)) + · left + have hkeep : j ∉ F ∨ i ∈ F ∨ shiftedSet i j F ∈ 𝓕 := by + by_cases hjF : j ∈ F + · right + left + by_contra hiF + exact hmove ⟨hjF, hiF⟩ + · exact Or.inl hjF + exact Finset.mem_union.mpr (Or.inl (Finset.mem_filter.mpr ⟨hF, hkeep⟩)) + +private lemma not_mem_shiftedSet_of_not_mem_ne_inserted {i j x : ℕ} {F : Finset ℕ} + (hxF : x ∉ F) (hxi : x ≠ i) : + x ∉ shiftedSet i j F := by + unfold shiftedSet + by_cases hmove : j ∈ F ∧ i ∉ F + · rw [if_pos hmove] + intro hx + rcases Finset.mem_insert.mp hx with hxi' | hxerase + · exact hxi hxi' + · exact hxF (Finset.mem_of_mem_erase hxerase) + · rw [if_neg hmove] + exact hxF + +private lemma shiftOperation_common_inserted_of_not_empty {i j : ℕ} {𝓕 : SetFamily} + (hempty : EmptyTotalIntersection 𝓕) + (hnot : ¬ EmptyTotalIntersection (shiftOperation i j 𝓕)) : + ∀ ⦃A : Finset ℕ⦄, A ∈ shiftOperation i j 𝓕 → i ∈ A := by + classical + unfold EmptyTotalIntersection at hempty hnot + push Not at hnot + rcases hnot with ⟨x, hxcommon⟩ + have hxi : x = i := by + rcases hempty x with ⟨F, hFmem, hxF⟩ + rcases mem_shiftOperation_self_or_shifted_of_mem i j (𝓕 := 𝓕) hFmem with hFshift | hshiftF + · exact False.elim (hxF (hxcommon F hFshift)) + · by_contra hne + exact not_mem_shiftedSet_of_not_mem_ne_inserted hxF hne (hxcommon (shiftedSet i j F) hshiftF) + intro A hA + simpa [hxi] using hxcommon A hA + +private lemma cover_and_opposite_side_of_common_shift {i j : ℕ} {𝓕 : SetFamily} + (hempty : EmptyTotalIntersection 𝓕) + {F : Finset ℕ} (hFmem : F ∈ 𝓕) (hjF : j ∈ F) (hiF : i ∉ F) + (hnot : ¬ EmptyTotalIntersection (shiftOperation i j 𝓕)) : + (∀ ⦃A : Finset ℕ⦄, A ∈ 𝓕 → i ∈ A ∨ j ∈ A) ∧ + (∃ A : Finset ℕ, A ∈ 𝓕 ∧ j ∈ A ∧ i ∉ A) ∧ + (∃ B : Finset ℕ, B ∈ 𝓕 ∧ i ∈ B ∧ j ∉ B) := by + classical + have hcommon := shiftOperation_common_inserted_of_not_empty (i := i) (j := j) + (𝓕 := 𝓕) hempty hnot + have hcover : ∀ ⦃A : Finset ℕ⦄, A ∈ 𝓕 → i ∈ A ∨ j ∈ A := by + intro A hA + by_cases hiA : i ∈ A + · exact Or.inl hiA + · by_cases hjA : j ∈ A + · exact Or.inr hjA + · exfalso + have hAshift : A ∈ shiftOperation i j 𝓕 := by + unfold shiftOperation + exact Finset.mem_union.mpr + (Or.inl (Finset.mem_filter.mpr ⟨hA, Or.inl hjA⟩)) + exact hiA (hcommon hAshift) + refine ⟨hcover, ⟨F, hFmem, hjF, hiF⟩, ?_⟩ + rcases hempty j with ⟨B, hBmem, hjB⟩ + rcases hcover hBmem with hiB | hjB' + · exact ⟨B, hBmem, hiB, hjB⟩ + · exact False.elim (hjB hjB') + +private lemma shiftedSet_mem_shiftOperation_of_mem_shiftOperation (i j : ℕ) {𝓕 : SetFamily} + {A : Finset ℕ} (hA : A ∈ shiftOperation i j 𝓕) : + shiftedSet i j A ∈ shiftOperation i j 𝓕 := by + rw [shiftOperation_eq_uvCompression] at hA ⊢ + rw [shiftedSet_eq_uvCompress] + exact UV.compress_mem_compression_of_mem_compression hA + +private lemma shiftOperation_idem (i j : ℕ) (𝓕 : SetFamily) : + shiftOperation i j (shiftOperation i j 𝓕) = shiftOperation i j 𝓕 := by + simp [shiftOperation_eq_uvCompression, UV.compression_idem] + +private lemma shiftOperation_empty_or_bad_shape {i j : ℕ} {𝓕 : SetFamily} + (hempty : EmptyTotalIntersection 𝓕) + {F : Finset ℕ} (hFmem : F ∈ 𝓕) (hjF : j ∈ F) (hiF : i ∉ F) : + EmptyTotalIntersection (shiftOperation i j 𝓕) ∨ + ((∀ ⦃A : Finset ℕ⦄, A ∈ 𝓕 → i ∈ A ∨ j ∈ A) ∧ + (∃ A : Finset ℕ, A ∈ 𝓕 ∧ j ∈ A ∧ i ∉ A) ∧ + (∃ B : Finset ℕ, B ∈ 𝓕 ∧ i ∈ B ∧ j ∉ B)) := by + by_cases h : EmptyTotalIntersection (shiftOperation i j 𝓕) + · exact Or.inl h + · exact Or.inr <| cover_and_opposite_side_of_common_shift (i := i) (j := j) + (𝓕 := 𝓕) hempty hFmem hjF hiF h + +private lemma opposite_side_sets_intersect_off_pair {i j : ℕ} {𝓕 : SetFamily} + (hinter : PairwiseIntersecting 𝓕) + {A B : Finset ℕ} (hA : A ∈ 𝓕) (_hjA : j ∈ A) (hiA : i ∉ A) + (hB : B ∈ 𝓕) (hiB : i ∈ B) (hjB : j ∉ B) : + ∃ x : ℕ, x ∈ A ∧ x ∈ B ∧ x ≠ i ∧ x ≠ j := by + have hAB : A ≠ B := by + intro hEq + exact hiA (by rw [hEq]; exact hiB) + rcases hinter hA hB hAB with ⟨x, hx⟩ + have hxA : x ∈ A := (Finset.mem_inter.mp hx).1 + have hxB : x ∈ B := (Finset.mem_inter.mp hx).2 + refine ⟨x, hxA, hxB, ?_, ?_⟩ + · intro hxi + exact hiA (by simpa [hxi] using hxA) + · intro hxj + exact hjB (by simpa [hxj] using hxB) + +/-- +Source lemma `lem:Frankl-Furedi`, lines 201--206. + +Source proof: apply shifts. If shifting terminates in a shifted family with +empty total intersection, done. Otherwise a last bad shift makes all sets +contain one element; relabel it and its partner to `1` and `2`, continue shifting +on labels at least `3`, add the `k`-sets containing `{1,2}` if necessary, and +use the boundary of `{1, ..., k+1}` as an empty-intersection subfamily preserved +by further shifts. + +Prover notes: prove or import separate facts for preservation of cardinality, +pairwise intersection, uniformity, and the empty-intersection fallback under +combinatorial shifts. A termination measure for repeated shifts will be needed. +-/ +lemma franklFurediShifted (n k : ℕ) (𝓕 : SetFamily) + (hk : 0 < k) (hF : UniformFamily n k 𝓕) + (hinter : PairwiseIntersecting 𝓕) (hempty : EmptyTotalIntersection 𝓕) : + ∃ 𝓕' : SetFamily, + UniformFamily n k 𝓕' ∧ PairwiseIntersecting 𝓕' ∧ + EmptyTotalIntersection 𝓕' ∧ ShiftedOn n 𝓕' ∧ 𝓕.card ≤ 𝓕'.card := by + classical + by_cases hshift : ShiftedOn n 𝓕 + · exact franklFurediShifted_of_shifted n k 𝓕 hF hinter hempty hshift + · -- TODO: formalize the non-shifted Frankl--Furedi shifting construction. + -- This branch needs repeated shifts, preservation lemmas, and the + -- empty-intersection boundary fallback described in the source proof. + rw [ShiftedOn] at hshift + push Not at hshift + rcases hshift with ⟨i, j, F, hi, hj, hij, hFmem, hjF, hiF, hbad⟩ + let 𝓖 : SetFamily := shiftOperation i j 𝓕 + have hGunif : UniformFamily n k 𝓖 := by + dsimp [𝓖] + exact shiftOperation_uniform n k i j 𝓕 hi hF + have hGinter : PairwiseIntersecting 𝓖 := by + dsimp [𝓖] + exact shiftOperation_pairwise_of_lt i j 𝓕 hij hinter + have hmove : shiftedSet i j F ∈ 𝓖 := by + dsimp [𝓖] + exact shiftedSet_mem_shiftOperation_of_movable i j 𝓕 hFmem hjF hiF + have hGcard : 𝓖.card = 𝓕.card := by + dsimp [𝓖] + exact shiftOperation_card i j 𝓕 + -- `hbad` is the first concrete bad shift: replacing `j` by `i` in `F` + -- leaves the current family. If this shift destroys empty total + -- intersection, the new helper below extracts the structural fallback data + -- used in the Frankl--Furedi proof. + have hbadShape : + ¬ EmptyTotalIntersection 𝓖 → + (∀ ⦃A : Finset ℕ⦄, A ∈ 𝓕 → i ∈ A ∨ j ∈ A) ∧ + (∃ A : Finset ℕ, A ∈ 𝓕 ∧ j ∈ A ∧ i ∉ A) ∧ + (∃ B : Finset ℕ, B ∈ 𝓕 ∧ i ∈ B ∧ j ∉ B) := by + intro hnot + dsimp [𝓖] at hnot + exact cover_and_opposite_side_of_common_shift (i := i) (j := j) (𝓕 := 𝓕) + hempty hFmem hjF hiF hnot + -- The remaining proof must either iterate good shifts preserving + -- `EmptyTotalIntersection`, or invoke the full Frankl--Furedi + -- relabel-and-boundary fallback starting from `hbadShape`. + sorry + +/-- +Source lemma `line-328`, lines 328--334; proof in lines 336--363. + +Source proof: perform shifts while preserving the stronger property that every +one-set deletion leaves empty total intersection. If a shift would destroy this +property, stop just before it, relabel to obtain sets with `1` not `2`, with `2` +not `1`, and with both; compare with the standard family built from +`{2, ..., k+1}` and `{2, ..., k, k+2}`. After restricted shifts on labels at +least `3`, either replace by the standard family or use the two preserved +boundary subfamilies to continue shifting until stable. + +Prover notes: this is stronger than `franklFurediShifted`; expect helper lemmas +for the standard family, the two boundary subfamilies, and preservation of the +deletion-empty invariant under restricted shifts. The bare existential output +does not by itself reflect uniqueness of the original extremal family; the final +theorem uses bridge lemmas for that step. +-/ +lemma strongShiftedReduction (n k : ℕ) (𝓕 : SetFamily) + (hk : 0 < k) (hF : UniformFamily n k 𝓕) + (hinter : PairwiseIntersecting 𝓕) + (hdelete : DeletionEmptyTotalIntersection 𝓕) : + ∃ 𝓕' : SetFamily, + UniformFamily n k 𝓕' ∧ PairwiseIntersecting 𝓕' ∧ + DeletionEmptyTotalIntersection 𝓕' ∧ ShiftedOn n 𝓕' ∧ 𝓕.card ≤ 𝓕'.card := by + by_cases hshift : ShiftedOn n 𝓕 + · exact ⟨𝓕, hF, hinter, hdelete, hshift, le_rfl⟩ + · -- TODO: formalize the strengthened shifting construction from the source proof. + -- The proof must preserve `DeletionEmptyTotalIntersection` through restricted + -- shifts and the standard-family replacement step. + sorry + +end AShortProofOfTheHiltonMilnerTheorem diff --git a/AShortProofOfTheHiltonMilnerTheorem/EPFLemmaPrint.lean b/AShortProofOfTheHiltonMilnerTheorem/EPFLemmaPrint.lean new file mode 100644 index 0000000..3c811b1 --- /dev/null +++ b/AShortProofOfTheHiltonMilnerTheorem/EPFLemmaPrint.lean @@ -0,0 +1,8 @@ +import AShortProofOfTheHiltonMilnerTheorem.Basic + +#print AShortProofOfTheHiltonMilnerTheorem.ground +#print AShortProofOfTheHiltonMilnerTheorem.shiftedSet +#print AShortProofOfTheHiltonMilnerTheorem.hiltonMilnerFamily +#print AShortProofOfTheHiltonMilnerTheorem.IsHiltonMilnerFamily +#print AShortProofOfTheHiltonMilnerTheorem.EmptyTotalIntersection +#print AShortProofOfTheHiltonMilnerTheorem.DeletionEmptyTotalIntersection diff --git a/AShortProofOfTheHiltonMilnerTheorem/README.md b/AShortProofOfTheHiltonMilnerTheorem/README.md new file mode 100644 index 0000000..e6ef6d5 --- /dev/null +++ b/AShortProofOfTheHiltonMilnerTheorem/README.md @@ -0,0 +1,29 @@ +# A Short Proof of the Hilton-Milner Theorem + +Lean 4 source-backed formalization setup for Denys Bulavka and Russ Woodroofe, +*A short proof of the Hilton-Milner Theorem*. + +The active formalization is in: + +- `AShortProofOfTheHiltonMilnerTheorem/` +- `AShortProofOfTheHiltonMilnerTheorem.lean` + +The Lean declarations are split by proof role: + +- `Basic.lean`: finite-family, uniformity, intersection, shifting, and extremal-family definitions. +- `MainTechnical.lean`: the main technical inequality and shifted/strict variants. +- `Shifting.lean`: Frankl--Furedi and strengthened shifting reductions. +- `HiltonMilner.lean`: the HM bound, uniqueness statement, and equality-case bridge lemmas. + +## Status + +- `lake build AShortProofOfTheHiltonMilnerTheorem` succeeds. +- Current version is a source-backed theorem skeleton with `sorry` proof obligations. +- The formalization focuses on finite set families, cross-intersection, shadows, shifting, + the Hilton-Milner bound, and the uniqueness bridge described in the source. + +See: + +- `AShortProofOfTheHiltonMilnerTheorem/Blueprint.md` +- `docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex` +- `docs/bulavka_woodroofe2024_hilton_milner.pdf` diff --git a/AShortProofOfTheHiltonMilnerTheorem/docs/2411.02513.source b/AShortProofOfTheHiltonMilnerTheorem/docs/2411.02513.source new file mode 100644 index 0000000000000000000000000000000000000000..041214761c43ab6365c8bac7c13042998dc83014 GIT binary patch literal 14764 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�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 ayB|8%wm&b$fh;@(8cD*+DkgWA k ≥ 4. Here, we strengthen the hypothesis of Theorem 2 to require B to have at +least two elements. We discuss the details in the following section. +Uniqueness of the Hilton-Milner family. As mentioned in the discussion, the same +techniques give uniqueness of the maximum family in Theorem 1. We prove: +Theorem 5. In the situation of Theorem 1, if 4 ≤ k < n/2 and |F | achieves the upper +bound, then there is some k-set B and i ∈ / B so that F consists of B together with all +k-sets that both contain i and intersect B. + We require k ≥ 4 in order to avoid some technicalities. In particular, there is another +family achieving the bound for k = 3. See [10] for more details and a different argument. + As in the proof of Theorem 1, we reduce to a shifted family, and prove for a shifted +family. + The proof for a shifted family requires a completely straightforward modification of +Theorem 2. We obviously require k ≥ 4. We also strengthen the hypothesis to require +|B| ≥ 2, replacing the condition that |B| ≥ 1; with the strengthened hypothesis, the +inequality is strict. Then in the proof, we may have |B(n)| empty or nonempty. If +empty, then since B has at least two elements, so A(n) is strictly smaller than the given +bound. If nonempty, then the bound in (2) is already strict so long as k ≥ 4. In either +case, the induction step yields a strict inequality. + Theorem 5 follows for shifted families by applying the variant of Theorem 2 with +|B| ≥ 2 to the same families as in the proof of Theorem 1. + It remains only to reduce to shifted families. This reduction requires a bit of care. +We did not find the following lemma in the literature, although we believe it to be +known to experts in the field. +Lemma 6. Let F be a family of pairwise-intersecting k-element subsets of [n] with the +additional property that for any F0 ∈ F , the intersection F\{F0 } F is empty. Then + T + +there is a shifted family F ′ satisfying the same properties and with |F ′| ≥ |F |. +Proof. By the standard family, we mean the shifted family with A = {2, . . . , k + 1}, +A′ = {2, . . . , k, k + 2}, and all k-element sets that both contain 1 and intersect A and +A′ . It is obvious that the standard family is at least as large as any family where all +but two sets contain 1. + Given F , we perform a sequence of shifts. If these terminate in a shifted family with +the desired properties, then we are done. Otherwise, an operation results in a family +without the additional property. Stopping just before this operation and relabeling +elements, we have a family containing sets with 1 and not 2, with 2 and not 1, with +both 1 and 2, and possibly the set B = {3, . . . , k + 2}. + We may assume without loss of generality that we have all sets containing both 1, 2 +and intersecting with B. Since these sets do not have any common intersection other +than 1, 2, the operations Shifti←j over all 3 ≤ i < j preserve the additional property. + After shifting over 3 ≤ i < j, if we have only one set with 1 and not 2, or only one +set with 2 and not 1, then we replace with the standard family. Otherwise, we have +in the family {a, 3, . . . , k + 1} and {a, 3, . . . , k, k + 2} for a = 1, 2, along with all sets + A SHORT PROOF OF THE HILTON-MILNER THEOREM 5 + +containing {1, 2} and intersecting B. In particular, the family contains as subfamilies +both ∂ {1, . . . , k + 1} and ∂ {1, . . . , k, k + 2}. Both subfamilies have empty intersection +and are preserved under all shift operations, so we can now shift until the system +stabilizes.  +Acknowledgements. We particularly thank Dániel Gerbner for several helpful com- +ments about preprints of the paper. We also thank Peter Frankl, Balázs Patkós, John +Shareshian, and Tamás Szőnyi. + References + [1] Peter Frankl, The shifting technique in extremal set theory, Surveys in combinatorics 1987 (New + Cross, 1987), London Math. Soc. Lecture Note Ser., vol. 123, Cambridge Univ. Press, Cambridge, + 1987, pp. 81–110. + [2] , Shadows and shifting, Graphs Combin. 7 (1991), no. 1, 23–29. + [3] , New inequalities for cross-intersecting families, Mosc. J. Comb. Number Theory 6 (2016), + no. 4, 27–32. + [4] , A simple proof of the Hilton-Milner theorem, Mosc. J. Comb. Number Theory 8 (2019), + no. 2, 97–101. + [5] Peter Frankl and Zoltán Füredi, Nontrivial intersecting families, J. Combin. Theory Ser. A 41 + (1986), no. 1, 150–153. + [6] Peter Frankl and Norihide Tokushige, Some best possible inequalities concerning cross-intersecting + families, J. Combin. Theory Ser. A 61 (1992), no. 1, 87–97. + [7] Dániel Gerbner and Balázs Patkós, Extremal finite set theory, Discrete Mathematics and its Ap- + plications (Boca Raton), CRC Press, Boca Raton, FL, 2019. + [8] Jürgen Herzog and Takayuki Hibi, Monomial ideals, Graduate Texts in Mathematics, vol. 260, + Springer-Verlag London Ltd., London, 2011. + [9] A. J. W. Hilton and E. C. Milner, Some intersection theorems for systems of finite sets, Quart. + J. Math. Oxford Ser. (2) 18 (1967), 369–384. +[10] Glenn Hurlbert and Vikram Kamat, New injective proofs of the Erdős-Ko-Rado and Hilton-Milner + theorems, Discrete Math. 341 (2018), no. 6, 1749–1754, arXiv:1609.04714. +[11] Gil Kalai, Algebraic shifting, Computational commutative algebra and combinatorics (Osaka, + 1999), Adv. Stud. Pure Math., vol. 33, Math. Soc. Japan, Tokyo, 2002, pp. 121–163. +[12] Yongjiang Wu, Yongtao Li, Lihua Feng, Jiuqiang Liu, and Guihai Yu, Maximal intersecting + families revisited, Discrete Math. 349 (2026), no. 1, Paper No. 114654, 18, arXiv:2411.03674. + + Einstein Institute of Mathematics, Hebrew University, Jerusalem 91904, Israel + Current address: Department of Mathematics & Statistics, Dalhousie University, 6297 Castine Way, +PO BOX 15000, Halifax, NS, Canada, B3H 4R2 + Email address: denys.bulavka@dal.ca + URL: https://kam.mff.cuni.cz/∼dbulavka/ + + Univerza na Primorskem, Glagoljaška 8, 6000 Koper, Slovenia + Email address: russ.woodroofe@famnit.upr.si + URL: https://osebje.famnit.upr.si/∼russ.woodroofe/ + \ No newline at end of file diff --git a/AShortProofOfTheHiltonMilnerTheorem/docs/source/00README.json b/AShortProofOfTheHiltonMilnerTheorem/docs/source/00README.json new file mode 100644 index 0000000..501ebec --- /dev/null +++ b/AShortProofOfTheHiltonMilnerTheorem/docs/source/00README.json @@ -0,0 +1,17 @@ +{ + "sources" : [ + { + "usage" : "toplevel", + "filename" : "A_short_proof_of_the_Hilton-Milner_theorem.tex" + }, + { + "usage" : "ignore", + "filename" : "8_Users_russw_Documents_Research_mypapers_A_short_proof_of_the_Hilton-Milner_theorem_hamsplain.bst" + } + ], + "spec_version" : 1, + "texlive_version" : "2025", + "process" : { + "compiler" : "latex" + } +} diff --git a/AShortProofOfTheHiltonMilnerTheorem/docs/source/8_Users_russw_Documents_Research_mypapers_A_short_proof_of_the_Hilton-Milner_theorem_hamsplain.bst b/AShortProofOfTheHiltonMilnerTheorem/docs/source/8_Users_russw_Documents_Research_mypapers_A_short_proof_of_the_Hilton-Milner_theorem_hamsplain.bst new file mode 100644 index 0000000..4a6c776 --- /dev/null +++ b/AShortProofOfTheHiltonMilnerTheorem/docs/source/8_Users_russw_Documents_Research_mypapers_A_short_proof_of_the_Hilton-Milner_theorem_hamsplain.bst @@ -0,0 +1,1285 @@ +%%% ==================================================================== +%%% @BibTeX-style-file{ +%%% author = "American Mathematical Society", +%%% version = "1.2beta", +%%% date = "13-Oct-1994", +%%% time = "15:30:52 EDT", +%%% filename = "hamsplain.bst", +%%% copyright = "Copyright (C) 1994 American Mathematical Society, +%%% all rights reserved. Copying of this file is +%%% authorized only if either: +%%% (1) you make absolutely no changes to your copy, +%%% including name; OR +%%% (2) if you do make changes, you first rename it +%%% to some other name. +%%% [Name changed to hamsplain.bst]", +%%% address = "American Mathematical Society, +%%% Technical Support, +%%% Electronic Products and Services, +%%% P. O. Box 6248, +%%% Providence, RI 02940, +%%% USA", +%%% telephone = "401-455-4080 or (in the USA and Canada) +%%% 800-321-4AMS (321-4267)", +%%% FAX = "401-331-3842", +%%% email = "tech-support@math.ams.org (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "bibtex, bibliography, amslatex, ams-latex", +%%% supported = "yes?", +%%% abstract = "BibTeX bibliography style `hamsplain' for BibTeX +%%% versions 0.99a or later and LaTeX version 2e. +%%% Produces alphabetic-label bibliography items in +%%% a form typical for American Mathematical Society +%%% publications. Modified by Greg Kuperberg to +%%% include an eprint field for e-print archives." +%%% } +%%% ==================================================================== + +% See the file btxbst.doc for extra documentation other than +% what is included here. And see btxhak.tex for a description +% of the BibTeX language and how to use it. + +% This defines the types of fields that can occur in a database entry +% for this particular bibliography style. Except for `language', +% this is the standard list from plain.bst. + +%% Types of entries currently allowed in a BibTeX file: +%% +%% ARTICLE -- An article from a journal or magazine. +%% +%% BOOK -- A book with an explicit publisher. +%% +%% BOOKLET -- A work that is printed and bound, +%% but without a named publisher or sponsoring institution. +%% +%% CONFERENCE -- The same as INPROCEEDINGS, +%% included for Scribe compatibility. +%% +%% INBOOK -- A part of a book, +%% which may be a chapter (or section or whatever) and/or a range of pages. +%% +%% INCOLLECTION -- A part of a book having its own title. +%% +%% INPROCEEDINGS -- An article in a conference proceedings. +%% +%% MANUAL -- Technical documentation. +%% +%% MASTERSTHESIS -- A Master's thesis. +%% +%% MISC -- Use this type when nothing else fits. +%% +%% PHDTHESIS -- A PhD thesis. +%% +%% PROCEEDINGS -- The proceedings of a conference. +%% +%% TECHREPORT -- A report published by a school or other institution, +%% usually numbered within a series. +%% +%% UNPUBLISHED -- A document having an author and title, but not formally +%% published. +ENTRY + { address + author + booktitle + chapter + doi + edition + editor + eprint + howpublished + institution + journal + key + language + month + note + number + organization + pages + publisher + school + series + title + type + url + volume + year + } + {} + { label extra.label } + +% Removed after.sentence, after.block---not needed. + +INTEGERS { output.state before.all mid.sentence } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := +} + +% Scratch variables: + +STRINGS { s t } + +% Utility functions + +FUNCTION {shows} +{ duplicate$ ":::: `" swap$ * "'" * top$ +} + +FUNCTION {showstack} +{"STACK=====================================================================" +top$ +stack$ +"ENDSTACK==================================================================" +top$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} + +% n.dashify is used to make sure page ranges get the TeX code +% (two hyphens) for en-dashes. + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +% tie.or.space.connect connects two items with a ~ if the +% second item is less than 3 letters long, otherwise it just puts an +% ordinary space. + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {add.space.if.necessary} +{ duplicate$ "" = + 'skip$ + { " " * } + if$ +} + +% either.or.check gives a warning if two mutually exclusive fields +% were used in the database. + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +% output.nonnull is called by output. + +FUNCTION {output.nonnull} +% remove the top item from the stack because it's in the way. +{ 's := + output.state mid.sentence = +% If we're in mid-sentence, add a comma to the new top item and write it + { ", " * write$ } +% Otherwise, if we're at the beginning of a bibitem, + { output.state before.all = +% just write out the top item from the stack; + 'write$ +% and the last alternative is that we're at the end of the current +% bibitem, so we add a period to the top stack item and write it out. + { add.period$ " " * write$ } + if$ + mid.sentence 'output.state := + } + if$ +% Put the top item back on the stack that we removed earlier. + s +} + +% Output checks to see if the stack top is empty; if not, it +% calls output.nonnull to write it out. + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +% Standard warning message for a missing or empty field. For the user +% we call any such field `missing' without respect to the distinction +% made by BibTeX between missing and empty. + +FUNCTION {missing.warning} +{ "missing " swap$ * " in " * cite$ * warning$ } + +% Output.check is like output except that it gives a warning on-screen +% if the given field in the database entry is empty. t is the field +% name. + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ t missing.warning } + 'output.nonnull + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ +% This empty string is the first thing that will be written +% the next time write$ is called. Done this way because each +% item is saved on the stack until we find out what punctuation +% should be added after it. Therefore we need an empty first item. + "" + before.all 'output.state := +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +% Removed new.block, new.block.checka, new.block.checkb, new.sentence, +% new.sentence.checka, and new.sentence.checkb functions here, since they +% don't seem to be needed in the AMS style. Also moved some real +% basic functions like `and' and 'or' earlier in the file. + +INTEGERS { nameptr namesleft numnames } + +% The extra section to write out a language field was added +% for AMSPLAIN.BST. Not present in plain.bst. + +FUNCTION {format.language} +{ language empty$ + { "" } + { " (" language * ")" * } + if$ +} + +% This version of format.names puts names in the format +% +% First von Last, Jr. +% +% (i.e., first name first, no abbreviating to initials). + +FUNCTION {format.names} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " et~al." * } + { " and " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { extra.label "\bysame" = + {"\bysame"} + { author format.names } + if$ + } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { " (eds.)" * } + { " (ed.)" * } + if$ + } + if$ +} + +FUNCTION {format.nonauthor.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { ", eds." * } + { ", ed." * } + if$ + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title "t" change.case$ emphasize } + if$ +} + +% Function modified to wrap the eprint number in an mbox construction - GJK + +FUNCTION {format.eprint} +{ eprint empty$ + { "" } + %{ "\mbox{" eprint * "}" * } + { "{" eprint * "}" * } + if$ +} + +FUNCTION {format.doi} +{ doi empty$ + { "" } + %{ "\mbox{" doi * "}" * } + { "{" doi * "}" * } + if$ +} + +FUNCTION {format.journal.vol.year} +{ journal empty$ + { "journal name" missing.warning ""} + { journal } + if$ + volume empty$ + 'skip$ + { " \textbf{" * volume * "}" * } + if$ + year empty$ + { "year" missing.warning } + { " (" * year * ")" * } + if$ +} + +% For formatting the issue number for a journal article. + +FUNCTION {format.number} +{ number empty$ + { "" } + { "no.~" number * } + if$ +} + +% For formatting miscellaneous dates + +FUNCTION {format.date} +{ year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + month + } + if$ + } + { month empty$ + 'year + { month " " * year * } + if$ + } + if$ +} + +%% The volume, series and number information is sort of tricky. +%% This code handles it as follows: +%% If the series is present, and the volume, but not the number, +%% then we do "\emph{Book title}, Series Name, vol. 000" +%% If the series is present, and the number, but not the volume, +%% then we do "\emph{Book title}, Series Name, no. 000" +%% If the series is present, and both number and volume, +%% then we do "\emph{Book title}, vol. XX, Series Name, no. 000" +%% Finally, if the series is absent, +%% then we do "\emph{Book title}, vol. XX" +%% or "\emph{Book title}, no. 000" +%% and if both volume and number are present, give a warning message. + +FUNCTION {format.bookvolume.series.number} +{ volume empty$ + { "" % Push the empty string as a placeholder in case everything else + % is empty too. + series empty$ + 'skip$ + { pop$ series } % if series is not empty put in stack + if$ + number empty$ + 'skip$ + { duplicate$ empty$ % if no preceding material, + 'skip$ % do nothing, otherwise + { ", " * } % add a comma and space to separate. + if$ + "no." number tie.or.space.connect * % add the number information + } + if$ + } +%% If the volume is NOT EMPTY: + { "vol." volume tie.or.space.connect % vol. XX + number empty$ + { series empty$ + 'skip$ + { series ", " * swap$ *} % Series Name, vol. XX + if$ + } + { series empty$ + { "can't use both volume and number if series info is missing" + warning$ + "in BibTeX entry type `" type$ * "'" * top$ + } + { ", " * series * ", no." * number tie.or.space.connect } + if$ + } + if$ + } + if$ + +} % end of format.bookvolume.series.number + +%% format.inproc.title.where.editors is used by inproceedings entry types + +FUNCTION {format.inproc.title.address.editors} +{ booktitle empty$ + { "" } +%% No case changing or emphasizing for the title. We want initial +%% caps, roman. + { booktitle } + if$ +%% We add parentheses around the address (place where conference +%% was held). + address empty$ + 'skip$ + { add.space.if.necessary "(" * address * ")" * } + if$ +%% Likewise we add parentheses around the editors' names. + editor empty$ + 'skip$ + { add.space.if.necessary "(" * format.nonauthor.editors * ")" * } + if$ +} + +%% format.incoll.title.editors is similar to format.inproc... but +%% omits the address. For collections that are not proceedings volumes. + +FUNCTION {format.incoll.title.editors} +{ booktitle empty$ + { "" } +%% No case changing or emphasizing for the title. We want initial +%% caps, roman. + { booktitle } + if$ +%% We add parentheses around the editors' names. + editor empty$ + 'skip$ + { add.space.if.necessary "(" * format.nonauthor.editors * ")" * } + if$ +} + +% Desired output for format.number.series: +% +% Lecture Notes in Math., no.~1224 + +FUNCTION {format.number.series} +{ series empty$ + { number empty$ + { "" } + { "there's a number but no series in " cite$ * warning$ } + if$ + } + { series + number empty$ + 'skip$ + { ", no.~" * number * } + if$ + } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ " ed." * } + { edition "t" change.case$ " ed." * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages n.dashify } + if$ +} + +FUNCTION {format.book.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { "pp.~" pages n.dashify * } + { "p.~" pages * } + if$ + } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { "ch.~" } + { type "l" change.case$ " " * } + if$ + chapter * + pages empty$ + 'skip$ + { ", " * format.book.pages * } + if$ + } + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Tech. Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +% The format.crossref functions haven't been paid much attention +% at the present time (June 1990) and could probably use some +% work. MJD + +FUNCTION {format.article.crossref} +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { "In " journal * } + if$ + } + { "In " key * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + editor num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al." * } + { " and " * editor #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + "In " + } + { "Vol." volume tie.or.space.connect + " of " * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { series * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { "In \emph{" booktitle * "}" * } + if$ + } + { "In " key * } + if$ + } + { "In " format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% The main functions for each entry type. + +% journal, vol and year are formatted together because they are +% not separated by commas. + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + format.title "title" output.check + crossref missing$ + { format.journal.vol.year output + format.number output + format.pages "pages" output.check + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + format.language * + format.eprint output +% format.doi output + note output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.title "title" output.check + format.edition output + crossref missing$ + { format.bookvolume.series.number output + publisher "publisher" output.check + address output + } + { format.book.crossref output.nonnull + } + if$ + format.date "year" output.check + format.language * + format.eprint output +% format.doi output + note output + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + format.title "title" output.check + howpublished output + address output + format.date output + format.eprint output +% format.doi output + note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + title "title" output.check + crossref missing$ + { format.bookvolume.series.number output + format.chapter.pages "chapter and pages" output.check + format.number.series output + publisher "publisher" output.check + address output + } + { format.chapter.pages "chapter and pages" output.check + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check + format.book.pages output + format.language * + format.eprint output +% format.doi output + note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + format.title "title" output.check + crossref missing$ + { format.incoll.title.editors "booktitle" output.check + format.bookvolume.series.number output + publisher "publisher" output.check + address output + format.edition output + format.date "year" output.check + } + { format.incoll.inproc.crossref output.nonnull + } + if$ + format.eprint output +% format.doi output + note output + format.book.pages output + format.language * + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + format.title "title" output.check + crossref missing$ + { format.inproc.title.address.editors "booktitle" output.check + format.bookvolume.series.number output + organization output + publisher output + format.date "year" output.check + } + { format.incoll.inproc.crossref output.nonnull + } + if$ + format.eprint output +% format.doi output + note output + format.book.pages output + format.language * + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization empty$ + 'skip$ + { organization output.nonnull + address output + } + if$ + } + { format.authors output.nonnull } + if$ + format.title "title" output.check + author empty$ + { organization empty$ + { address output } + 'skip$ + if$ + } + { organization output + address output + } + if$ + format.edition output + format.date output + format.eprint output +% format.doi output + note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + format.title "title" output.check + "Master's thesis" format.thesis.type output.nonnull + school "school" output.check + address output + format.date "year" output.check + format.eprint output +% format.doi output + note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + format.title output + howpublished output + format.date output + format.eprint output +% format.doi output + note output + format.book.pages output + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + format.title "title" output.check + "Ph.D. thesis" format.thesis.type output.nonnull + school "school" output.check + address output + format.date "year" output.check + format.eprint output +% format.doi output + note output + format.book.pages output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization output } + { format.editors output.nonnull } + if$ + format.title "title" output.check + format.bookvolume.series.number output + address empty$ + { editor empty$ + 'skip$ + { organization output } + if$ + publisher output + format.date "year" output.check + } + { address output.nonnull + editor empty$ + 'skip$ + { organization output } + if$ + publisher output + format.date "year" output.check + } + if$ + format.eprint output +% format.doi output + note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + format.title "title" output.check + format.tr.number output.nonnull + institution "institution" output.check + address output + format.date "year" output.check + format.eprint output +% format.doi output + note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + format.title "title" output.check + note "note" output.check + format.date output + format.eprint output +% format.doi output + fin.entry +} + +FUNCTION {default.type} { misc } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +READ + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = t "others" = and + { "et al" * } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +SORT + +STRINGS { longest.label prev.author this.author } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := + "abcxyz" 'prev.author := + "" 'this.author := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ + author empty$ + { editor empty$ + { "" } + 'editor + if$ + } + 'author + if$ + 'this.author := + this.author prev.author = + { "\bysame" 'extra.label := } + { "" 'extra.label := + this.author "" = + { "abcxyz" } + 'this.author + if$ + 'prev.author := + } + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\providecommand{\bysame}{\leavevmode\hbox to3em{\hrulefill}\thinspace}" + write$ newline$ + "\providecommand{\href}[2]{#2}" + write$ newline$ + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} diff --git a/AShortProofOfTheHiltonMilnerTheorem/docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex b/AShortProofOfTheHiltonMilnerTheorem/docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex new file mode 100644 index 0000000..031bfe0 --- /dev/null +++ b/AShortProofOfTheHiltonMilnerTheorem/docs/source/A_short_proof_of_the_Hilton-Milner_theorem.tex @@ -0,0 +1,374 @@ +\batchmode +\makeatletter +\def\input@path{{"/Users/russw/Documents/Research/mypapers/A short proof of the Hilton-Milner theorem/"}} +\makeatother +\documentclass[12pt,oneside,english,lowtilde]{amsart} +\usepackage[T1]{fontenc} +\usepackage[latin9]{inputenc} +\usepackage{babel} +\usepackage{url} +\usepackage{amstext} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{geometry} +\geometry{verbose,tmargin=3cm,bmargin=3cm,lmargin=3cm,rmargin=3cm} +\usepackage[dvips,pdfusetitle, + bookmarks=true,bookmarksnumbered=false,bookmarksopen=false, + breaklinks=false,pdfborder={0 0 1},backref=false,colorlinks=false] + {hyperref} +\usepackage{breakurl} + +\makeatletter +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands. +\newlength{\lyxlabelwidth} % auxiliary length +\theoremstyle{plain} +\newtheorem{thm}{\protect\theoremname} +\theoremstyle{plain} +\newtheorem{lem}[thm]{\protect\lemmaname} +\theoremstyle{remark} +\newtheorem{rem}[thm]{\protect\remarkname} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. +%% Latin modern fonts should prevent arXiv fuzziness +\usepackage{lmodern} + +%% minimize spacing around wrap-figs +\setlength\intextsep{.5em} + +\makeatother + +\providecommand{\lemmaname}{Lemma} +\providecommand{\remarkname}{Remark} +\providecommand{\theoremname}{Theorem} + +\begin{document} +\global\long\def\link{\operatorname{link}}% + +\global\long\def\del{\operatorname{del}}% + +\global\long\def\cone{\operatorname{Cone}}% + +\global\long\def\depth{\operatorname{depth}}% + +\global\long\def\shift{\operatorname{Shift}}% + +\global\long\def\symdiff{\ominus}% + +\global\long\def\shiftext{\shift^{\wedge}}% + +\global\long\def\extalg{\bigwedge}% + +\global\long\def\ff{\mathbb{F}}% + +\global\long\def\bdry{\partial}% + +% Default proof to no "Proof." at start +\renewcommand{\proofname}{\hskip-\labelsep\spacefactor3000 } +\title{A short proof of the Hilton-Milner Theorem} +\author{Denys Bulavka and Russ Woodroofe} +\thanks{Work of the first author is partially supported by the Israel Science +Foundation grant ISF-2480/20 and the AARMS postdoctoral fellowship. +Work of the second author is supported in part by the Slovenian Research +Agency (research program P1-0285 and research projects J1-9108, J1-2451, +J1-3003, and J1-50000).} +\address{Einstein Institute of Mathematics, Hebrew University, Jerusalem 91904, +Israel} +\curraddr{Department of Mathematics \& Statistics, Dalhousie University, 6297 +Castine Way, PO BOX 15000, Halifax, NS, Canada, B3H 4R2} +\email{denys.bulavka@dal.ca} +\urladdr{\url{https://kam.mff.cuni.cz/~dbulavka/}} +\address{Univerza na Primorskem, Glagoljaka 8, 6000 Koper, Slovenia} +\email{russ.woodroofe@famnit.upr.si} +\urladdr{\url{https://osebje.famnit.upr.si/~russ.woodroofe/}} +\begin{abstract} +We give a short and relatively elementary proof of the Hilton-Milner +Theorem. +\end{abstract} + +\maketitle +The Hilton-Milner Theorem gives the maximum size of a uniform pairwise-intersecting +family of sets that do not share a common element. +\begin{thm}[Hilton and Milner 1967 \cite{Hilton/Milner:1967}] +\label{thm:HM}Let $k\leq n/2$. If $\mathcal{F}$ is a family of +pairwise-intersecting $k$-element subsets of $[n]$, where $\bigcap_{F\in\mathcal{F}}F=\emptyset$, +then $\left|\mathcal{F}\right|\leq{n-1 \choose k-1}-{n-1-k \choose k-1}+1$. +\end{thm} + +In the current article, we will show Theorem~\ref{thm:HM} to follow +quickly from the following theorem, which we believe to be of some +independent interest. Two set systems $\mathcal{A}$ and $\mathcal{B}$ +are \emph{cross-intersecting} if for every $A\in\mathcal{A},B\in\mathcal{B}$, +the intersection $A\cap B$ is nonempty. The \emph{shadow} $\bdry B$ +of a $k$-element set $B$ consists of all the $(k-1)$-element subsets +of $B$; the shadow of a uniform set family is the union of the shadows +of its constituent sets, thus consists of all $(k-1)$-element subsets +of constituent sets. +\begin{thm} +\label{thm:MainTechnical}Let $2k-1\leq n$, let $\mathcal{A}$ be +a family of $(k-1)$-element subsets of $[n]$, and let $\mathcal{B}$ +be a family of $k$-element subsets of $[n]$. If $\mathcal{A},\mathcal{B}$ +are cross-intersecting, $\mathcal{B}$ is nonempty, and $\bdry\mathcal{B}\subseteq\mathcal{A}$, +then +\[ +\left|\mathcal{A}\right|+\left|\mathcal{B}\right|\leq{n \choose k-1}-{n-k \choose k-1}+1. +\] +\end{thm} + +Note that the bound of Theorem~\ref{thm:HM} is attained with a single +$k$-element set $B$ that does not contain $1$, together with all +the $k$-element sets that contain $1$ and intersect $B$; the bound +of Theorem~\ref{thm:MainTechnical} is attained with a single $k$-element +set and all $(k-1)$-element sets that intersect it. + +Our proof of Theorem~\ref{thm:HM} may be viewed as injective. Other +recent proofs of Theorem~\ref{thm:HM} were given in \cite{Frankl:2019,Hurlbert/Kamat:2018}, +but instead of relying on a simple cross-intersecting type theorem, +both of these proofs rely on a certain ``partial complement'' operation. +In somewhat older work \cite{Frankl/Tokushige:1992} (see also \cite{Frankl:2016}), +Frankl and Tokushige gave a proof of Hilton-Milner from a different +cross-intersection theorem, but the proof is less elementary than +that of Theorem~\ref{thm:MainTechnical}, requiring the Schtzenberger-Kruskal-Katona +Theorem. A recent preprint of Wu, Li, Feng, Liu and Yu \cite{Wu/Li/Feng/Liu/Yu:2026} +(now published) gives a proof based on still another cross-intersecting +theorem, but the existing proofs of this underlying result also seem +to be somewhat more difficult than our approach. + +\subsection*{Shifting} + +We recall that a system $\mathcal{F}$ of subsets of $[n]$ is \emph{shifted} +if for each $ik\geq4$. Here, we strengthen the hypothesis of Theorem~\ref{thm:MainTechnical} +to require $\mathcal{B}$ to have at least two elements. We discuss +the details in the following section. + +\subsection*{Uniqueness of the Hilton-Milner family} + +As mentioned in the discussion, the same techniques give uniqueness +of the maximum family in Theorem~\ref{thm:HM}. We prove: +\begin{thm} +\label{thm:StrictHM}In the situation of Theorem~\ref{thm:HM}, if +$4\leq k