Are there infinitely many twin primes?
Pairs of primes two apart — 11 and 13, 29 and 31 — appear to keep occurring forever, but nobody can prove they do.
▸Motivation
Conjectured at least since de Polignac in 1849. Zhang Yitang proved in 2013 that some gap below 70 million occurs infinitely often, later reduced to 246 by the Polymath8 project; the gap 2 itself remains out of reach.
The obstruction is not a lack of ideas but the parity problem in sieve theory, which blocks every known sieve from distinguishing numbers with an even number of prime factors from those with an odd number.
de Polignac 1849. Related: Zhang 2013 (bounded gaps), Maynard–Tao 2014.
▸Lean API
import Conjectura.Defs.Mathematics.NumberTheory.TwinPrimePair
namespace Conjectura.NT003
/-- Are there infinitely many pairs of primes differing by two? -/
def goal : Prop :=
∀ N : ℕ, ∃ p : ℕ, N < p ∧ Conjectura.NumberTheory.IsTwinPrimePair p (p + 2)
end Conjectura.NT003▸Definition2
- twin prime pairConjectura.NumberTheory.IsTwinPrimePair
A twin prime pair is a pair of primes differing by two.
def IsTwinPrimePair (p q : ℕ) : Prop := p.Prime ∧ q.Prime ∧ q = p + 2- Primep.Prime
def
▸Related work2
- Bounded gaps between primesYitang Zhang · 2014
Proved that some bounded gap recurs infinitely often — the first breach in the problem.
- Small gaps between primesJames Maynard · 2015
A simpler and stronger method, independently found by Tao, that pushed the bound to 246.
▸For your AI
I am proving a theorem in Lean 4 and submitting it to Conjectura.
## Problem NT003 — Are there infinitely many twin primes?
Pairs of primes two apart — 11 and 13, 29 and 31 — appear to keep occurring forever, but nobody can prove they do.
## Environment (fixed — do not assume anything newer)
- Lean toolchain: `leanprover/lean4:v4.33.0-rc1`
- Mathlib: `v4.33.0-rc1`
If a lemma you want does not exist in that Mathlib, prove it inline instead of
importing something newer.
## The exact statement I must prove
```lean
theorem solution : ∀ N : ℕ, ∃ p : ℕ, N < p ∧ IsTwinPrimePair p (p + 2) := by
sorry
```
## The file I submit
```lean
import Conjectura.Problems.NT003.Statement
namespace Submission
theorem solution : Conjectura.NT003.goal := by
sorry
end Submission
```
## The Lean definitions of every term in this problem
These are the actual definitions your proof will be checked against. Do not
substitute your own version of any of them.
### twin prime pair
A twin prime pair is a pair of primes differing by two.
```lean
Conjectura.NumberTheory.IsTwinPrimePair
-- unfolds to:
def IsTwinPrimePair (p q : ℕ) : Prop := p.Prime ∧ q.Prime ∧ q = p + 2
```
Defined in this corpus.
### Prime
def
```lean
p.Prime
```
Defined in Mathlib.
## Rules — submissions violating these are rejected automatically
1. **Do not change the name or type of `solution`.** It must satisfy the
statement above exactly.
2. **Do not redefine or shadow anything from the problem's Statement module.**
Declaring your own `goal`, or redefining a name it depends on, produces a
proof of a *different* statement and is rejected. This is the single most
common rejection.
3. **No `sorry`** anywhere, including in helper lemmas. It surfaces as the
axiom `sorryAx` and is detected transitively through imports.
4. **No `native_decide`** — it surfaces as `Lean.ofReduceBool` and is not
accepted, because it trusts compiled code rather than the kernel.
5. Only these axioms are permitted: `propext`, `Classical.choice`,
`Quot.sound`.
6. Follow Mathlib style: hypotheses left of the colon, explicit types,
`snake_case` theorem names, `UpperCamelCase` types.
## What I want from you
Here is my argument in informal mathematics:
> [PASTE YOUR PROOF SKETCH HERE]
Turn it into Lean 4 that compiles under the environment above and satisfies the
statement exactly. Where you are unsure a lemma exists in this Mathlib version,
say so explicitly rather than guessing a name.Submissions are not open yet
Conjectura is in beta. You can read every statement, every definition and the Lean behind them, and download the exact files the checker uses — but proofs are not being accepted yet.
The reason is a deliberate order of operations. Accepting a proof means running a stranger’s code and standing behind a verdict, and no statement here yet carries a researcher’s name. A machine-checked answer to a question nobody has vouched for is worth very little, so the vouching comes first.
The English write-ups are also switched off during the beta. Nothing on this page is generated by a model.
Discussion
- Nothing yet.
Sign in to take part.