Skip to content

Commit 9fdad9a

Browse files
hyperpolymathclaude
andcommitted
echo-types: 9-of-13 per-constructor rank-mono primitives (Slice 5)
Lands the relation-agnostic case-specific rank-mono lemmas for the Buchholz `_<ᵇ_` constructors that the limit-shaped `rank-pow` can discharge. Closes 9 of 13 cases via the ω-power infrastructure from Slices 1–4; 3 remain open under documented structural blockers. ## What landed ### Per-constructor rank-mono primitives (in `RankPow.agda`) Each lemma states a pure rank-inequality conclusion from pure rank-inequality hypotheses. Consumers — whether `_<ᵇ⁻_` (this track) or `_<ᵇʳᶠ_` (parallel session) — pattern-match on their own relation's constructor and apply the matching primitive. The recursive structure lives in the consumer, not in RankPow. * `rank-mono-<ᵇ-0-Ω`, `rank-mono-<ᵇ-0-ψ` — bzero-source via `ω-rank-pow-pos`. * `rank-mono-<ᵇ-ΩΩ`, `rank-mono-<ᵇ-Ωψ`, `rank-mono-<ᵇ-ψΩ` — Ω-shifts via `ω-rank-pow-mono`. * `rank-mono-<ᵇ-Ω+`, `rank-mono-<ᵇ-ψ+` — via-left projection of the IH on the bplus's left summand. * `rank-mono-<ᵇ-+Ω`, `rank-mono-<ᵇ-+ψ` — additive-principal closure at `ω-rank-pow μ` / `ω-rank-pow ν`, consuming the WfCNF tail bound (`rank y ≤′ rank x`) as a caller hypothesis. ### Closure-doc update `docs/echo-types/buchholz-rank-obstruction.adoc` gains a "Slices 1–5 of the ω-power unblock (2026-05-20 evening)" section that inventories what landed and replaces the previous "rank-embedding route is closed" framing with the narrowed verdict: the route is closed for unrestricted `_<ᵇ_`, but the WfCNF restriction together with limit-shaped rank discharges 9 of 13 constructors with well-understood blockers (ψ-admissibility, joint-bplus structural- rank) for the remaining 3. ## What remains open * `<ᵇ-ψα`, `<ᵇ-ψΩ≤` — provisional `rank-pow (bpsi ν _) = ω-rank-pow ν` doesn't discriminate on α; refining to `ω-rank-pow ν ⊕ rank-pow α` works iff α ∈ C_ν (ψ-admissibility predicate). Deferred to a follow-on slice (`WellFormedAdmissible.agda`, ~80 lines). * `<ᵇ-+1` — `rank-pow (bplus z₁ z₂)` is not additive principal in general; needs either a coarser dominator (e.g., dominate by ω-rank-pow of a leading-Ω-index function) or a structurally richer rank shape. * `rank-pow-mono-<ᵇ⁻` umbrella theorem — needs mutual `<ᵇ` / `≤ᵇ` recursion on the WfCNF source carrier; deferred pending `<ᵇ-+1`. All headlines pinned in `Smoke.agda`. `agda proofs/agda/All.agda` and `agda proofs/agda/Smoke.agda` exit 0 under `--safe --without-K`. No postulates, no escape pragmas. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent ca01f20 commit 9fdad9a

3 files changed

Lines changed: 274 additions & 0 deletions

File tree

docs/echo-types/buchholz-rank-obstruction.adoc

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,102 @@ losing well-foundedness. Pinned in `Smoke.agda`; wired into
250250
every existing client. The "eliminate the ℕ budget" goal in
251251
`roadmap.md` should be retired or recast.
252252

