Skip to content

Commit 07abc15

Browse files
committed
ordinal(buchholz): Slice 2-omega — ω branch of ω-rank-pow-succ replaced + dominance proved
Replaces the originally-proposed `ω-rank-pow-succ ω = olim (λ n → ω^(suc(suc n)))` (equi-ordinal with `ω-rank-pow ω`, so unsound) with `olim (λ n → ω-rank-pow ω ·ℕ n)`, denoting `ω^(ω+1)` — the next additive-principal above `ω^ω`. Proves `ω-rank-pow-<-succ-omega : ω-rank-pow ω <′ ω-rank-pow-succ ω` by mirroring `Brouwer/OmegaPow.ω^-strict-mono-suc`: pick branch index 2 in the target limit, reduce to `osuc (ω-rank-pow ω) ≤′ (oz ⊕ ω-rank-pow ω) ⊕ ω-rank-pow ω`, chain `X≤′oz⊕X` with `⊕-mono-<-right (ω-rank-pow-pos ω)`. Cross-check (iii) from the obstruction note resolved: the proof goes through `X≤′oz⊕X` which provides exactly the propositional `X ≤′ oz ⊕ X` step the note flagged as the hazard. Cross-checks (i) and (ii) still stand without modification — the consumer (Slice 3) uses the existing `additive-principal-ω-rank-pow {head-Ω target}` for additive-principal closure, not any property of `ω-rank-pow-succ ω` itself. New lemmas (all pinned in `Ordinal/Buchholz/Smoke.agda` under the existing Slice 2 `using` block): * ω-rank-pow-succ-omega -- definitional sanity, ω branch * ω-rank-pow-<-succ-omega -- per-marker strict dominance, ω branch * ω-rank-pow-<-succ -- unified across both branches The obstruction-note comment block in `RankPow.agda` is updated: its "ω branch deferred" subsection moves to a "History note" form recording the original sketch's failure mode, and the closure-plan TODO list collapses from two entries to one (Slice 2-bplus, the full WfCNF-carrier domination lemma — both per-marker dominances + the HeadOmegaInversion option (b) lemmas are now landed, so Slice 2-bplus no longer carries any inversion-via-rank-mono dependency). `scripts/kernel-guard.sh`: PASS. No postulates introduced. --safe --without-K throughout. https://claude.ai/code/session_013nLEeKZXpvHnrDZMgRm19S
1 parent 560f904 commit 07abc15

2 files changed

Lines changed: 90 additions & 71 deletions

File tree

proofs/agda/Ordinal/Buchholz/RankPow.agda

