Skip to content

Commit f21c62f

Browse files
proof(Slice 3+4 Route A): (b) lex-first primitive + bpsi sub-case discharge (#165)
## Summary Advances the rank-lex-jb pivot's `(a)+(b)+(c)` assembly plan beyond the (a) primitive that PR #147 shipped. Three primitives added to \`Ordinal.Buchholz.RankLexJointBplus\` and pinned in \`Ordinal/Buchholz/Smoke.agda\`. Zero postulates, \`--safe --without-K\`, no funext. ## Three primitives | Primitive | Type | Role | |---|---|---| | \`rank-lex-jb-strict-first\` | \`rank-pow (bplus _ _) <′ rank-pow (bplus _ _) → rank-lex-jb _ <lex rank-lex-jb _\` | Leg (b) primitive; one-line via \`<lex-first\` | | \`leftmost-α-strict-from-bpsi-source\` | \`α <ᵇ⁰ β → leftmost-α (bplus (bpsi ν α) x₂) <′ leftmost-α (bplus (bpsi ν β) y₂)\` | Consumer helper composing \`leftmost-α-{bplus,bpsi}\` with \`rank-pow-mono-<ᵇ⁰\` | | \`rank-lex-jb-bpsi-at-equality\` | \`first-eq → α <ᵇ⁰ β → rank-lex-jb _ <lex rank-lex-jb _\` | Named theorem closing the bpsi-source-at-equality sub-case at rank-lex-jb level, gated on first-eq hypothesis | ## Where this sits in the assembly Per the PR #147 module preamble's \`(a)+(b)+(c)\` plan (see \`RankLexJointBplus.agda\` preamble): - **(a) equal-first lex-second leg** — CLOSED in PR #147 (\`rank-lex-jb-strict-second-at-equal-first\`). - **(b) strict-first lex-first leg** — primitive CLOSED here; consumer-side derivation of \`rank-pow (bplus _ _) <′ rank-pow (bplus _ _)\` remains the multi-PR ordinal-arithmetic challenge. - **(c) first-component trichotomy** — STILL OPEN (Ord-valued decidability bridge in \`Phase13\` not yet attempted). - **Assembly into full \`<ᵇ-+1\`-at-equal-head headline** = multi-PR follow-on, still gated on (c). This slice records that every other discharge step composes cleanly (the bpsi sub-case now ships as a named theorem under the first-eq hypothesis); resolving the gating obligations unblocks the headline mechanically. ## Honest scope (preserved in module preambles) - The trivial \`<lex-first\` shape of primitive (1) does **not** mean leg (b) is "done" — the consumer plumbing is the hard part. Both pre-identified unblock routes (additive-principal closure on a generic sum, strict-left-mono of \`_⊕_\`) are CHECKED-REFUTED in PR #146. - Primitive (2) is \`_<ᵇ⁰_\`-parameterised, not \`_<ᵇ_\`-parameterised. Lifting to full \`_<ᵇ_\` requires the joint-bplus closure that this very pivot was designed to attack. - Primitive (3) requires the first-eq hypothesis as input; consumer-side derivation is the gating obligation. ## Local verification - \`agda -i proofs/agda proofs/agda/Ordinal/Buchholz/RankLexJointBplus.agda\` — clean. - \`agda -i proofs/agda proofs/agda/Ordinal/Buchholz/Smoke.agda\` — clean, exit 0. - \`agda -i proofs/agda proofs/agda/Smoke.agda\` — clean, exit 0. - \`agda -i proofs/agda proofs/agda/All.agda\` — clean, exit 0. - \`bash tools/check-guardrails.sh proofs/agda\` — 160 modules pass. - \`sh scripts/kernel-guard.sh\` — PASS. ## Test plan - [x] All four Agda lanes typecheck locally. - [x] Three new primitives pinned in Buchholz Smoke. - [x] Foundation guardrail + kernel-guard pass. - [ ] CI: \`check\` + \`cold-check\` + governance lanes green. - [ ] Auto-merge on green. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 1605fb2 commit f21c62f

2 files changed

Lines changed: 102 additions & 0 deletions

File tree

proofs/agda/Ordinal/Buchholz/RankLexJointBplus.agda

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,13 @@ open import Ordinal.Buchholz.RankLex using
130130
( RankLex
131131
; mkLex
132132
; _<lex_
133+
; <lex-first
133134
; <lex-second
134135
)
136+
open import Ordinal.Buchholz.RankMonoUmbrella using
137+
( _<ᵇ⁰_
138+
; rank-pow-mono-<ᵇ⁰
139+
)
135140

136141
----------------------------------------------------------------------
137142
-- `leftmost-α : BT → Ord` — the leftmost-ψ-α-rank discriminator
@@ -273,3 +278,97 @@ rank-lex-jb-strict-second-at-equal-first {x₁} {x₂} {y₁} {y₂} first-eq st
273278
-- Local `sym` to avoid an extra stdlib import.
274279
sym-≡ : {ℓ} {A : Set ℓ} {a b : A} a ≡ b b ≡ a
275280
sym-≡ refl = refl
281+
282+
----------------------------------------------------------------------
283+
-- Headline: `<lex-first` at strict first components (leg (b))
284+
----------------------------------------------------------------------
285+
286+
-- The companion primitive to `rank-lex-jb-strict-second-at-equal-
287+
-- first`. Trivial at the rank-lex-jb level: `<lex-first` fires
288+
-- directly on the supplied strict first-component witness. The
289+
-- LOAD-BEARING content is the consumer-side derivation of the
290+
-- hypothesis `rank-pow (bplus x₁ x₂) <′ rank-pow (bplus y₁ y₂)`
291+
-- from a source `<ᵇ` derivation, which remains the multi-PR
292+
-- ordinal-arithmetic challenge documented in this module's
293+
-- preamble (both pre-identified unblock routes — additive-principal
294+
-- closure on a generic sum, strict-left-mono of `_⊕_` — are
295+
-- CHECKED-REFUTED in `Ordinal.Brouwer.{AdditivePrincipalGenericRefuted,
296+
-- StrictLeftMonoRefuted}` (PR #146, 2026-05-28)). Shipping the
297+
-- primitive separates the trivial lex-rank wiring from the
298+
-- structural ordinal-arithmetic blocker — consumers that derive
299+
-- strict-first via a future bypass (or a restricted bplus-shape
300+
-- where rank-pow IS additive principal) fire `<lex-first` through
301+
-- this primitive without re-discovering the wiring.
302+
303+
rank-lex-jb-strict-first :
304+
{x₁ x₂ y₁ y₂}
305+
rank-pow (bplus x₁ x₂) <′ rank-pow (bplus y₁ y₂)
306+
rank-lex-jb (bplus x₁ x₂) <lex rank-lex-jb (bplus y₁ y₂)
307+
rank-lex-jb-strict-first strict = <lex-first strict
308+
309+
----------------------------------------------------------------------
310+
-- Consumer helper: leftmost-α strict-mono from a bpsi-source `<ᵇ⁰`
311+
----------------------------------------------------------------------
312+
313+
-- The bpsi-source-at-equality bplus-chain sub-case has
314+
-- `x₁ = bpsi ν α` and `y₁ = bpsi ν β` (same ν per the sub-case
315+
-- definition). Given the source-side `α <ᵇ⁰ β` derivation, the
316+
-- leftmost-α discriminator on both bplus chains specialises:
317+
--
318+
-- leftmost-α (bplus (bpsi ν α) x₂) = leftmost-α (bpsi ν α)
319+
-- = rank-pow α
320+
-- leftmost-α (bplus (bpsi ν β) y₂) = rank-pow β
321+
--
322+
-- and `rank-pow α <′ rank-pow β` follows from
323+
-- `RankMonoUmbrella.rank-pow-mono-<ᵇ⁰` on the supplied `α <ᵇ⁰ β`.
324+
-- The reductions `leftmost-α-bplus` + `leftmost-α-bpsi` are
325+
-- definitional, so the helper is a one-step inhabitation: the
326+
-- supplied `<′` is already the goal's `<′` modulo definitional
327+
-- reduction on `leftmost-α`.
328+
--
329+
-- Honest scope: parameterised in `_<ᵇ⁰_`, not `_<ᵇ_`. The
330+
-- 10-constructor `_<ᵇ⁰_` umbrella covers the bpsi sub-case (no
331+
-- `<ᵇ-+1` joint-bplus constructor in `_<ᵇ⁰_`), so consumers with
332+
-- a `_<ᵇ⁰_` derivation on the ψ-arguments compose directly.
333+
-- Lifting to the full `_<ᵇ_` would need the joint-bplus closure,
334+
-- which is the very problem this rank-lex-jb pivot was designed
335+
-- to attack.
336+
337+
leftmost-α-strict-from-bpsi-source :
338+
{ν α β x₂ y₂}
339+
α <ᵇ⁰ β
340+
leftmost-α (bplus (bpsi ν α) x₂) <′ leftmost-α (bplus (bpsi ν β) y₂)
341+
leftmost-α-strict-from-bpsi-source α<β = rank-pow-mono-<ᵇ⁰ α<β
342+
343+
----------------------------------------------------------------------
344+
-- Named theorem: bpsi-source-at-equality sub-case at rank-lex-jb
345+
----------------------------------------------------------------------
346+
347+
-- Composition of `rank-lex-jb-strict-second-at-equal-first` with
348+
-- `leftmost-α-strict-from-bpsi-source`. Given:
349+
--
350+
-- * the FIRST-COMPONENT EQUALITY `rank-pow (bplus (bpsi ν α) x₂)
351+
-- ≡ rank-pow (bplus (bpsi ν β) y₂)` — consumer's input, gated
352+
-- on the structurally-blocked bplus-chain sum-bound work; AND
353+
-- * the source-side `α <ᵇ⁰ β` derivation on the ψ-arguments,
354+
--
355+
-- the headline fires `<lex-second` at equal first components with
356+
-- the leftmost-α strict witness. This is the bpsi-source-at-
357+
-- equality sub-case CLOSED at the rank-lex-jb level (parallel to
358+
-- `RankLexSlice3.rank-lex-bpsi-strict-at-equality` for `rank-lex`).
359+
--
360+
-- The first-eq hypothesis remains the gating obligation; this
361+
-- theorem records that EVERY other discharge step composes
362+
-- cleanly, so resolving the structural blocker unblocks the named
363+
-- theorem mechanically.
364+
365+
rank-lex-jb-bpsi-at-equality :
366+
{ν α β x₂ y₂}
367+
rank-pow (bplus (bpsi ν α) x₂) ≡ rank-pow (bplus (bpsi ν β) y₂)
368+
α <ᵇ⁰ β
369+
rank-lex-jb (bplus (bpsi ν α) x₂) <lex rank-lex-jb (bplus (bpsi ν β) y₂)
370+
rank-lex-jb-bpsi-at-equality {ν} {α} {β} {x₂} {y₂} first-eq α<β =
371+
rank-lex-jb-strict-second-at-equal-first
372+
{x₁ = bpsi ν α} {x₂ = x₂} {y₁ = bpsi ν β} {y₂ = y₂}
373+
first-eq
374+
(leftmost-α-strict-from-bpsi-source {ν = ν} {α = α} {β = β} {x₂ = x₂} {y₂ = y₂} α<β)

proofs/agda/Ordinal/Buchholz/Smoke.agda

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,9 @@ open import Ordinal.Buchholz.RankLexJointBplus using
536536
( leftmost-α
537537
; rank-lex-jb
538538
; rank-lex-jb-strict-second-at-equal-first
539+
; rank-lex-jb-strict-first
540+
; leftmost-α-strict-from-bpsi-source
541+
; rank-lex-jb-bpsi-at-equality
539542
)
540543

541544
-- Slice 4 narrowing 2026-05-28 (own block per CLAUDE.md Working

0 commit comments

Comments
 (0)