Skip to content

Commit 675a215

Browse files
proof(ordinal): doubled-ladder bplus-on-left rank2-mono primitives (+Ω, +ψ, +1) — all 12 constructors (#207)
## What Closes the per-constructor `rank2`-monotonicity family for the **bplus-on-left** constructors of the core `_<ᵇ_` — with these, **all 12 constructors** now have a `rank2`-mono primitive. Two commits: **1. Ω-block additive principality + `<ᵇ-+Ω`** (`RankDoubledLadderAddPrincipal.agda`) ```agda additive-principal-base : ∀ {B α β} → α <′ olim (λ k → B ·ℕ k) → β <′ olim (λ k → B ·ℕ k) → α ⊕ β <′ olim (λ k → B ·ℕ k) additive-principal-ω-rank-pow-succ : ∀ {μ α β} → α <′ ω-rank-pow-succ μ → β <′ ω-rank-pow-succ μ → α ⊕ β <′ ω-rank-pow-succ μ rank2-mono-+Ω : rank2 x <′ rank2 (bOmega μ) → rank2 y <′ rank2 (bOmega μ) → rank2 (bplus x y) <′ rank2 (bOmega μ) ``` The bplus-on-left constructors compare a **sum** `rank2 x ⊕ rank2 y` against the target, so the target must absorb the sum. `RankPow.additive-principal-ω-rank-pow` already covers the ψ-block target; this adds the Ω-block target — fin via the clean ω-power `ω^(suc(suc n))`, ω via `additive-principal-base` (the original proof re-stated over an arbitrary base, since it uses only `·ℕ-add-≤ {B}` + `⊕`-monotonicities) instantiated at `ω-rank-pow ω`. **2. `<ᵇ-+ψ`, `<ᵇ-+1`** (`RankDoubledLadderMonoPlus2.agda`) ```agda rank2-mono-+ψ : rank2 x <′ ω-rank-pow (double ν) → rank2 y <′ ω-rank-pow (double ν) → rank2 (bplus x y) <′ rank2 (bpsi ν α) rank2-mono-+1 : rank2 (bplus x₁ x₂) <′ rank2 y₁ → rank2 (bplus x₁ x₂) <′ rank2 (bplus y₁ y₂) ``` `+ψ` uses the ψ-block additive principality; `+1` (joint-bplus) is pure `⊕`-left-weakening once the source sum is below the target head. All primitives stated relation-agnostically (premises = recursive/tail bounds), per the established RankPow discipline. ## Progress **12 of 12** core `_<ᵇ_` constructors now have a `rank2`-mono primitive. Remaining capstone: the umbrella `rank2-mono : WfAdm x → WfAdm y → x <ᵇ y → rank2 x <′ rank2 y` (structural recursion discharging each primitive's premises, with a `rank2-mono-≤` tail companion for `y ≤ᵇ x`), then the `wf-<′`-transport headline `wf-<ᵇ`. ## Verification - `agda -i proofs/agda proofs/agda/All.agda` exits 0 under `--safe --without-K`. - Headlines pinned in the Buchholz `Smoke.agda` (own blocks). - Zero postulates / escape pragmas. https://claude.ai/code/session_017t53M7W7ubmXpwymveLcCE --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 3890530 commit 675a215

4 files changed

Lines changed: 242 additions & 0 deletions

File tree

proofs/agda/All.agda

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ open import Ordinal.Buchholz.RankPowSlice3Headline
155155
open import Ordinal.Buchholz.RankDoubledLadder
156156
open import Ordinal.Buchholz.RankDoubledLadderMono
157157
open import Ordinal.Buchholz.RankDoubledLadderMonoPlus
158+
open import Ordinal.Buchholz.RankDoubledLadderAddPrincipal
159+
open import Ordinal.Buchholz.RankDoubledLadderMonoPlus2
158160
open import Ordinal.Buchholz.RankMonoUmbrella
159161
open import Ordinal.Buchholz.RankMonoUmbrellaSlice3
160162
open import Ordinal.Buchholz.RankMonoUmbrellaSlice4
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
{-# OPTIONS --safe --without-K #-}
2+
-- SPDX-License-Identifier: MPL-2.0
3+
-- SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
4+
5+
-- Doubled-ladder rank monotonicity — additive-principality of the
6+
-- Ω-block target + the `<ᵇ-+Ω` primitive (2026-06-14).
7+
--
8+
-- ## Why this exists
9+
--
10+
-- The bplus-ON-LEFT constructors (`<ᵇ-+Ω`, `<ᵇ-+ψ`, `<ᵇ-+1`) compare
11+
-- a SUM `rank2 x ⊕ rank2 y` against the target rank. Closing them
12+
-- needs the target to ABSORB the sum — i.e. additive principality of
13+
-- the target rank. This slice supplies that for the Ω-block target
14+
-- `ω-rank-pow-succ (double μ) = rank2 (bOmega μ)`, and uses it to
15+
-- discharge the first of the three, `<ᵇ-+Ω`.
16+
--
17+
-- `RankPow.additive-principal-ω-rank-pow` already gives additive
18+
-- principality for the ψ-block target `ω-rank-pow μ`. The Ω-block
19+
-- target `ω-rank-pow-succ μ` needs its own proof:
20+
--
21+
-- * fin branch — `ω-rank-pow-succ (fin n) = ω^(suc (suc n))` is a
22+
-- clean ω-power, so the existing `OmegaPow.additive-principal`
23+
-- (additive principality of `ω^(suc k)`) applies at `k = suc n`.
24+
-- * ω branch — `ω-rank-pow-succ ω = olim (λ n → ω-rank-pow ω ·ℕ n)`
25+
-- (= ω^(ω+1)) has the SAME limit shape `olim (λ k → B ·ℕ k)` that
26+
-- `OmegaPow.additive-principal` exploits, only with base
27+
-- `B = ω-rank-pow ω` instead of `ω^ n`. The proof there is
28+
-- generic in the base (it uses only `·ℕ-add-≤ {B}` and the `⊕`
29+
-- monotonicities), so this module re-states it once as
30+
-- `additive-principal-base` over an arbitrary base and instantiates
31+
-- at `B = ω-rank-pow ω`.
32+
--
33+
-- ## Honest scope
34+
--
35+
-- Lands `additive-principal-base`, `additive-principal-ω-rank-pow-succ`,
36+
-- and the `<ᵇ-+Ω` rank2-mono primitive `rank2-mono-+Ω`. The two
37+
-- remaining bplus-on-left cases (`<ᵇ-+ψ`, `<ᵇ-+1`) have NON-ω-power
38+
-- targets (a ψ-block sum / a bplus sum) and need the tail-ordering
39+
-- machinery (`y ≤ᵇ x` → rank bound) — deferred to the umbrella slice.
40+
--
41+
-- ## Headlines (pin in `Ordinal/Buchholz/Smoke.agda`)
42+
--
43+
-- * `additive-principal-ω-rank-pow-succ`
44+
-- * `rank2-mono-+Ω`
45+
46+
module Ordinal.Buchholz.RankDoubledLadderAddPrincipal where
47+
48+
open import Data.Nat using (ℕ; suc; _+_)
49+
open import Data.Product.Base using (_,_)
50+
51+
open import Ordinal.Brouwer using (Ord; osuc; olim)
52+
open import Ordinal.Brouwer.Phase13 using
53+
( _<′_
54+
; _≤′_
55+
; ≤′-trans
56+
; ≤′-self-osuc
57+
; ⊕-mono-≤-left
58+
; ⊕-mono-<-right
59+
)
60+
open import Ordinal.Brouwer.Arithmetic using (_⊕_)
61+
open import Ordinal.Brouwer.OmegaPow using (_·ℕ_; ·ℕ-add-≤; additive-principal)
62+
open import Ordinal.OmegaMarkers using (OmegaIndex; fin; ω)
63+
open import Ordinal.Buchholz.Syntax using (BT; bOmega; bplus)
64+
open import Ordinal.Buchholz.RankPow using (ω-rank-pow; ω-rank-pow-succ)
65+
open import Ordinal.Buchholz.RankDoubledLadder using (rank2; double)
66+
67+
----------------------------------------------------------------------
68+
-- Base-generic additive principality of `olim (λ k → B ·ℕ k)`
69+
----------------------------------------------------------------------
70+
71+
-- A re-statement of `OmegaPow.additive-principal` over an ARBITRARY
72+
-- base `B`. The original proof at `OmegaPow.agda:361` uses only
73+
-- `·ℕ-add-≤ {B}` and the `⊕`-monotonicities — nothing specific to
74+
-- `B = ω^ n` — so it transfers verbatim with `ω^ n ↦ B`. Needed for
75+
-- the ω-marker Ω-block target `ω-rank-pow-succ ω =
76+
-- olim (λ n → ω-rank-pow ω ·ℕ n)`.
77+
additive-principal-base : {B α β}
78+
α <′ olim (λ k B ·ℕ k)
79+
β <′ olim (λ k B ·ℕ k)
80+
α ⊕ β <′ olim (λ k B ·ℕ k)
81+
additive-principal-base {B} {α} {β} (kα , sα) (kβ , sβ) = kβ + kα , proof
82+
where
83+
α≤′kα : α ≤′ B ·ℕ kα
84+
α≤′kα = ≤′-trans {α} {osuc α} {B ·ℕ kα} (≤′-self-osuc α) sα
85+
86+
step1 : α ⊕ β ≤′ (B ·ℕ kα) ⊕ β
87+
step1 = ⊕-mono-≤-left {α} {B ·ℕ kα} {β} α≤′kα
88+
89+
step2 : osuc ((B ·ℕ kα) ⊕ β) ≤′ (B ·ℕ kα) ⊕ (B ·ℕ kβ)
90+
step2 = ⊕-mono-<-right {B ·ℕ kα} {β} {B ·ℕ kβ} sβ
91+
92+
step3 : (B ·ℕ kα) ⊕ (B ·ℕ kβ) ≤′ B ·ℕ (kβ + kα)
93+
step3 = ·ℕ-add-≤ {B} kα kβ
94+
95+
proof : osuc (α ⊕ β) ≤′ B ·ℕ (kβ + kα)
96+
proof =
97+
≤′-trans
98+
{osuc (α ⊕ β)} {(B ·ℕ kα) ⊕ (B ·ℕ kβ)} {B ·ℕ (kβ + kα)}
99+
(≤′-trans
100+
{osuc (α ⊕ β)} {osuc ((B ·ℕ kα) ⊕ β)} {(B ·ℕ kα) ⊕ (B ·ℕ kβ)}
101+
step1 step2)
102+
step3
103+
104+
----------------------------------------------------------------------
105+
-- Additive principality of the Ω-block target `ω-rank-pow-succ μ`
106+
----------------------------------------------------------------------
107+
108+
-- The Ω-block analogue of `RankPow.additive-principal-ω-rank-pow`.
109+
-- fin: reuse `OmegaPow.additive-principal` at the doubled successor
110+
-- exponent; ω: instantiate `additive-principal-base` at the base
111+
-- `ω-rank-pow ω`.
112+
additive-principal-ω-rank-pow-succ : {μ α β}
113+
α <′ ω-rank-pow-succ μ
114+
β <′ ω-rank-pow-succ μ
115+
α ⊕ β <′ ω-rank-pow-succ μ
116+
additive-principal-ω-rank-pow-succ {fin n} pα pβ =
117+
additive-principal {suc n} pα pβ
118+
additive-principal-ω-rank-pow-succ {ω} pα pβ =
119+
additive-principal-base {ω-rank-pow ω} pα pβ
120+
121+
----------------------------------------------------------------------
122+
-- The `<ᵇ-+Ω` rank2-mono primitive
123+
----------------------------------------------------------------------
124+
125+
-- `<ᵇ-+Ω : x <ᵇ bOmega μ → bplus x y <ᵇ bOmega μ`. The whole sum
126+
-- `rank2 x ⊕ rank2 y` lands below the Ω-block target when BOTH
127+
-- summands do — the left bound is the IH on the sub-derivation
128+
-- `x <ᵇ bOmega μ`, the right bound is the tail bound (from `y ≤ᵇ x`,
129+
-- supplied by the umbrella consumer). Stated relation-agnostically:
130+
-- both bounds are premises.
131+
rank2-mono-+Ω : {x y μ}
132+
rank2 x <′ rank2 (bOmega μ)
133+
rank2 y <′ rank2 (bOmega μ)
134+
rank2 (bplus x y) <′ rank2 (bOmega μ)
135+
rank2-mono-+Ω {x} {y} {μ} px py =
136+
additive-principal-ω-rank-pow-succ {double μ} px py
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
{-# OPTIONS --safe --without-K #-}
2+
-- SPDX-License-Identifier: MPL-2.0
3+
-- SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
4+
5+
-- Doubled-ladder rank monotonicity — the last two bplus-on-left
6+
-- primitives `<ᵇ-+ψ`, `<ᵇ-+1` (2026-06-14).
7+
--
8+
-- ## Why this exists
9+
--
10+
-- With `<ᵇ-+Ω` closed (`RankDoubledLadderAddPrincipal`), the two
11+
-- remaining bplus-on-left constructors of the core `_<ᵇ_` are:
12+
--
13+
-- * `<ᵇ-+ψ : x <ᵇ bpsi ν α → bplus x y <ᵇ bpsi ν α`
14+
-- * `<ᵇ-+1 : x₁ <ᵇ y₁ → bplus x₁ x₂ <ᵇ bplus y₁ y₂`
15+
--
16+
-- Both ship as relation-agnostic `rank2`-mono primitives — the same
17+
-- discipline as the rest of the family. The genuinely-hard content
18+
-- (discharging the premise bounds from the WfCNF tail order `y ≤ᵇ x`
19+
-- and the sub-derivations) lives in the umbrella that consumes these;
20+
-- the primitives themselves are pure `⊕`-arithmetic:
21+
--
22+
-- * `<ᵇ-+ψ` — the ψ-block leading power `ω-rank-pow (double ν)` is
23+
-- additive principal (`RankPow.additive-principal-ω-rank-pow`), so
24+
-- if BOTH source summands rank below it, their sum does too, and
25+
-- the target ψ-rank only ADDS its argument on the right.
26+
-- * `<ᵇ-+1` — if the WHOLE source sum ranks below the target's HEAD
27+
-- `rank2 y₁`, then it ranks below the target sum (the target's tail
28+
-- only adds).
29+
--
30+
-- ## Completion
31+
--
32+
-- With these two, ALL 12 core `_<ᵇ_` constructors have a `rank2`-mono
33+
-- primitive. The follow-on is the umbrella
34+
-- `rank2-mono : WfAdm x → WfAdm y → x <ᵇ y → rank2 x <′ rank2 y`
35+
-- (structural recursion that discharges each primitive's premises,
36+
-- needing a `rank2-mono-≤` tail-bound companion for `y ≤ᵇ x`) and the
37+
-- `wf-<′`-transport headline `wf-<ᵇ`.
38+
--
39+
-- ## Headlines (pin in `Ordinal/Buchholz/Smoke.agda`)
40+
--
41+
-- * `rank2-mono-+ψ`
42+
-- * `rank2-mono-+1`
43+
44+
module Ordinal.Buchholz.RankDoubledLadderMonoPlus2 where
45+
46+
open import Ordinal.Brouwer.Phase13 using (_<′_; ⊕-left-≤-sum)
47+
open import Ordinal.Brouwer.Arithmetic using (_⊕_)
48+
open import Ordinal.Buchholz.Syntax using (BT; bpsi; bplus)
49+
open import Ordinal.Buchholz.RankPow using (ω-rank-pow; additive-principal-ω-rank-pow)
50+
open import Ordinal.Buchholz.RankDoubledLadder using (rank2; double)
51+
open import Ordinal.Buchholz.RankDoubledLadderMono using (<′-≤′-trans)
52+
53+
----------------------------------------------------------------------
54+
-- `<ᵇ-+ψ` — bplus source against a ψ target
55+
----------------------------------------------------------------------
56+
57+
-- `<ᵇ-+ψ : x <ᵇ bpsi ν α → bplus x y <ᵇ bpsi ν α`. The ψ-block
58+
-- leading power `ω-rank-pow (double ν)` is additive principal, so
59+
-- both source summands ranking below it makes the sum rank below it;
60+
-- the target ψ-rank `ω-rank-pow (double ν) ⊕ rank2 α` then only adds.
61+
-- Premises (supplied by the umbrella): the left bound is the IH on
62+
-- `x <ᵇ bpsi ν α`, the right is the tail bound from `y ≤ᵇ x`.
63+
rank2-mono-+ψ : {x y ν α}
64+
rank2 x <′ ω-rank-pow (double ν)
65+
rank2 y <′ ω-rank-pow (double ν)
66+
rank2 (bplus x y) <′ rank2 (bpsi ν α)
67+
rank2-mono-+ψ {x} {y} {ν} {α} px py =
68+
<′-≤′-trans {rank2 x ⊕ rank2 y} {ω-rank-pow (double ν)}
69+
{ω-rank-pow (double ν) ⊕ rank2 α}
70+
(additive-principal-ω-rank-pow {double ν} px py)
71+
(⊕-left-≤-sum {ω-rank-pow (double ν)} (rank2 α))
72+
73+
----------------------------------------------------------------------
74+
-- `<ᵇ-+1` — joint bplus
75+
----------------------------------------------------------------------
76+
77+
-- `<ᵇ-+1 : x₁ <ᵇ y₁ → bplus x₁ x₂ <ᵇ bplus y₁ y₂`. If the WHOLE
78+
-- source sum ranks below the target's HEAD `rank2 y₁`, it ranks below
79+
-- the target sum (the target tail `rank2 y₂` only adds on the right).
80+
-- The premise — source sum below target head — is what the umbrella
81+
-- derives from `x₁ <ᵇ y₁` plus the tail order `x₂ ≤ᵇ x₁`; this is the
82+
-- joint-bplus discharge the doubled ladder was ultimately built for.
83+
rank2-mono-+1 : {x₁ x₂ y₁ y₂}
84+
rank2 (bplus x₁ x₂) <′ rank2 y₁
85+
rank2 (bplus x₁ x₂) <′ rank2 (bplus y₁ y₂)
86+
rank2-mono-+1 {x₁} {x₂} {y₁} {y₂} p =
87+
<′-≤′-trans {rank2 x₁ ⊕ rank2 x₂} {rank2 y₁} {rank2 y₁ ⊕ rank2 y₂}
88+
p
89+
(⊕-left-≤-sum {rank2 y₁} (rank2 y₂))

proofs/agda/Ordinal/Buchholz/Smoke.agda

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,21 @@ open import Ordinal.Buchholz.RankDoubledLadderMonoPlus using
496496
; rank2-mono-ψ+
497497
)
498498

499+
-- Doubled-ladder Ω-block additive principality + the `<ᵇ-+Ω`
500+
-- primitive (own block per CLAUDE.md Working rules).
501+
open import Ordinal.Buchholz.RankDoubledLadderAddPrincipal using
502+
( additive-principal-ω-rank-pow-succ
503+
; rank2-mono-+Ω
504+
)
505+
506+
-- Doubled-ladder last two bplus-on-left primitives `<ᵇ-+ψ`, `<ᵇ-+1`
507+
-- (own block per CLAUDE.md Working rules) — completes all 12
508+
-- core `_<ᵇ_` constructors' rank2-mono primitives.
509+
open import Ordinal.Buchholz.RankDoubledLadderMonoPlus2 using
510+
( rank2-mono-+ψ
511+
; rank2-mono-+1
512+
)
513+
499514
-- Slice 3 prerequisites (own block per CLAUDE.md Working rules):
500515
-- the left-spine NonBzero predicate, the strict-jump bridge from
501516
-- `μ <Ω ν` to `ω-rank-pow-succ μ ≤′ ω-rank-pow ν`, and the head-Ω

0 commit comments

Comments
 (0)