Repository navigation
Import the Erdős–Sós conjecture proof (Erdős Problem 548) - #452
Conversation
Port of tadamcz/erdos548 (commit c02708a6, Apache-2.0) from Lean v4.28.0 to the pool's v4.34.0: the GPT-6 Astra proof of Erdős problem #548, the Erdős–Sós conjecture, with the benchmark statement reviewed by Thomas Bloom. Porting changes: `Std.Symm`/`Std.Irrefl` structure fields, the new `isBridge_iff` shape, deprecated `if_pos`/`dif_pos`/`IsTree.*`/`push_neg` names, `haveI` in Prop goals, an unused `Fintype` binder, and one missing `Nat.cast_id` cast. The `maxHeartbeats 1000000` override is gone (every proof elaborates under the default), `import Mathlib` is narrowed to specific modules, and the single 1,243-line file is split into three themed modules with docstrings on every definition. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Advisory cross-file review against Lean Pool's supervisory rubric. This is not by itself a significance, source-verification, or merge verdict. The PR appears safe to merge; no actionable issue remains at the current head. SummaryThis PR imports a complete machine-checked proof of the Erdős–Sós conjecture as a new independently registered Lean Pool project.
Reviews (4) · Last reviewed commit: "Merge branch 'main' into claude/daily-im..." |
Proof profile (new / modified Lean files)
This build covers the changed modules and their dependency cones on top of the restored cache. The serial per-file sums below are useful for ranking slow files, not as a build budget. Total heartbeats: 256 maxHeartbeats units across 4 files (1,333 added LOC). Sum of Count-heartbeats wall-clock total: 13.03 s. Repeated import cost inside Heartbeat values come from Mathlib's LOC counts added lines in the profiled Lean files from this PR diff.
Aggregate phase totals
Slowest changed modules (from
|
| Changed module | Lake time |
|---|---|
LeanPool.Erdos548.Words |
6.90 s |
LeanPool.Erdos548.RootedTrees |
3.40 s |
LeanPool.Erdos548 |
1.20 s |
LeanPool.Erdos548.Main |
1.00 s |
Per-file `lean --profile` output
LeanPool/Erdos548.lean
import took 1.02s
cumulative profiling times:
elaboration 0.167ms
import 1.02s
initialization 34.1ms
interpretation 131ms
linting 0.303ms
module linting 0.00128ms
overlappingInstancesLinter 0.306ms
parsing 0.0281ms
tacticAnalysis 2.35ms
real 1.79
user 1.00
sys 0.81
LeanPool/Erdos548/Main.lean
import took 1.01s
interpretation of Mathlib.Tactic._aux_Mathlib_Tactic_Linarith_Frontend___elabRules_Mathlib_Tactic_nlinarith_1._boxed took 107ms
cumulative profiling times:
attribute application 0.0416ms
congr simp thm 3.2ms
elaboration 20.3ms
fix level params 0.725ms
import 1.01s
initialization 41.7ms
instantiate metavars 1.67ms
interpretation 403ms
let-to-have transformation 0.0549ms
linting 16.6ms
module linting 0.00195ms
norm_num 19.6ms
overlappingInstancesLinter 4.32ms
parsing 7.96ms
process pre-definitions 4.84ms
ring 13.1ms
share common exprs 4.23ms
simp 126ms
tactic execution 171ms
tacticAnalysis 27.4ms
type checking 79.6ms
typeclass inference 219ms
real 2.20
user 1.94
sys 0.80
LeanPool/Erdos548/RootedTrees.lean
import took 1.02s
cumulative profiling times:
attribute application 3.77ms
compilation (IR) 0.0278ms
compilation (LCNF base) 0.265ms
compilation (LCNF impure) 0.144ms
compilation (LCNF mono) 0.131ms
congr simp thm 11.4ms
elaboration 131ms
fix level params 4.01ms
import 1.02s
initialization 38.1ms
instantiate metavars 9.5ms
interpretation 535ms
let-to-have transformation 3.29ms
linting 77.2ms
module linting 0.00178ms
overlappingInstancesLinter 17.8ms
parsing 45ms
process pre-definitions 27.7ms
share common exprs 12.5ms
simp 171ms
tactic execution 770ms
tacticAnalysis 128ms
type checking 263ms
typeclass inference 281ms
real 2.53
user 3.23
sys 0.83
LeanPool/Erdos548/Words.lean
import took 879ms
cumulative profiling times:
attribute application 0.584ms
compilation (IR) 0.101ms
compilation (LCNF base) 1.18ms
compilation (LCNF impure) 0.511ms
compilation (LCNF mono) 0.908ms
congr simp thm 7.67ms
dsimp 0.814ms
elaboration 134ms
fix level params 5.97ms
import 879ms
initialization 29.4ms
instantiate metavars 7.8ms
interpretation 500ms
let-to-have transformation 0.389ms
linting 95.1ms
module linting 0.00133ms
overlappingInstancesLinter 13.1ms
parsing 49.5ms
process pre-definitions 23.7ms
share common exprs 13.9ms
simp 98.5ms
tactic execution 791ms
tacticAnalysis 114ms
type checking 341ms
typeclass inference 258ms
real 2.32
user 3.21
sys 0.76
Advisory only — never blocks merge. Full log uploaded as the proof-profile artifact.
# Conflicts: # LeanPool/projects.yml
The informal descriptions of rooted_word_tree_bound and marked_word_gluing_count now name the nonempty host word and the common word length that the Lean declarations require (Greptile P1 on #452). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Independent review (agentic, per
|
Summary
Imports the machine-checked proof of the Erdős–Sós conjecture (Erdős Problem 548, 1962): every graph on
n ≥ k+1vertices with at least(k−1)n/2 + 1edges contains every tree onk+1vertices as a subgraph. The conjecture had been open for six decades ("one of the most tantalizing problems in extremal graph theory" in Chung's collection; $100 Erdős prize). erdosproblems.com now lists it as PROVED (LEAN) with an exposition by Thomas Bloom, Formal Conjectures marksErdos548.erdos_548asresearch solved, and follow-up expositions have already appeared on arXiv (2609.15893, 2609.17877).New project:
LeanPool/Erdos548/(3 modules, 1,313 lines) with carderdos548.Upstream, announcement, license, provenance
c02708a6956d7b953c2e889c8bc24a0c97796313(proof fileErdos548/Resolutions/Erdos548_192usd_21h.lean, unchanged since the initial packaging commit8c2a3cfof 2026-09-03T21:56Z UTC).LICENSE). The headline statement was produced by the FrontierMath Erdős autoformalization pipeline (epoch-research/LeanOpenProblems, MIT) and reviewed for faithfulness by Thomas Bloom; Google DeepMind's Formal Conjectures now carries the identical statement (Apache-2.0).AI. The Lean proof was written autonomously by a pre-release GPT-6 Astra in the FrontierMath Erdős benchmark harness ($192, 21 h); Tom Adamczewski (Epoch AI) packaged it. No human wrote or steered the proof.Erdos548.erdos_548is verbatim the benchmark / Formal Conjectures statement.T.IsContained Gis Mathlib's "injective graph homomorphism" (not-necessarily-induced subgraph),G.edgeSet.ncardthe edge count, vertex typesFin n/Fin (k+1). The only divergence from the classical phrasing ("more than(t−2)n/2edges") is half an edge in the odd-parity case; the internal lemmatree_free_edge_boundproves the sharp classical form2|E| ≤ (t−2)nfor every tree-free host.What the proof is
Bloom's exposition: double counting over permutation words of the host vertices. For each word, distinguish the first letter as the root image and count cut positions ending at a neighbour of the root that support a rooted copy of the tree. Rotating the first qualifying prefix past the rest of a cut gives a gluing inequality for two branches at a common root (
marked_word_gluing_count); reversing both blocks at a cut moves the root to a newly attached leaf, losing at most one word per permutation (rooted_word_leaf_move_count). Strong induction on the ordertof the tree givesrooted_word_tree_bound(marked cut words ≤ rooted-copy count +(t−2)·n!); the marked count equals2|E|·(n−1)!, so a tree-free host has2|E| ≤ (t−2)n.Reusable pieces: the word-combinatorial gluing/transfer inequalities (
Words.lean, graph-free),attachLeaveswith copy extension,RootedWordFamily/rootedWordCount,tree_edge_partition/tree_root_partition(splitting a tree at an edge or at a root, with cardinalities),leafRestoreIso.Porting changes (Lean/Mathlib v4.28.0 → v4.34.0)
SimpleGraphfieldssymm/looplessare now classes (constructorstep);isBridge_iffno longer returns a conjunction; deprecatedif_pos/if_neg/dif_pos/dif_neg,IsTree.IsAcyclic/isConnected,push_negrenamed;haveI→havein Prop goals; oneNat.cast_idneeded in asimp only; unused[Fintype V]binder →[Finite V].set_option maxHeartbeats 1000000(every proof elaborates under the default; the heaviest is 0.2 s).import Mathlibby specific imports (found with#min_imports, layer by layer); split the 1,243-line file intoWords(pure list/finset combinatorics),RootedTrees(graph part),Main(headline); docstrings on every definition; spacing and 100-column fixes. No statement was changed.Trust / axiom audit
#print axiomsforerdos_548,tree_free_edge_bound,rooted_word_tree_bound,marked_word_gluing_count:[propext, Classical.choice, Quot.sound]. Nosorry/admit/native_decide/axiom/unsafe/partial/set_option/nolint/diagnostic commands (textual scan); the pool's option-backdoor environment audit over the four modules returns nothing.Checks run locally
lake build LeanPool.Erdos548: 0 errors, 0 warnings (with the lakefile'sweak.linter.mathlibStandardSet).lake exe runLinteron all four modules: passed.lake exe lint-style LeanPool: exit 0.lake exe mk_all --check: no update necessary.python -m lean_pool.quality(run_checks,--skip-lean-axioms, generated card check): no findings for this project (the single-project worktree cannot#checkother projects' declarations; CI does).Compile-time measurements (quiet machine, 32 cores, Mathlib v4.34.0 oleans warm)
lake env leanlake buildwallimport Mathlib, heartbeat override (baseline)Elaboration proper dropped from ≈2.3 s to ≈1.4 s once the broad import was gone; the +0.9 s of serial CPU versus the baseline is the import load paid three times instead of once, traded for −71 % memory and a dependency closure of a dozen Mathlib modules instead of all of Mathlib. Hot spots (profiler, threshold 100 ms):
erdos_5480.21 s (nlinarith),rooted_word_tree_bound_aux0.17 s,rootedWordFamily_glue0.14 s; nothing else above 0.13 s.Dedup
No
Erdős–Sós/548project inLeanPool/projects.yml, no prior PR. The only other public formalization (Jayyhk/erdos-lean, unlicensed) is a copy of the same Astra proof.🤖 Generated with Claude Code