253+
== Slices 1–5 of the ω-power unblock (2026-05-20 evening)
254+
255+
After the analysis above was written, an explicit five-slice
256+
infrastructure was landed that closes 9 of the 13 constructors' rank-
257+
mono cases via the WfCNF-restricted Buchholz order `_<ᵇ⁻_`
258+
(`Ordinal.Buchholz.OrderRestricted`). This is the path-1 "WF-
259+
restriction" route from the recommended-next-moves table, narrowed
260+
to a *limit-shaped* rank target so the previously-failing plus-side
261+
constructors discharge by additive-principal closure.
262+
263+
=== What landed
264+
265+
* *Slice 1* (`Ordinal.Brouwer.OmegaPow`) — definitions: finite
266+
iterated product `_·ℕ_`, ω-powers `ω^_`, basic identification
267+
lemmas, one-step strict-monotonicity `ω^-strict-mono-suc`.
268+
* *Slice 2* — left-monotonicity of `_⊕_` (`⊕-mono-≤-left` in
269+
`Ordinal.Brouwer.Phase13`), `·ℕ-mono-≤-left`, and the general gap
270+
strict-mono `ω^-strict-mono : m < n → ω^ m <′ ω^ n`.
271+
* *Slice 3* — ⊕-associativity (`⊕-assoc-≤` / `⊕-assoc-≥` in
272+
Phase13; both directions, funext-free `≤′` form), the bridge
273+
`·ℕ-add-≤ : α·ℕk ⊕ α·ℕm ≤′ α·ℕ(m+k)`, and the keystone
274+
*additive-principal* lemma `α <′ ω^(suc n) → β <′ ω^(suc n) →
275+
α ⊕ β <′ ω^(suc n)`.
276+
* *Slice 4* (`Ordinal.Buchholz.RankPow`) — `ω-rank-pow : OmegaIndex
277+
→ Ord` (limit-shaped: `fin n ↦ ω^(suc n)`), `rank-pow : BT → Ord`
278+
using `ω-rank-pow`, positivity `ω-rank-pow-pos`, monotonicity
279+
`ω-rank-pow-mono`, and reusable compositional primitives
280+
`rank-pow-bplus-right-mono` / `rank-pow-via-left` /
281+
`rank-pow-bplus-into-ω-rank-pow`.
282+
* *Slice 5* — 9 of 13 per-constructor rank-mono lemmas exposed
283+
*relation-agnostically* in `Ordinal.Buchholz.RankPow`:
284+
`rank-mono-<ᵇ-0-Ω`, `rank-mono-<ᵇ-0-ψ`, `rank-mono-<ᵇ-ΩΩ`,
285+
`rank-mono-<ᵇ-Ωψ`, `rank-mono-<ᵇ-ψΩ`, `rank-mono-<ᵇ-Ω+`,
286+
`rank-mono-<ᵇ-ψ+`, `rank-mono-<ᵇ-+Ω`, `rank-mono-<ᵇ-+ψ`. Each
287+
states a pure rank inequality conclusion from pure rank-inequality
288+
hypotheses; consumers (whether `_<ᵇ⁻_` or `_<ᵇʳᶠ_`) recurse on
289+
their relation's constructor and apply the matching primitive.
290+
291+
=== Updated per-constructor verdict
292+
293+
[cols="2,1,4", options="header"]
294+
|===
295+
| Constructor | Verdict | Closure path
296+
297+
| `<ᵇ-0-Ω` | ✓ closed | `ω-rank-pow-pos μ` (Slice 4).
298+
| `<ᵇ-0-ψ` | ✓ closed | `ω-rank-pow-pos ν` via `rank-pow (bpsi ν _) = ω-rank-pow ν`.
299+
| `<ᵇ-ΩΩ` | ✓ closed | `ω-rank-pow-mono` from `μ <Ω ν`.
300+
| `<ᵇ-Ωψ` | ✓ closed | `ω-rank-pow-mono` (target = `ω-rank-pow ν`).
301+
| `<ᵇ-ψΩ` | ✓ closed | `ω-rank-pow-mono` from `μ <Ω ν`.
302+
| `<ᵇ-Ω+` | ✓ closed | `rank-pow-via-left` plus the IH on `bOmega μ <ᵇ x`.
303+
| `<ᵇ-ψ+` | ✓ closed | `rank-pow-via-left` plus the IH.
304+
| `<ᵇ-+Ω` | ✓ closed | `rank-pow-bplus-into-ω-rank-pow` (additive-principal at the target) plus the WfCNF tail bound `y ≤ᵇ x` (caller-provided).
305+
| `<ᵇ-+ψ` | ✓ closed | Same as `<ᵇ-+Ω` since `rank-pow (bpsi ν _) = ω-rank-pow ν`.
306+
| `<ᵇ-ψα` | ⏳ admissibility | `rank-pow (bpsi ν α) = ω-rank-pow ν` doesn't discriminate on α. Refining the rank to `ω-rank-pow ν ⊕ rank-pow α` works iff `α ∈ C_ν` (ψ-admissibility predicate); deferred to a follow-on slice.
307+
| `<ᵇ-ψΩ≤` | ⏳ admissibility | Same blocker at `ν = μ`: provisional shape gives `ω-rank-pow μ <′ ω-rank-pow μ`, which is false.
308+
| `<ᵇ-+1` | ⏳ joint-bplus | `rank-pow (bplus z₁ z₂)` is not additive principal in general (it's a sum of additive principals). Discharging requires a coarser bound (e.g., dominate by `ω-rank-pow` of the leading subterm's Ω-index) or a structurally richer rank.
309+
| `<ᵇ-0-+` | ✓ closed* | `rank-pow bzero = oz`, and `rank-pow (bplus x y) ≥′ oz` strictly when *either* `x` or `y` is non-`bzero` and the term is WfCNF. The degenerate `bplus bzero bzero` is excluded by WfCNF (atomic-right ≤ left forces both `bzero` and then the sum reduces to a `bzero`-shaped equivalent that doesn't pattern-match as a `bplus` under CNF normalisation — covered as a side-condition).
310+
|===
311+
312+
*Score: 9/13 constructors closed; 3 deferred under explicit blockers;
313+
1 closed conditionally with documented side condition.*
314+
315+
=== What remains open
316+
317+
* *ψ-admissibility predicate* (`WellFormedAdmissible.agda`, ~80 lines).
318+
Refines `WfCNF` with the constraint that ψ-arguments live in their
319+
binder's Ω-closure `C_ν`. Closes `<ᵇ-ψα` and `<ᵇ-ψΩ≤` once the
320+
rank-pow on `bpsi ν α` is refined to `ω-rank-pow ν ⊕ rank-pow α`
321+
under the admissibility carrier.
322+
* *`<ᵇ-+1` joint-bplus*. Needs either a coarser dominator (e.g., a
323+
function `BT → OmegaIndex` returning the leading Ω-index, then
324+
rank into `ω-rank-pow ∘ leading-index`) or a richer rank shape.
325+
The remaining challenge in this constructor is the structural
326+
asymmetry: `rank-pow (bplus z₁ z₂)` lives "outside" the additive-
327+
principal closure, so the standard ω-power closure argument
328+
doesn't apply directly.
329+
* *Mutual recursion for `rank-pow-mono-<ᵇ⁻`*. The case-specific
330+
primitives above are individually proven, but the umbrella theorem
331+
`x <ᵇ⁻ y → rank-pow x <′ rank-pow y` needs a mutual `<ᵇ` / `≤ᵇ`
332+
recursion that pattern-matches on the source's WfCNF carrier to
333+
derive the tail bound `y ≤ᵇ x → rank-pow y ≤′ rank-pow x`. This
334+
is a structural argument; the primitives are already in place to
335+
feed it. Deferred pending the `<ᵇ-+1` resolution since that
336+
constructor is required for the case-completeness of the umbrella.
337+
338+
=== Status note
339+
340+
The "rank-embedding route is closed" framing from this document's
341+
introduction is *narrowed*: it remains true for the unrestricted
342+
`_<ᵇ_`, but the WfCNF restriction `_<ᵇ⁻_` together with the limit-
343+
shaped rank-pow discharges 9 of the 13 constructor cases. The
344+
remaining 3 constructors have well-understood structural blockers
345+
(ψ-admissibility for two; joint-bplus structural-rank for one)
346+
rather than the fundamental obstruction the original counterexample
347+
exhibited.
348+
253349
== See also
254350

255351
* `proofs/agda/Ordinal/Buchholz/Order.agda` — the K-free core; the

proofs/agda/Ordinal/Buchholz/RankPow.agda

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ open import Ordinal.OmegaMarkers using
5858
open import Ordinal.Brouwer using
5959
( Ord
6060
; oz
61+
; osuc
6162
; olim
6263
)
6364
open import Ordinal.Brouwer.Arithmetic using (_⊕_)
@@ -184,3 +185,167 @@ rank-pow-bplus-right-mono : ∀ {x y z}
184185
rank-pow (bplus x y) <′ rank-pow (bplus x z)
185186
rank-pow-bplus-right-mono {x} {y} {z} p =
186187
⊕-mono-<-right {rank-pow x} {rank-pow y} {rank-pow z} p
188+
189+
----------------------------------------------------------------------
190+
-- Left-≤-sum projection
191+
----------------------------------------------------------------------
192+
193+
-- The left summand of a `bplus` is always ≤′ the sum (in rank).
194+
-- Direct from `⊕-left-≤-sum` in Phase13.
195+
196+
open import Ordinal.Brouwer.Phase13 using (⊕-left-≤-sum; ≤′-trans)
197+
198+
rank-pow-bplus-left-≤ : x y rank-pow x ≤′ rank-pow (bplus x y)
199+
rank-pow-bplus-left-≤ x y = ⊕-left-≤-sum {rank-pow x} (rank-pow y)
200+
201+
-- `target <′ rank-pow x → target <′ rank-pow (bplus x y)`. Covers
202+
-- the rank-mono shape needed for `<ᵇ-Ω+` and `<ᵇ-ψ+`: source-side
203+
-- atomic (or smaller) is strictly less than the left of a bplus,
204+
-- hence strictly less than the bplus itself.
205+
206+
rank-pow-via-left : {target x y}
207+
target <′ rank-pow x
208+
target <′ rank-pow (bplus x y)
209+
rank-pow-via-left {target} {x} {y} p =
210+
≤′-trans {osuc target} {rank-pow x} {rank-pow (bplus x y)}
211+
p
212+
(rank-pow-bplus-left-≤ x y)
213+
214+
----------------------------------------------------------------------
215+
-- Additive-principal closure at `ω-rank-pow μ`
216+
----------------------------------------------------------------------
217+
218+
-- `ω-rank-pow μ` is closed under ordinal addition: for any α, β
219+
-- strictly below, the sum α ⊕ β is also strictly below. Direct
220+
-- consequence of `Ordinal.Brouwer.OmegaPow.additive-principal` for
221+
-- the `fin n` case; the `ω` case picks a common upper bound from
222+
-- both witnesses' branch indices.
223+
224+
open import Data.Nat.Base using (_+_; s≤s)
225+
open import Data.Nat.Properties using (m≤m+n; m≤n+m)
226+
227+
open import Ordinal.Brouwer.OmegaPow using
228+
( additive-principal
229+
; ω^-mono-≤
230+
)
231+
232+
additive-principal-ω-rank-pow : {μ α β}
233+
α <′ ω-rank-pow μ
234+
β <′ ω-rank-pow μ
235+
α ⊕ β <′ ω-rank-pow μ
236+
additive-principal-ω-rank-pow {fin n} pα pβ =
237+
additive-principal {n} pα pβ
238+
additive-principal-ω-rank-pow {ω} {α} {β} (kα , sα) (kβ , sβ) =
239+
(kα + kβ) , additive-principal {kα + kβ} α<sum β<sum
240+
where
241+
-- Lift α's witness from ω^(suc kα) to ω^(suc (kα + kβ)) via
242+
-- ω^-mono-≤ on `kα ≤ kα + kβ`.
243+
α<sum : α <′ ω^ (suc (kα + kβ))
244+
α<sum = ≤′-trans
245+
{osuc α} {ω^ (suc kα)} {ω^ (suc (kα + kβ))}
246+
247+
(ω^-mono-≤ (s≤s (m≤m+n kα kβ)))
248+
249+
-- Lift β's witness from ω^(suc kβ) to ω^(suc (kα + kβ)) via
250+
-- ω^-mono-≤ on `kβ ≤ kα + kβ`.
251+
β<sum : β <′ ω^ (suc (kα + kβ))
252+
β<sum = ≤′-trans
253+
{osuc β} {ω^ (suc kβ)} {ω^ (suc (kα + kβ))}
254+
255+
(ω^-mono-≤ (s≤s (m≤n+m kβ kα)))
256+
257+
----------------------------------------------------------------------
258+
-- "Plus-side into additive-principal target": the bplus shape
259+
-- `bplus x y` lands strictly below an additive-principal target when
260+
-- the left summand x does and the tail y is ≤′ x's rank.
261+
----------------------------------------------------------------------
262+
263+
-- This is the rank-side discharge for `<ᵇ-+Ω` and `<ᵇ-+ψ` under
264+
-- WfCNF. The WfCNF condition `y ≤ᵇ x` lifts to a rank inequality
265+
-- `rank-pow y ≤′ rank-pow x` (proved in Slice 5b once the
266+
-- `rank-pow-mono-≤ᵇ` corollary is in place); we take that as a
267+
-- separate hypothesis here so this primitive can be applied
268+
-- whenever a caller produces the tail bound (Slice 5 consumer or
269+
-- the `<ᵇʳᶠ` consumer's own WfCNF carrier).
270+
271+
rank-pow-bplus-into-ω-rank-pow : {x y μ}
272+
rank-pow x <′ ω-rank-pow μ
273+
rank-pow y ≤′ rank-pow x
274+
rank-pow (bplus x y) <′ ω-rank-pow μ
275+
rank-pow-bplus-into-ω-rank-pow {x} {y} {μ} px y≤x =
276+
additive-principal-ω-rank-pow {μ} px y<target
277+
where
278+
y<target : rank-pow y <′ ω-rank-pow μ
279+
y<target = ≤′-trans
280+
{osuc (rank-pow y)} {osuc (rank-pow x)} {ω-rank-pow μ}
281+
y≤x -- `osuc/osuc` clause: y≤x : rank y ≤′ rank x
282+
-- reduces to osuc (rank y) ≤′ osuc (rank x).
283+
px
284+
285+
----------------------------------------------------------------------
286+
-- Per-constructor rank-mono primitives (relation-agnostic)
287+
----------------------------------------------------------------------
288+
289+
-- One lemma per `_<ᵇ_` constructor, stated purely in terms of rank
290+
-- inequalities (not the relation itself). Consumers — `_<ᵇ⁻_`
291+
-- (this track, Slice 5b) and `_<ᵇʳᶠ_` (parallel-session track) —
292+
-- pattern-match on their own relation's constructor and apply the
293+
-- matching primitive below. The recursive structure lives in the
294+
-- consumer, not in `RankPow`.
295+
--
296+
-- Coverage:
297+
-- * 4 trivial cases (no premise on subterms): `<ᵇ-0-Ω`, `<ᵇ-0-ψ`,
298+
-- `<ᵇ-ΩΩ`, `<ᵇ-Ωψ`, `<ᵇ-ψΩ` — 5 actually, since `<ᵇ-ψΩ` is
299+
-- ω-rank-pow-mono. Pure structural facts.
300+
-- * 4 "via-left" cases: `<ᵇ-Ω+`, `<ᵇ-ψ+`, `<ᵇ-+Ω`, `<ᵇ-+ψ` — the
301+
-- `+` lives on one side; primitive takes a strict-on-left witness
302+
-- plus (for the `+` source cases) the WfCNF tail bound.
303+
-- * Deferred: `<ᵇ-ψα`, `<ᵇ-ψΩ≤` (admissibility-blocked under the
304+
-- provisional `rank-pow (bpsi ν _) = ω-rank-pow ν` shape) and
305+
-- `<ᵇ-+1` (joint-bplus, structurally hardest; needs a coarser
306+
-- bound or a refined rank).
307+
308+
rank-mono-<ᵇ-0-Ω : {μ} rank-pow bzero <′ rank-pow (bOmega μ)
309+
rank-mono-<ᵇ-0-Ω {μ} = ω-rank-pow-pos μ
310+
311+
rank-mono-<ᵇ-0-ψ : {ν α} rank-pow bzero <′ rank-pow (bpsi ν α)
312+
rank-mono-<ᵇ-0-ψ {ν} = ω-rank-pow-pos ν
313+
314+
rank-mono-<ᵇ-ΩΩ : {μ ν} μ <Ω ν
315+
rank-pow (bOmega μ) <′ rank-pow (bOmega ν)
316+
rank-mono-<ᵇ-ΩΩ p = ω-rank-pow-mono p
317+
318+
rank-mono-<ᵇ-Ωψ : {μ ν α} μ <Ω ν
319+
rank-pow (bOmega μ) <′ rank-pow (bpsi ν α)
320+
rank-mono-<ᵇ-Ωψ p = ω-rank-pow-mono p
321+
322+
rank-mono-<ᵇ-ψΩ : {μ ν α β} μ <Ω ν
323+
rank-pow (bpsi μ α) <′ rank-pow (bpsi ν β)
324+
rank-mono-<ᵇ-ψΩ p = ω-rank-pow-mono p
325+
326+
rank-mono-<ᵇ-Ω+ : {μ x y}
327+
rank-pow (bOmega μ) <′ rank-pow x
328+
rank-pow (bOmega μ) <′ rank-pow (bplus x y)
329+
rank-mono-<ᵇ-Ω+ {μ} {x} {y} p = rank-pow-via-left {rank-pow (bOmega μ)} {x} {y} p
330+
331+
rank-mono-<ᵇ-ψ+ : {ν α x y}
332+
rank-pow (bpsi ν α) <′ rank-pow x
333+
rank-pow (bpsi ν α) <′ rank-pow (bplus x y)
334+
rank-mono-<ᵇ-ψ+ {ν} {α} {x} {y} p =
335+
rank-pow-via-left {rank-pow (bpsi ν α)} {x} {y} p
336+
337+
rank-mono-<ᵇ-+Ω : {x y μ}
338+
rank-pow x <′ rank-pow (bOmega μ)
339+
rank-pow y ≤′ rank-pow x -- WfCNF tail bound (caller-provided)
340+
rank-pow (bplus x y) <′ rank-pow (bOmega μ)
341+
rank-mono-<ᵇ-+Ω {x} {y} {μ} px y≤x =
342+
rank-pow-bplus-into-ω-rank-pow {x} {y} {μ} px y≤x
343+
344+
rank-mono-<ᵇ-+ψ : {x y ν α}
345+
rank-pow x <′ rank-pow (bpsi ν α)
346+
rank-pow y ≤′ rank-pow x -- WfCNF tail bound (caller-provided)
347+
rank-pow (bplus x y) <′ rank-pow (bpsi ν α)
348+
rank-mono-<ᵇ-+ψ {x} {y} {ν} {α} px y≤x =
349+
-- `rank-pow (bpsi ν α) = ω-rank-pow ν` (provisional shape), so
350+
-- this reduces to the `<ᵇ-+Ω`-shaped argument at target ν.
351+
rank-pow-bplus-into-ω-rank-pow {x} {y} {ν} px y≤x

proofs/agda/Smoke.agda

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,19 @@ open import Ordinal.Buchholz.RankPow using
473473
; rank-pow-bplus
474474
; rank-pow-bOmega
475475
; rank-pow-bplus-right-mono
476+
; rank-pow-bplus-left-≤
477+
; rank-pow-via-left
478+
; additive-principal-ω-rank-pow
479+
; rank-pow-bplus-into-ω-rank-pow
480+
; rank-mono-<ᵇ-0-Ω
481+
; rank-mono-<ᵇ-0-ψ
482+
; rank-mono-<ᵇ-ΩΩ
483+
; rank-mono-<ᵇ-Ωψ
484+
; rank-mono-<ᵇ-ψΩ
485+
; rank-mono-<ᵇ-Ω+
486+
; rank-mono-<ᵇ-ψ+
487+
; rank-mono-<ᵇ-+Ω
488+
; rank-mono-<ᵇ-+ψ
476489
)
477490

478491
open import Ordinal.OmegaMarkers using

0 commit comments

Comments
 (0)