Skip to content

Commit 8da0ea8

Browse files
hyperpolymathclaude
andcommitted
proof(Slice 3+4 Route A): (b) lex-first primitive + bpsi sub-case discharge
Extends `Ordinal.Buchholz.RankLexJointBplus` with three primitives advancing the rank-lex-jb pivot's (a)+(b)+(c) assembly plan beyond the (a) primitive that PR #147 shipped. No structural commitments, no funext, zero postulates, `--safe --without-K` throughout. ## Three primitives added 1. `rank-lex-jb-strict-first` (leg (b), trivial at primitive level) — given `rank-pow (bplus x₁ x₂) <′ rank-pow (bplus y₁ y₂)`, fires `<lex-first`. One-line proof. The load-bearing content is consumer-side derivation of the hypothesis, which remains the multi-PR ordinal-arithmetic challenge (both pre-identified unblock routes — additive-principal closure on a generic sum, strict-left-mono of `_⊕_` — CHECKED-REFUTED in PR #146). Shipping the primitive separates trivial lex-rank wiring from the structural ordinal-arithmetic blocker. 2. `leftmost-α-strict-from-bpsi-source` (consumer helper) — given `α <ᵇ⁰ β` on the ψ-arguments, derives `leftmost-α (bplus (bpsi ν α) x₂) <′ leftmost-α (bplus (bpsi ν β) y₂)`. Composes `leftmost-α-bplus` + `leftmost-α-bpsi` (both definitional) with `RankMonoUmbrella.rank-pow-mono-<ᵇ⁰`. Parameterised in `_<ᵇ⁰_` (10-constructor umbrella) — the bpsi sub-case requires no constructor `_<ᵇ⁰_` doesn't already have. 3. `rank-lex-jb-bpsi-at-equality` (named theorem) — composition of `rank-lex-jb-strict-second-at-equal-first` (PR #147, leg (a)) with `leftmost-α-strict-from-bpsi-source`. Given the FIRST-COMPONENT EQUALITY (consumer-derived, gating obligation) plus the source-side `α <ᵇ⁰ β`, fires `<lex-second` at equal first components with the leftmost-α strict witness. Closes the bpsi-source-at-equality sub-case at the rank-lex-jb level, parallel to `RankLexSlice3.rank-lex-bpsi-strict-at-equality`'s role for `rank-lex`. ## Where this sits in the assembly Per the PR #147 module preamble's `(a)+(b)+(c)` plan: - (a) equal-first lex-second leg — CLOSED in PR #147. - (b) strict-first lex-first leg — primitive CLOSED here; consumer-side derivation of `rank-pow (bplus _ _) <′ rank-pow (bplus _ _)` remains the multi-PR challenge. - (c) first-component trichotomy — STILL OPEN (Ord-valued decidability bridge in `Phase13` not yet attempted; `with`-based case-analysis over `_<′_` / `_≡_` is the sketched alternative). - 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 notes (preserved in module) - The trivial `<lex-first` shape of primitive (1) does not mean leg (b) is "done" — the consumer plumbing is the hard part. - Primitive (2) is `_<ᵇ⁰_`-parameterised, not `_<ᵇ_`-parameterised. Lifting to full `_<ᵇ_` requires the joint-bplus closure that the rank-lex-jb pivot was designed to attack. - Primitive (3) requires the first-eq hypothesis as input; consumer-side derivation is documented as still-gating per the file preamble. ## 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. All three primitives pinned in `Ordinal/Buchholz/Smoke.agda` under the existing `RankLexJointBplus` `using` block. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 1605fb2 commit 8da0ea8

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)