Lines changed: 87 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ open import Ordinal.Brouwer.OmegaPow using
7373
; ω^_-pos
7474
; ω^-strict-mono
7575
; ω^-strict-mono-suc
76+
; _·ℕ_
77+
; X≤′oz⊕X
7678
)
7779
open import Ordinal.Buchholz.Syntax using
7880
( BT
@@ -429,31 +431,32 @@ rank-mono-<ᵇ-+1-ψ-target {x₁} {x₂} {ν} {α} {y₂} =
429431
-- `ω-rank-pow-succ : OmegaIndex → Ord` consumed by the planned (but
430432
-- not yet landed) `<ᵇ-+1` joint-bplus head-Ω domination route.
431433
--
432-
-- ## Scope of this slice
434+
-- ## Scope of this slice (as updated by Slice 2-omega closure)
433435
--
434436
-- Lands:
435437
-- * `ω-rank-pow-succ : OmegaIndex → Ord`
436438
-- * `ω-rank-pow-succ-fin` — definitional sanity, fin branch
437-
-- * `ω-rank-pow-<-succ-fin` — per-marker strict dominance at fin
439+
-- * `ω-rank-pow-succ-omega` — definitional sanity, ω branch
440+
-- * `ω-rank-pow-<-succ-fin` — per-marker strict dominance, fin
441+
-- * `ω-rank-pow-<-succ-omega` — per-marker strict dominance, ω
442+
-- * `ω-rank-pow-<-succ` — unified across both branches
438443
-- * `rank-pow-bOmega-via-head-Ω`,
439444
-- `rank-pow-bpsi-via-head-Ω` — atomic-rank `refl`-shape primitives
440445
-- factoring `rank-pow` through `head-Ω` for the two non-bplus,
441446
-- non-bzero `BT` constructors. Useful at consumer-recursion
442447
-- sites that want to rewrite source-rank into head-Ω form
443448
-- without unfolding `rank-pow` and `head-Ω` separately.
444449
--
445-
-- Deferred (with concrete obstructions documented inline below):
450+
-- Still deferred:
446451
-- * The headline domination lemma
447452
-- `rank-pow-dominated-by-head-Ω : (t : BT) → NonBzero t →
448453
-- WfCNF t → rank-pow t <′ ω-rank-pow-succ (head-Ω t)`
449-
-- in its full generality. The fin branch is structurally clean
450-
-- (every WfCNF clause discharges via additive-principal at
451-
-- ω^(suc(suc n)) and the existing per-constructor rank-mono
452-
-- primitives), but the **ω branch of `head-Ω` cannot strictly
453-
-- dominate under the originally-proposed `ω-rank-pow-succ ω` shape**.
454-
-- See the obstruction note immediately below.
454+
-- in its full generality. Both per-marker dominances now hold;
455+
-- the structural recursion on the WfCNF carrier (the bplus case
456+
-- in particular) is Slice 2-bplus. See the `TODO(slice-2-bplus)`
457+
-- marker further down.
455458
--
456-
-- ## Obstruction note for the ω branch
459+
-- ## History note: the original ω-branch obstruction
457460
--
458461
-- The originally proposed shape (per CLAUDE.md § "Session arc
459462
-- 2026-05-27 late evening" — Slice 2 sketch) was:
@@ -470,40 +473,77 @@ rank-mono-<ᵇ-+1-ψ-target {x₁} {x₂} {ν} {α} {y₂} =
470473
-- ≤′ ω^(suc(suc k)) ·ℕ j` obligation that is again a limit-vs-osuc
471474
-- comparison, recursing indefinitely.
472475
--
473-
-- A follow-on slice must replace the ω branch with a genuinely
474-
-- strictly-larger ordinal (the natural candidate is `ω^(ω+1)`, the
475-
-- next additive-principal above `ω^ω`). In Brouwer notation this
476-
-- would be `olim (λ n → (ω-rank-pow ω) ·ℕ n)`; the proof obligation
477-
-- shifts but does not vanish — `(ω-rank-pow ω) ·ℕ n` is itself a
478-
-- nested limit, and the strict-dominance proof needs the equivalent of
479-
-- the existing `additive-principal-ω-rank-pow` ω-branch closure
480-
-- (lines 238–255 above) lifted one ω-power.
476+
-- Slice 2-omega (this slice) replaces the ω branch with the
477+
-- documented candidate `olim (λ n → ω-rank-pow ω ·ℕ n)`, denoting
478+
-- `ω^(ω+1) = ω^ω · ω` — the next additive-principal above `ω^ω`.
479+
-- The strict-dominance proof at the ω branch mirrors
480+
-- `Brouwer/OmegaPow.ω^-strict-mono-suc` (line 204): pick branch
481+
-- index 2 in the target limit, reduce to a `osuc (ω-rank-pow ω) ≤′
482+
-- (oz ⊕ ω-rank-pow ω) ⊕ ω-rank-pow ω` obligation, chain
483+
-- `X≤′oz⊕X` with `⊕-mono-<-right (ω-rank-pow-pos ω)`.
481484
--
482-
-- Choosing not to make that replacement in this slice keeps the
483-
-- abstraction minimal and avoids committing to a shape that the
484-
-- consumer (Slice 3, `rank-mono-<ᵇ-+1-via-head-Ω`) might want to
485-
-- specialise differently. The ω branch of `ω-rank-pow-succ` below
486-
-- therefore reuses the **original** CLAUDE.md proposal verbatim, so
487-
-- the abstraction is in place for follow-on slices to inspect and
488-
-- (if needed) override before any consumer pulls on the ω case.
485+
-- Sanity check (iii) from the original obstruction note — that the
486+
-- leading `oz ⊕` in `(ω-rank-pow ω) ·ℕ 1` is NOT definitionally
487+
-- `ω-rank-pow ω` — was the hazard to verify; the proof goes through
488+
-- via `X≤′oz⊕X` which proves exactly the propositional `X ≤′ oz ⊕ X`
489+
-- the obstruction note flagged as needed. Cross-checks (i) and (ii)
490+
-- from that note still stand: the consumer (Slice 3) uses the existing
491+
-- `additive-principal-ω-rank-pow {head-Ω target}` for additive-principal
492+
-- closure, not any property of `ω-rank-pow-succ ω` itself.
489493

490494
ω-rank-pow-succ : OmegaIndex Ord
491495
ω-rank-pow-succ (fin n) = ω^ (suc (suc n))
492-
ω-rank-pow-succ ω = olim (λ n ω^ (suc (suc n)))
496+
ω-rank-pow-succ ω = olim (λ n ω-rank-pow ω ·ℕ n)
493497

494498
-- Definitional sanity at the fin branch. Mirrors `ω-rank-pow-fin`.
495499
ω-rank-pow-succ-fin : n ω-rank-pow-succ (fin n) ≡ ω^ (suc (suc n))
496500
ω-rank-pow-succ-fin _ = refl
497501

502+
-- Definitional sanity at the ω branch (post Slice 2-omega). Mirrors
503+
-- `ω-rank-pow-succ-fin`. Records the shape change from the
504+
-- originally-proposed `olim (λ n → ω^(suc(suc n)))` to
505+
-- `olim (λ n → ω-rank-pow ω ·ℕ n)`, which denotes `ω^(ω+1)` and is
506+
-- strictly above `ω-rank-pow ω = ω^ω`.
507+
ω-rank-pow-succ-omega : ω-rank-pow-succ ω ≡ olim (λ n ω-rank-pow ω ·ℕ n)
508+
ω-rank-pow-succ-omega = refl
509+
498510
-- Per-marker strict dominance at the fin branch. For each `fin n`,
499511
-- `ω-rank-pow (fin n) = ω^(suc n)` is strictly below
500512
-- `ω-rank-pow-succ (fin n) = ω^(suc(suc n))` via the one-step
501-
-- strict-mono of the ω-power ladder. The ω branch is deferred per the
502-
-- obstruction note above.
513+
-- strict-mono of the ω-power ladder.
503514
ω-rank-pow-<-succ-fin : n
504515
ω-rank-pow (fin n) <′ ω-rank-pow-succ (fin n)
505516
ω-rank-pow-<-succ-fin n = ω^-strict-mono-suc (suc n)
506517

518+
-- Per-marker strict dominance at the ω branch. Mirrors the
519+
-- `ω^-strict-mono-suc` proof at line 204 of `Brouwer/OmegaPow.agda`:
520+
-- pick branch index 2 in the target limit; reduce the obligation to
521+
-- `osuc (ω-rank-pow ω) ≤′ (oz ⊕ ω-rank-pow ω) ⊕ ω-rank-pow ω`; chain
522+
-- `X≤′oz⊕X` (the `osuc/osuc` clause of `_≤′_` makes this fill the
523+
-- LHS step) with `⊕-mono-<-right (ω-rank-pow-pos ω)` (after right-unit
524+
-- `α ⊕ oz = α` reduction). Closes Slice 2-omega per the obstruction
525+
-- note above.
526+
ω-rank-pow-<-succ-omega : ω-rank-pow ω <′ ω-rank-pow-succ ω
527+
ω-rank-pow-<-succ-omega = 2 , step
528+
where
529+
step : osuc (ω-rank-pow ω) ≤′ (oz ⊕ ω-rank-pow ω) ⊕ ω-rank-pow ω
530+
step =
531+
≤′-trans
532+
{osuc (ω-rank-pow ω)}
533+
{osuc (oz ⊕ ω-rank-pow ω)}
534+
{(oz ⊕ ω-rank-pow ω) ⊕ ω-rank-pow ω}
535+
(X≤′oz⊕X {ω-rank-pow ω})
536+
(⊕-mono-<-right {oz ⊕ ω-rank-pow ω} {oz} {ω-rank-pow ω}
537+
(ω-rank-pow-pos ω))
538+
539+
-- Unified strict-dominance lemma across both Ω-marker branches.
540+
-- Consumers wanting the per-branch versions still have them under
541+
-- `-fin` / `-omega`; the unified form is convenient when the branch is
542+
-- abstracted as `μ : OmegaIndex`.
543+
ω-rank-pow-<-succ : μ ω-rank-pow μ <′ ω-rank-pow-succ μ
544+
ω-rank-pow-<-succ (fin n) = ω-rank-pow-<-succ-fin n
545+
ω-rank-pow-<-succ ω = ω-rank-pow-<-succ-omega
546+
507547
-- Atomic-rank-pow `refl`-shape primitives. For non-bplus, non-bzero
508548
-- BT constructors, `rank-pow` reduces to `ω-rank-pow` of the
509549
-- corresponding `head-Ω` value. Both equations are `refl`; provided
@@ -524,49 +564,25 @@ rank-pow-bpsi-via-head-Ω _ _ = refl
524564
-- Where this lands in the head-Ω closure plan
525565
----------------------------------------------------------------------
526566
--
527-
-- The abstraction landed here (`ω-rank-pow-succ` + the fin-branch
528-
-- dominance + the atomic factoring) is the smallest useful first cut.
529-
-- The two open follow-ons are:
530-
--
531-
-- Slice 2-omega. Replace the ω branch of `ω-rank-pow-succ` with a
532-
-- genuinely strictly-dominating shape and prove `ω-rank-pow ω <′
533-
-- (new-shape)`. Candidate: `ω^(ω+1)` encoded as
534-
-- `olim (λ n → (ω-rank-pow ω) ·ℕ n)`. Cross-checks before committing:
535-
-- (i) the new shape closes under ordinal addition strictly above
536-
-- `ω-rank-pow ω` (so additive-principal-style closure lifts);
537-
-- (ii) the consumer (Slice 3) does not need the additive-principal
538-
-- *of `ω-rank-pow-succ ω` itself* — it needs additive-principal of
539-
-- `ω-rank-pow (head-Ω target)`, which already lands via the existing
540-
-- `additive-principal-ω-rank-pow {ω}` (lines 238–255);
541-
-- (iii) sanity-check the indexing. The candidate's branches are
542-
-- `(ω-rank-pow ω) ·ℕ n = (… (oz ⊕ ω-rank-pow ω) … ⊕ ω-rank-pow ω)`
543-
-- — the leading `oz ⊕` is NOT definitionally `ω-rank-pow ω` under
544-
-- Brouwer's right-recursing `_⊕_`. As an ordinal denotation the
545-
-- supremum is `ω^ω · ω = ω^(ω+1)` and is strictly above `ω^ω`, so
546-
-- the lemma *should* go through, but the proof needs the
547-
-- propositional `oz ⊕ X ≤′ X` (or a path-algebra equivalent) at the
548-
-- right step — this is exactly the same hazard ("same ordinal under
549-
-- different ℕ-indexing") that disqualified the original
550-
-- `olim (λ n → ω^(suc(suc n)))` shape. Verify with a thin spike
551-
-- before committing the body.
567+
-- The abstractions landed here (`ω-rank-pow-succ` + both per-marker
568+
-- dominances + the atomic factoring) close everything Slice 2 promised
569+
-- *except* the full domination lemma over the WfCNF carrier. One
570+
-- follow-on remains.
552571
--
553-
-- TODO(slice-2-bplus). Once the ω branch closes, prove the full
554-
-- lemma
572+
-- TODO(slice-2-bplus). Prove the full lemma
555573
-- rank-pow-dominated-by-head-Ω : (t : BT) → NonBzero t → WfCNF t
556574
-- → rank-pow t <′ ω-rank-pow-succ (head-Ω t)
557-
-- by structural recursion on the WfCNF carrier. The bplus case
558-
-- needs a `rank-pow-mono-≤ᵇ : x ≤ᵇ y → rank-pow x ≤′ rank-pow y`
559-
-- companion for the original `_<ᵇ_` — landing-site below this
560-
-- comment block — because the WfCNF tail bound is `_≤ᵇ_`, not
561-
-- `_≤ᵇ⁰_`. The existing `rank-pow-mono-≤ᵇ⁰` in `RankMonoUmbrella`
562-
-- covers the `<ᵇ⁰` carrier only. A direct `_≤ᵇ_`-mono primitive
563-
-- would need either (a) bridging `_≤ᵇ_` to `_≤ᵇ⁰_` (which is
564-
-- exactly the open Slice 4 problem — full rank-mono umbrella over
565-
-- the original `_<ᵇ_`), or (b) a head-Ω inversion lemma
566-
-- `bOmega ν <ᵇ x → ν <Ω head-Ω x` (and ψ-analogue) that does not
567-
-- transitively depend on rank-mono. Option (b) is the cleaner
568-
-- path; it parallels the existing per-constructor rank-mono
569-
-- primitives without going through the umbrella, and keeps
570-
-- `rank-pow-dominated-by-head-Ω` independent of
571-
-- `rank-pow-mono-≤ᵇ` so that a future signature change to one
572-
-- does not silently break the other.
575+
-- by structural recursion on the WfCNF carrier. Both per-marker
576+
-- dominances now hold (`ω-rank-pow-<-succ`), so the bOmega / bpsi
577+
-- atomic cases discharge directly via the atomic factoring lemmas
578+
-- (`rank-pow-bOmega-via-head-Ω`, `rank-pow-bpsi-via-head-Ω`). The
579+
-- remaining bplus case needs a `rank-pow-mono-≤ᵇ : x ≤ᵇ y → rank-pow
580+
-- x ≤′ rank-pow y` companion for the original `_<ᵇ_` (the WfCNF tail
581+
-- bound is `_≤ᵇ_`, not `_≤ᵇ⁰_`). The existing `rank-pow-mono-≤ᵇ⁰`
582+
-- in `RankMonoUmbrella` covers the `<ᵇ⁰` carrier only. Option (b)
583+
-- of the original two paths — head-Ω inversion that does not
584+
-- transitively depend on rank-mono — landed separately as
585+
-- `Ordinal.Buchholz.HeadOmegaInversion` (the lemmas
586+
-- `head-Ω-inv-bOmega` and `head-Ω-inv-bpsi`). Slice 2-bplus consumes
587+
-- those plus the per-marker dominances above; no further dependency
588+
-- on rank-mono is introduced.

proofs/agda/Ordinal/Buchholz/Smoke.agda

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,10 @@ open import Ordinal.Buchholz.HeadOmega using
414414
open import Ordinal.Buchholz.RankPow using
415415
( ω-rank-pow-succ
416416
; ω-rank-pow-succ-fin
417+
; ω-rank-pow-succ-omega
417418
; ω-rank-pow-<-succ-fin
419+
; ω-rank-pow-<-succ-omega
420+
; ω-rank-pow-<-succ
418421
; rank-pow-bOmega-via-head-Ω
419422
; rank-pow-bpsi-via-head-Ω
420423
)

0 commit comments

Comments
 (0)