← Session 17 — Lean tier (i): elementary proofs (after crash)
thinking (10683 chars)
`harmonic_lower`, `harmonic_upper`, `oddHarm_eq` all compile. Piece 3: the partial-sum comparison lemma (hpartial with the emb injection) + hB (oddHarm lower bound). Then piece 4: main assembly.
For the emb approach, define a top-level private def `oddEmb` to make simp/unfold easier:
```lean
/-- Embedding `k ↦ 2k+1` into the odd ≥ 3 subtype (junk value at k = 0,
unused: only applied on `Icc 1 K`). -/
private def oddEmb : ℕ → {m : ℕ // Odd m ∧ 3 ≤ m} := fun k =>
if hk : 1 ≤ k then ⟨2 * k + 1, ⟨k, rfl⟩, by omega⟩ else ⟨3, ⟨1, rfl⟩, le_refl 3⟩
```
Then:
```lean
/-- [PROVED session 011] Partial-sum comparison: for every K,
`n·oddHarm K − K ≤ Σ'_{m odd ≥ 3} h⁺(m)`. (D-037 §3 truncation:
Bernoulli termwise + nonneg tail.) -/
theorem sInf_partial_lower (n K : ℕ) :
(n : ℝ) * oddHarm K - (K : ℝ) ≤
∑' m : {m : ℕ // Odd m ∧ 3 ≤ m},
((1 - 1 / (m : ℝ)) ^ n - 1 + (n : ℝ) / (m : ℝ)) := by
calc (n : ℝ) * oddHarm K - (K : ℝ)
= ∑ k ∈ Finset.Icc 1 K, ((n : ℝ) / (2 * k + 1) - 1) := by
unfold oddHarm
rw [Finset.mul_sum, Finset.sum_sub_distrib]
congr 1
· exact Finset.sum_congr rfl (fun k _ => mul_one_div _ _)
· simp [Finset.sum_const, Finset.card_Icc, nsmul_eq_mul]
_ ≤ ∑ k ∈ Finset.Icc 1 K, ((1 - 1 / ((2 * k + 1 : ℕ) : ℝ)) ^ n - 1 +
(n : ℝ) / ((2 * k + 1 : ℕ) : ℝ)) := by
apply Finset.sum_le_sum
intro k hk
have h := bern_term_nonneg n (2 * k + 1) (by omega) -- need lower, not nonneg!
...
```
wait — termwise lower: bern gives 0 ≤ h⁺ and 1 − n/m ≤ (1−1/m)^n. The lower bound n/m − 1 ≤ h⁺(m) is bern_term_nonneg's underlying Bernoulli — but bern_term_nonneg states 0 ≤ h⁺. I need h⁺ ≥ n/m − 1. The parallel agent didn't prove that one. I need a `bern_term_lower`: (n:ℝ)/m − 1 ≤ (1−1/m)^n − 1 + n/m. Add it (same 3-line proof via one_add_mul_le_pow). Or derive from bern_term_nonneg? No — different statement. Add lemma.
Then the sum_image part:
```lean
_ ≤ ∑' m : {m : ℕ // Odd m ∧ 3 ≤ m}, ... := by
have hinj : ∀ x ∈ Finset.Icc 1 K, ∀ y ∈ Finset.Icc 1 K,
oddEmb x = oddEmb y → x = y := by
intro x hx y hy h
have hx1 : 1 ≤ x := (Finset.mem_Icc.mp hx).1
have hy1 : 1 ≤ y := (Finset.mem_Icc.mp hy).1
simp only [oddEmb, dif_pos hx1, dif_pos hy1, Subtype.mk.injEq] at h
omega
have hconv : ∑ k ∈ Finset.Icc 1 K,
((1 - 1 / ((2 * k + 1 : ℕ) : ℝ)) ^ n - 1 + (n : ℝ) / ((2 * k + 1 : ℕ) : ℝ)) =
∑ k ∈ Finset.Icc 1 K,
((1 - 1 / ((oddEmb k : ℕ) : ℝ)) ^ n - 1 + (n : ℝ) / ((oddEmb k : ℕ) : ℝ)) := by
apply Finset.sum_congr rfl
intro k hk
have hk1 : 1 ≤ k := (Finset.mem_Icc.mp hk).1
simp only [oddEmb, dif_pos hk1]
rw [hconv, ← Finset.sum_image hinj]
exact Summable.sum_le_tsum _ (fun i _ =>
bern_term_nonneg n i.1 (Nat.le_trans (by norm_num) i.2.2)) (sInf_series_summable n)
```
Concerns:
- `simp only [oddEmb, dif_pos hk1]` — simp only [oddEmb] uses the equation lemma to unfold oddEmb k → if 1 ≤ k then ... else ...; then dif_pos hk1 rewrites → the subtype literal; then goal: (body with (2k+1:ℕ):ℝ casts) = (body with ((⟨2*k+1, _, _⟩ : subtype) : ℕ):ℝ) — the coercion ((⟨2k+1,...⟩ : subtype) : ℕ) — is this defeq/syntactically 2k+1? CoeTail subtype→ℕ = Subtype.val; ⟨2k+1, _, _⟩.val reduces to 2k+1 definitionally — simp only might not reduce it; the goal would be `... = ...` differing only in that projection — `rfl`-closeable. simp only [oddEmb, dif_pos hk1] might close the whole goal if after reduction both sides syntactically match — the proof irrelevance of the subtype components handles ⟨2k+1, p1, p2⟩ vs ⟨2k+1, p1', p2'⟩... Actually the goal after unfolding oddEmb k with dif_pos: RHS body has ((⟨2*k+1, ⟨k,rfl⟩, by omega⟩ : subtype) : ℕ) : ℝ). The projection application `Subtype.val ⟨2k+1, ...⟩` — simp can reduce via `Subtype.coe_mk`? There is a simp lemma `Subtype.coe_mk : (⟨a, h⟩ : Subtype p).1 = a`? Hmm — for subtypes, `Subtype.mk.val`? There's `Subtype.coe_eta`... The instance: coercion subtype→ℕ is CoeTail of Subtype.val — (⟨v,h⟩ : {m // P m}) : ℕ) elaborates to `Subtype.val ⟨v,h⟩`? Not exactly — CoeTail instance might not reduce definitionally in simp. Add `Subtype.coe_mk`... not a real lemma name. There's `Subtype.mk.injEq`, and for val: `Subtype.val_mk`? Hmm. In Lean4 Mathlib: `@[simp] theorem Subtype.coe_mk (a : α) (h : p a) : (⟨a, h⟩ : Subtype p) = a`? For Sort-valued coes there's `Subtype.coe_mk` I believe. Let me just try; fallback: end the sum_congr subproof with `rfl` or `dsimp only` after the simp.
Actually, safer: make oddEmb's else-branch irrelevant by defining oddEmb with a match-free total function: k ↦ ⟨2*k+3, ⟨k+1, by ring⟩, by omega⟩?? Then image covers m = 5,7,...,2K+3, i.e. k+1 ∈ Icc 2 (K+1) mapping j ↦ 2j−1... changes indexing. OR define oddEmb k := ⟨2*k+1, proof Odd, proof 3≤⟩ — impossible at k=0 as noted. Keep if-then-else; add fallback tactics.
- `Finset.sum_image` signature: `Finset.sum_image (h : ∀ x ∈ s, ∀ y ∈ s, f x = f y → x = y) : ∑ x ∈ s.image f, g x = ∑ x ∈ s, g (f x)` ✓.
- The tsum's family in the goal: `fun m : subtype => ((1 - 1/(m:ℝ))^n − 1 + n/(m:ℝ))` — while sum_image produces `∑ x ∈ image oddEmb, ?g x` where g unified from hconv's RHS: fun m' => body with ((m' : ℕ):ℝ)... The calc step's RHS is the tsum with (m : ℝ) coercions (subtype→ℝ directly?). In my calc I wrote the target as the ∑' with `((1 - 1 / (m : ℝ)) ^ n ...)` — (m : ℝ) with m : subtype. When applying Summable.sum_le_tsum, its conclusion is `∑ i ∈ s, f i ≤ ∑' i, f i` with f := the tsum family — and the finset sum after rw [← sum_image hinj] is `∑ x ∈ image oddEmb, g' x` with g' := fun k' => (1 − 1/((k' : ℕ):ℝ))^n − 1 + n/((k':ℕ):ℝ) where k' : subtype. Unify f := g' — requires the goal's tsum family (with (m:ℝ)) ≡ g' (with ((m:ℕ):ℝ)): defeq coercion issue again! The application `exact Summable.sum_le_tsum _ _ _` must unify `∑' i, f i` with the goal's `∑' m, (body with (m:ℝ))` and simultaneously `∑ i ∈ s, f i` with `∑ x ∈ image, (body with ((x:ℕ):ℝ))`. If (m : ℝ) and ((m : ℕ) : ℝ) are defeq-but-not-syntactic, unification at default transparency should still succeed (they're both `Nat.cast (Subtype.val m)` after unfolding the CoeTail/Coe instances — instances might differ: (m : ℝ) could go through a composed instance CoeHead/CoeTail chain that's still reducible-defeq). Risky.
To minimize risk: write the goal of sInf_partial_lower with ((m : ℕ) : ℝ) casts?? But then it doesn't match SInfty's body syntactically — the bridge happens at the main theorem (unfold SInfty; the tsum there has (m:ℝ)). One defeq bridge unavoidable somewhere. Hmm — actually are they really different? In SInfty's def, `(m : ℝ)` where m : {m : ℕ // ...}: Lean's coercion elaboration: expected type ℝ, have subtype. It inserts `↑m` and lets unification find the path: subtype → ℕ (CoeTail via val) then ℕ → ℝ (NatCast). The resulting TERM is `NatCast.natCast (Subtype.val m)` — or via a bundled `Coe` instance composition? In Lean4, `(m : ℝ)` elaborates via `Lean.Elab.Term.coe` inserting a `↑` that's resolved by typeclass: instance `CoeTail` chain produces a term that is NOT reducibly Nat.cast (Subtype.val m) but `instCoeTail...` application which unfolds. When I write `((m : ℕ) : ℝ)` the term is `NatCast.natCast (↑m : ℕ)` with `↑m : ℕ` = `instCoeSubtypeNat m` = Subtype.val m after unfolding. Both should be defeq and `simp`/`show`/unification at default transparency handles. The earlier isDefEq timeout was 200k heartbeats on a much bigger unification (higher-order, with lambdas). A first-order coercion mismatch inside a sum/tsum family might unify fine.
Mitigation: make EVERYTHING use the exact same syntactic form as SInfty's body: `((1 - 1 / (m : ℝ)) ^ n - 1 + (n : ℝ) / (m : ℝ))` with m : subtype. Then bern lemmas applied to m.1 give statements with (↑m.1 : ℝ) — defeq bridge needed at bern application sites (first-order, `exact` should unify (m:ℝ) =?= (↑m.1:ℝ) cheaply — it's just coercion unfolding, no higher-order). The earlier timeout was specifically in `le_of_eq (by ring)` where the `by ring` proof's inferred type had to unify — elaboration of `(by ring : t)` forces checking the TYPE t against expected — the ring proof itself was fine; the timeout was unifying my stated type t with the goal (containing big coe normal forms + the f/g metavariables). With explicit (g := ...) (f := ...) that vanished.
For hpartial: use calc with RHS = the exact tsum expression; in the last step, `exact Summable.sum_le_tsum ...` — unification needed: goal after rw [← sum_image]: `∑ x ∈ (Icc 1 K).image oddEmb, g' x ≤ ∑' m, body(m)` where g' x = body' with ((x:ℕ):ℝ) from hconv. To keep syntactic identity, write hconv's RHS body using (x : ℝ) form? But (oddEmb k : ℝ) after simp only [oddEmb, dif_pos] gives ((⟨2k+1,...⟩ : subtype) : ℝ) — and LHS body has ((2k+1 : ℕ) : ℝ)... The goal in sum_congr: body2k+1 = body(oddEmb k). If I write hconv as: LHS (with ((2*k+1:ℕ):ℝ)) = RHS `((1 - 1 / (oddEmb k : ℝ)) ^ n - 1 + (n:ℝ)/(oddEmb k : ℝ))` — after simp only [oddEmb, dif_pos hk1], RHS's (oddEmb k : ℝ) becomes ((⟨2k+1,...⟩:subtype):ℝ) — needs to reduce to ((2k+1:ℕ):ℝ) — defeq via coercion unfold; `simp only` might close if it can reduce (⟨v,h⟩).val — there's a simproc? Dsimp should: `dsimp only` reduces projections of constructors ✓. So end that subproof with `dsimp only` or it might just close by rfl after the simp only (simp closes rfl goals).
Hmm, this is getting deep. Alternative avoiding oddEmb entirely — reindex trick: instead of embedding Icc 1 K into the subtype, note the tsum is over ALL odd m ≥ 3, and use `Summable.sum_le_tsum` with s := Finset.image of the function m ↦ ⟨m, proof⟩ over the finset {m ∈ Finset.range (2K+2) | Odd m ∧ 3 ≤ m}?? The filter gives a finset of ℕ, then attach? `Finset.attach` of a filtered finset gives finset of {x // x ∈ s} not our subtype.
Alternative: use `tsum_le_tsum`-free approach: `Summable.sum_le_tsum` with s := (Finset.Icc 1 K).image oddEmb is the natural route; the coercion fiddliness is manageable. Let me just write it and iterate on errors. If the (m:ℝ) vs ((m:ℕ):ℝ) unification bites, switch the whole sInf_partial_lower statement to ((m:ℕ):ℝ) form and bridge at SInfty unfold with `show` (single defeq check of the whole inequality — prop-level defeq with tsums of defeq families — should be OK at default transparency... it timed out before though. Actually the timeout was a different beast: metavariable-containing higher-order unification. A ground `show` defeq check might be fine).
Let me write piece 3 now: bern_term_lower + oddEmb + sInf_partial_lower.
Piece 3: termwise lower bound, the subtype embedding, and the partial-sum comparison.
tool: Edit
input
{
"file_path": "D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean",
"old_string": "/-- The odd reciprocals sum `\u03a3_{k=1}^{K} 1/(2k+1)`. -/\nprivate def oddHarm (K : \u2115) : \u211d := \u2211 k \u2208 Finset.Icc 1 K, (1 : \u211d) / (2 * k + 1)",
"new_string": "/-- [PROVED session 011] h\u207a(m) \u2265 n/m \u2212 1 for m \u2265 1 (Bernoulli again). -/\ntheorem bern_term_lower (n : \u2115) (m : \u2115) (hm : 1 \u2264 m) :\n (n : \u211d) / m - 1 \u2264 (1 - 1 / (m : \u211d)) ^ n - 1 + (n : \u211d) / m := by\n have hm1 : (1 : \u211d) \u2264 m := by exact_mod_cast hm\n have h1 : (1 : \u211d) + n * (-1 / m) \u2264 (1 + -1 / (m : \u211d)) ^ n := by\n apply one_add_mul_le_pow\n have h4 : (1 : \u211d) / m \u2264 1 := by\n rw [div_le_one (by positivity)]; exact hm1\n rw [neg_div]\n linarith\n have h2 : (1 : \u211d) - n / m \u2264 (1 - 1 / m) ^ n := by\n have e : (1 : \u211d) + n * (-1 / m) = 1 - n / m := by field_simp; ring\n rwa [e, show (1 : \u211d) + -1 / m = 1 - 1 / m by ring] at h1\n linarith\n\n/-- The odd reciprocals sum `\u03a3_{k=1}^{K} 1/(2k+1)`. -/\nprivate def oddHarm (K : \u2115) : \u211d := \u2211 k \u2208 Finset.Icc 1 K, (1 : \u211d) / (2 * k + 1)\n\n/-- Embedding `k \u21a6 2k+1` into the odd-\u2265-3 subtype (junk value at k = 0,\nnever used: only applied on `Icc 1 K`). -/\nprivate def oddEmb : \u2115 \u2192 {m : \u2115 // Odd m \u2227 3 \u2264 m} := fun k =>\n if hk : 1 \u2264 k then \u27e82 * k + 1, \u27e8k, rfl\u27e9, by omega\u27e9 else \u27e83, \u27e81, rfl\u27e9, le_refl 3\u27e9\n\n/-- [PROVED session 011] Partial-sum comparison (D-037 \u00a73 truncation):\n`n\u00b7oddHarm K \u2212 K \u2264 \u03a3'_{m odd \u2265 3} h\u207a(m)` for every K \u2014 Bernoulli\ntermwise, nonneg tail dropped. -/\ntheorem sInf_partial_lower (n K : \u2115) :\n (n : \u211d) * oddHarm K - (K : \u211d) \u2264\n \u2211' m : {m : \u2115 // Odd m \u2227 3 \u2264 m},\n ((1 - 1 / (m : \u211d)) ^ n - 1 + (n : \u211d) / (m : \u211d)) := by\n calc (n : \u211d) * oddHarm K - (K : \u211d)\n = \u2211 k \u2208 Finset.Icc 1 K, ((n : \u211d) / (2 * k + 1) - 1) := by\n unfold oddHarm\n rw [Finset.mul_sum, Finset.sum_sub_distrib]\n congr 1\n \u00b7 exact Finset.sum_congr rfl (fun k _ => mul_one_div _ _)\n \u00b7 simp [Finset.sum_const, Finset.card_Icc, nsmul_eq_mul]\n _ \u2264 \u2211 k \u2208 Finset.Icc 1 K,\n ((1 - 1 / ((2 * k + 1 : \u2115) : \u211d)) ^ n - 1 + (n : \u211d) / ((2 * k + 1 : \u2115) : \u211d)) := by\n apply Finset.sum_le_sum\n intro k hk\n exact bern_term_lower n (2 * k + 1) (by omega)\n _ \u2264 \u2211' m : {m : \u2115 // Odd m \u2227 3 \u2264 m},\n ((1 - 1 / (m : \u211d)) ^ n - 1 + (n : \u211d) / (m : \u211d)) := by\n have hinj : \u2200 x \u2208 Finset.Icc 1 K, \u2200 y \u2208 Finset.Icc 1 K,\n oddEmb x = oddEmb y \u2192 x = y := by\n intro x hx y hy h\n have hx1 : 1 \u2264 x := (Finset.mem_Icc.mp hx).1\n have hy1 : 1 \u2264 y := (Finset.mem_Icc.mp hy).1\n simp only [oddEmb, dif_pos hx1, dif_pos hy1, Subtype.mk.injEq] at h\n omega\n have hconv : \u2211 k \u2208 Finset.Icc 1 K,\n ((1 - 1 / ((2 * k + 1 : \u2115) : \u211d)) ^ n - 1 +\n (n : \u211d) / ((2 * k + 1 : \u2115) : \u211d)) =\n \u2211 k \u2208 Finset.Icc 1 K,\n ((1 - 1 / ((oddEmb k : \u2115) : \u211d)) ^ n - 1 +\n (n : \u211d) / ((oddEmb k : \u2115) : \u211d)) := by\n apply Finset.sum_congr rfl\n intro k hk\n have hk1 : 1 \u2264 k := (Finset.mem_Icc.mp hk).1\n simp only [oddEmb, dif_pos hk1]\n rw [hconv, \u2190 Finset.sum_image hinj]\n exact Summable.sum_le_tsum _\n (fun i _ => bern_term_nonneg n i.1 (Nat.le_trans (by norm_num) i.2.2))\n (sInf_series_summable n)"
}
raw content_json (database row)
[{"type":"thinking","thinking":"`harmonic_lower`, `harmonic_upper`, `oddHarm_eq` all compile. Piece 3: the partial-sum comparison lemma (hpartial with the emb injection) + hB (oddHarm lower bound). Then piece 4: main assembly.\n\nFor the emb approach, define a top-level private def `oddEmb` to make simp/unfold easier:\n\n```lean\n/-- Embedding `k ↦ 2k+1` into the odd ≥ 3 subtype (junk value at k = 0,\nunused: only applied on `Icc 1 K`). -/\nprivate def oddEmb : ℕ → {m : ℕ // Odd m ∧ 3 ≤ m} := fun k =>\n if hk : 1 ≤ k then ⟨2 * k + 1, ⟨k, rfl⟩, by omega⟩ else ⟨3, ⟨1, rfl⟩, le_refl 3⟩\n```\n\nThen:\n```lean\n/-- [PROVED session 011] Partial-sum comparison: for every K,\n`n·oddHarm K − K ≤ Σ'_{m odd ≥ 3} h⁺(m)`. (D-037 §3 truncation:\nBernoulli termwise + nonneg tail.) -/\ntheorem sInf_partial_lower (n K : ℕ) :\n (n : ℝ) * oddHarm K - (K : ℝ) ≤\n ∑' m : {m : ℕ // Odd m ∧ 3 ≤ m},\n ((1 - 1 / (m : ℝ)) ^ n - 1 + (n : ℝ) / (m : ℝ)) := by\n calc (n : ℝ) * oddHarm K - (K : ℝ)\n = ∑ k ∈ Finset.Icc 1 K, ((n : ℝ) / (2 * k + 1) - 1) := by\n unfold oddHarm\n rw [Finset.mul_sum, Finset.sum_sub_distrib]\n congr 1\n · exact Finset.sum_congr rfl (fun k _ => mul_one_div _ _)\n · simp [Finset.sum_const, Finset.card_Icc, nsmul_eq_mul]\n _ ≤ ∑ k ∈ Finset.Icc 1 K, ((1 - 1 / ((2 * k + 1 : ℕ) : ℝ)) ^ n - 1 +\n (n : ℝ) / ((2 * k + 1 : ℕ) : ℝ)) := by\n apply Finset.sum_le_sum\n intro k hk\n have h := bern_term_nonneg n (2 * k + 1) (by omega) -- need lower, not nonneg!\n ...\n```\nwait — termwise lower: bern gives 0 ≤ h⁺ and 1 − n/m ≤ (1−1/m)^n. The lower bound n/m − 1 ≤ h⁺(m) is bern_term_nonneg's underlying Bernoulli — but bern_term_nonneg states 0 ≤ h⁺. I need h⁺ ≥ n/m − 1. The parallel agent didn't prove that one. I need a `bern_term_lower`: (n:ℝ)/m − 1 ≤ (1−1/m)^n − 1 + n/m. Add it (same 3-line proof via one_add_mul_le_pow). Or derive from bern_term_nonneg? No — different statement. Add lemma.\n\nThen the sum_image part:\n```lean\n _ ≤ ∑' m : {m : ℕ // Odd m ∧ 3 ≤ m}, ... := by\n have hinj : ∀ x ∈ Finset.Icc 1 K, ∀ y ∈ Finset.Icc 1 K,\n oddEmb x = oddEmb y → x = y := by\n intro x hx y hy h\n have hx1 : 1 ≤ x := (Finset.mem_Icc.mp hx).1\n have hy1 : 1 ≤ y := (Finset.mem_Icc.mp hy).1\n simp only [oddEmb, dif_pos hx1, dif_pos hy1, Subtype.mk.injEq] at h\n omega\n have hconv : ∑ k ∈ Finset.Icc 1 K,\n ((1 - 1 / ((2 * k + 1 : ℕ) : ℝ)) ^ n - 1 + (n : ℝ) / ((2 * k + 1 : ℕ) : ℝ)) =\n ∑ k ∈ Finset.Icc 1 K,\n ((1 - 1 / ((oddEmb k : ℕ) : ℝ)) ^ n - 1 + (n : ℝ) / ((oddEmb k : ℕ) : ℝ)) := by\n apply Finset.sum_congr rfl\n intro k hk\n have hk1 : 1 ≤ k := (Finset.mem_Icc.mp hk).1\n simp only [oddEmb, dif_pos hk1]\n rw [hconv, ← Finset.sum_image hinj]\n exact Summable.sum_le_tsum _ (fun i _ =>\n bern_term_nonneg n i.1 (Nat.le_trans (by norm_num) i.2.2)) (sInf_series_summable n)\n```\n\nConcerns:\n- `simp only [oddEmb, dif_pos hk1]` — simp only [oddEmb] uses the equation lemma to unfold oddEmb k → if 1 ≤ k then ... else ...; then dif_pos hk1 rewrites → the subtype literal; then goal: (body with (2k+1:ℕ):ℝ casts) = (body with ((⟨2*k+1, _, _⟩ : subtype) : ℕ):ℝ) — the coercion ((⟨2k+1,...⟩ : subtype) : ℕ) — is this defeq/syntactically 2k+1? CoeTail subtype→ℕ = Subtype.val; ⟨2k+1, _, _⟩.val reduces to 2k+1 definitionally — simp only might not reduce it; the goal would be `... = ...` differing only in that projection — `rfl`-closeable. simp only [oddEmb, dif_pos hk1] might close the whole goal if after reduction both sides syntactically match — the proof irrelevance of the subtype components handles ⟨2k+1, p1, p2⟩ vs ⟨2k+1, p1', p2'⟩... Actually the goal after unfolding oddEmb k with dif_pos: RHS body has ((⟨2*k+1, ⟨k,rfl⟩, by omega⟩ : subtype) : ℕ) : ℝ). The projection application `Subtype.val ⟨2k+1, ...⟩` — simp can reduce via `Subtype.coe_mk`? There is a simp lemma `Subtype.coe_mk : (⟨a, h⟩ : Subtype p).1 = a`? Hmm — for subtypes, `Subtype.mk.val`? There's `Subtype.coe_eta`... The instance: coercion subtype→ℕ is CoeTail of Subtype.val — (⟨v,h⟩ : {m // P m}) : ℕ) elaborates to `Subtype.val ⟨v,h⟩`? Not exactly — CoeTail instance might not reduce definitionally in simp. Add `Subtype.coe_mk`... not a real lemma name. There's `Subtype.mk.injEq`, and for val: `Subtype.val_mk`? Hmm. In Lean4 Mathlib: `@[simp] theorem Subtype.coe_mk (a : α) (h : p a) : (⟨a, h⟩ : Subtype p) = a`? For Sort-valued coes there's `Subtype.coe_mk` I believe. Let me just try; fallback: end the sum_congr subproof with `rfl` or `dsimp only` after the simp.\n\nActually, safer: make oddEmb's else-branch irrelevant by defining oddEmb with a match-free total function: k ↦ ⟨2*k+3, ⟨k+1, by ring⟩, by omega⟩?? Then image covers m = 5,7,...,2K+3, i.e. k+1 ∈ Icc 2 (K+1) mapping j ↦ 2j−1... changes indexing. OR define oddEmb k := ⟨2*k+1, proof Odd, proof 3≤⟩ — impossible at k=0 as noted. Keep if-then-else; add fallback tactics.\n\n- `Finset.sum_image` signature: `Finset.sum_image (h : ∀ x ∈ s, ∀ y ∈ s, f x = f y → x = y) : ∑ x ∈ s.image f, g x = ∑ x ∈ s, g (f x)` ✓.\n\n- The tsum's family in the goal: `fun m : subtype => ((1 - 1/(m:ℝ))^n − 1 + n/(m:ℝ))` — while sum_image produces `∑ x ∈ image oddEmb, ?g x` where g unified from hconv's RHS: fun m' => body with ((m' : ℕ):ℝ)... The calc step's RHS is the tsum with (m : ℝ) coercions (subtype→ℝ directly?). In my calc I wrote the target as the ∑' with `((1 - 1 / (m : ℝ)) ^ n ...)` — (m : ℝ) with m : subtype. When applying Summable.sum_le_tsum, its conclusion is `∑ i ∈ s, f i ≤ ∑' i, f i` with f := the tsum family — and the finset sum after rw [← sum_image hinj] is `∑ x ∈ image oddEmb, g' x` with g' := fun k' => (1 − 1/((k' : ℕ):ℝ))^n − 1 + n/((k':ℕ):ℝ) where k' : subtype. Unify f := g' — requires the goal's tsum family (with (m:ℝ)) ≡ g' (with ((m:ℕ):ℝ)): defeq coercion issue again! The application `exact Summable.sum_le_tsum _ _ _` must unify `∑' i, f i` with the goal's `∑' m, (body with (m:ℝ))` and simultaneously `∑ i ∈ s, f i` with `∑ x ∈ image, (body with ((x:ℕ):ℝ))`. If (m : ℝ) and ((m : ℕ) : ℝ) are defeq-but-not-syntactic, unification at default transparency should still succeed (they're both `Nat.cast (Subtype.val m)` after unfolding the CoeTail/Coe instances — instances might differ: (m : ℝ) could go through a composed instance CoeHead/CoeTail chain that's still reducible-defeq). Risky.\n\nTo minimize risk: write the goal of sInf_partial_lower with ((m : ℕ) : ℝ) casts?? But then it doesn't match SInfty's body syntactically — the bridge happens at the main theorem (unfold SInfty; the tsum there has (m:ℝ)). One defeq bridge unavoidable somewhere. Hmm — actually are they really different? In SInfty's def, `(m : ℝ)` where m : {m : ℕ // ...}: Lean's coercion elaboration: expected type ℝ, have subtype. It inserts `↑m` and lets unification find the path: subtype → ℕ (CoeTail via val) then ℕ → ℝ (NatCast). The resulting TERM is `NatCast.natCast (Subtype.val m)` — or via a bundled `Coe` instance composition? In Lean4, `(m : ℝ)` elaborates via `Lean.Elab.Term.coe` inserting a `↑` that's resolved by typeclass: instance `CoeTail` chain produces a term that is NOT reducibly Nat.cast (Subtype.val m) but `instCoeTail...` application which unfolds. When I write `((m : ℕ) : ℝ)` the term is `NatCast.natCast (↑m : ℕ)` with `↑m : ℕ` = `instCoeSubtypeNat m` = Subtype.val m after unfolding. Both should be defeq and `simp`/`show`/unification at default transparency handles. The earlier isDefEq timeout was 200k heartbeats on a much bigger unification (higher-order, with lambdas). A first-order coercion mismatch inside a sum/tsum family might unify fine.\n\nMitigation: make EVERYTHING use the exact same syntactic form as SInfty's body: `((1 - 1 / (m : ℝ)) ^ n - 1 + (n : ℝ) / (m : ℝ))` with m : subtype. Then bern lemmas applied to m.1 give statements with (↑m.1 : ℝ) — defeq bridge needed at bern application sites (first-order, `exact` should unify (m:ℝ) =?= (↑m.1:ℝ) cheaply — it's just coercion unfolding, no higher-order). The earlier timeout was specifically in `le_of_eq (by ring)` where the `by ring` proof's inferred type had to unify — elaboration of `(by ring : t)` forces checking the TYPE t against expected — the ring proof itself was fine; the timeout was unifying my stated type t with the goal (containing big coe normal forms + the f/g metavariables). With explicit (g := ...) (f := ...) that vanished.\n\nFor hpartial: use calc with RHS = the exact tsum expression; in the last step, `exact Summable.sum_le_tsum ...` — unification needed: goal after rw [← sum_image]: `∑ x ∈ (Icc 1 K).image oddEmb, g' x ≤ ∑' m, body(m)` where g' x = body' with ((x:ℕ):ℝ) from hconv. To keep syntactic identity, write hconv's RHS body using (x : ℝ) form? But (oddEmb k : ℝ) after simp only [oddEmb, dif_pos] gives ((⟨2k+1,...⟩ : subtype) : ℝ) — and LHS body has ((2k+1 : ℕ) : ℝ)... The goal in sum_congr: body2k+1 = body(oddEmb k). If I write hconv as: LHS (with ((2*k+1:ℕ):ℝ)) = RHS `((1 - 1 / (oddEmb k : ℝ)) ^ n - 1 + (n:ℝ)/(oddEmb k : ℝ))` — after simp only [oddEmb, dif_pos hk1], RHS's (oddEmb k : ℝ) becomes ((⟨2k+1,...⟩:subtype):ℝ) — needs to reduce to ((2k+1:ℕ):ℝ) — defeq via coercion unfold; `simp only` might close if it can reduce (⟨v,h⟩).val — there's a simproc? Dsimp should: `dsimp only` reduces projections of constructors ✓. So end that subproof with `dsimp only` or it might just close by rfl after the simp only (simp closes rfl goals).\n\nHmm, this is getting deep. Alternative avoiding oddEmb entirely — reindex trick: instead of embedding Icc 1 K into the subtype, note the tsum is over ALL odd m ≥ 3, and use `Summable.sum_le_tsum` with s := Finset.image of the function m ↦ ⟨m, proof⟩ over the finset {m ∈ Finset.range (2K+2) | Odd m ∧ 3 ≤ m}?? The filter gives a finset of ℕ, then attach? `Finset.attach` of a filtered finset gives finset of {x // x ∈ s} not our subtype.\n\nAlternative: use `tsum_le_tsum`-free approach: `Summable.sum_le_tsum` with s := (Finset.Icc 1 K).image oddEmb is the natural route; the coercion fiddliness is manageable. Let me just write it and iterate on errors. If the (m:ℝ) vs ((m:ℕ):ℝ) unification bites, switch the whole sInf_partial_lower statement to ((m:ℕ):ℝ) form and bridge at SInfty unfold with `show` (single defeq check of the whole inequality — prop-level defeq with tsums of defeq families — should be OK at default transparency... it timed out before though. Actually the timeout was a different beast: metavariable-containing higher-order unification. A ground `show` defeq check might be fine).\n\nLet me write piece 3 now: bern_term_lower + oddEmb + sInf_partial_lower.","signature":""},{"type":"text","text":"Piece 3: termwise lower bound, the subtype embedding, and the partial-sum comparison."},{"type":"tool_use","id":"Edit_60","name":"Edit","input":{"file_path":"D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean","old_string":"/-- The odd reciprocals sum `Σ_{k=1}^{K} 1/(2k+1)`. -/\nprivate def oddHarm (K : ℕ) : ℝ := ∑ k ∈ Finset.Icc 1 K, (1 : ℝ) / (2 * k + 1)","new_string":"/-- [PROVED session 011] h⁺(m) ≥ n/m − 1 for m ≥ 1 (Bernoulli again). -/\ntheorem bern_term_lower (n : ℕ) (m : ℕ) (hm : 1 ≤ m) :\n (n : ℝ) / m - 1 ≤ (1 - 1 / (m : ℝ)) ^ n - 1 + (n : ℝ) / m := by\n have hm1 : (1 : ℝ) ≤ m := by exact_mod_cast hm\n have h1 : (1 : ℝ) + n * (-1 / m) ≤ (1 + -1 / (m : ℝ)) ^ n := by\n apply one_add_mul_le_pow\n have h4 : (1 : ℝ) / m ≤ 1 := by\n rw [div_le_one (by positivity)]; exact hm1\n rw [neg_div]\n linarith\n have h2 : (1 : ℝ) - n / m ≤ (1 - 1 / m) ^ n := by\n have e : (1 : ℝ) + n * (-1 / m) = 1 - n / m := by field_simp; ring\n rwa [e, show (1 : ℝ) + -1 / m = 1 - 1 / m by ring] at h1\n linarith\n\n/-- The odd reciprocals sum `Σ_{k=1}^{K} 1/(2k+1)`. -/\nprivate def oddHarm (K : ℕ) : ℝ := ∑ k ∈ Finset.Icc 1 K, (1 : ℝ) / (2 * k + 1)\n\n/-- Embedding `k ↦ 2k+1` into the odd-≥-3 subtype (junk value at k = 0,\nnever used: only applied on `Icc 1 K`). -/\nprivate def oddEmb : ℕ → {m : ℕ // Odd m ∧ 3 ≤ m} := fun k =>\n if hk : 1 ≤ k then ⟨2 * k + 1, ⟨k, rfl⟩, by omega⟩ else ⟨3, ⟨1, rfl⟩, le_refl 3⟩\n\n/-- [PROVED session 011] Partial-sum comparison (D-037 §3 truncation):\n`n·oddHarm K − K ≤ Σ'_{m odd ≥ 3} h⁺(m)` for every K — Bernoulli\ntermwise, nonneg tail dropped. -/\ntheorem sInf_partial_lower (n K : ℕ) :\n (n : ℝ) * oddHarm K - (K : ℝ) ≤\n ∑' m : {m : ℕ // Odd m ∧ 3 ≤ m},\n ((1 - 1 / (m : ℝ)) ^ n - 1 + (n : ℝ) / (m : ℝ)) := by\n calc (n : ℝ) * oddHarm K - (K : ℝ)\n = ∑ k ∈ Finset.Icc 1 K, ((n : ℝ) / (2 * k + 1) - 1) := by\n unfold oddHarm\n rw [Finset.mul_sum, Finset.sum_sub_distrib]\n congr 1\n · exact Finset.sum_congr rfl (fun k _ => mul_one_div _ _)\n · simp [Finset.sum_const, Finset.card_Icc, nsmul_eq_mul]\n _ ≤ ∑ k ∈ Finset.Icc 1 K,\n ((1 - 1 / ((2 * k + 1 : ℕ) : ℝ)) ^ n - 1 + (n : ℝ) / ((2 * k + 1 : ℕ) : ℝ)) := by\n apply Finset.sum_le_sum\n intro k hk\n exact bern_term_lower n (2 * k + 1) (by omega)\n _ ≤ ∑' m : {m : ℕ // Odd m ∧ 3 ≤ m},\n ((1 - 1 / (m : ℝ)) ^ n - 1 + (n : ℝ) / (m : ℝ)) := by\n have hinj : ∀ x ∈ Finset.Icc 1 K, ∀ y ∈ Finset.Icc 1 K,\n oddEmb x = oddEmb y → x = y := by\n intro x hx y hy h\n have hx1 : 1 ≤ x := (Finset.mem_Icc.mp hx).1\n have hy1 : 1 ≤ y := (Finset.mem_Icc.mp hy).1\n simp only [oddEmb, dif_pos hx1, dif_pos hy1, Subtype.mk.injEq] at h\n omega\n have hconv : ∑ k ∈ Finset.Icc 1 K,\n ((1 - 1 / ((2 * k + 1 : ℕ) : ℝ)) ^ n - 1 +\n (n : ℝ) / ((2 * k + 1 : ℕ) : ℝ)) =\n ∑ k ∈ Finset.Icc 1 K,\n ((1 - 1 / ((oddEmb k : ℕ) : ℝ)) ^ n - 1 +\n (n : ℝ) / ((oddEmb k : ℕ) : ℝ)) := by\n apply Finset.sum_congr rfl\n intro k hk\n have hk1 : 1 ≤ k := (Finset.mem_Icc.mp hk).1\n simp only [oddEmb, dif_pos hk1]\n rw [hconv, ← Finset.sum_image hinj]\n exact Summable.sum_le_tsum _\n (fun i _ => bern_term_nonneg n i.1 (Nat.le_trans (by norm_num) i.2.2))\n (sInf_series_summable n)"},"extra_content":null}]