Skip to content

Commit d327b0e

Browse files
hyperpolymathclaude
andcommitted
agda(EchoLinear): per-decoration composition rung — linear/affine mode case
Recovered from stash@{4} (work-in-progress was preserved through the unscheduled shutdown). Mirrors the EchoGraded recipe for the two-mode linear ⊑ affine decoration: * ≤m-prop — the order _≤m_ is propositional; three refl-clauses, one per constructor pair. * _⊔m_, ≤m-⊔m-left, ≤m-⊔m-right, ≤m-⊔m-univ — categorical join in _≤m_; affine is the top. * degradeMode-compose — for any factoring m1 ≤m m2 ≤m m3 and any direct p13 : m1 ≤m m3, degradeMode p23 (degradeMode p12 e) ≡ degradeMode p13 e. Corollary of degradeMode-comp + ≤m-prop. * degradeMode-via-join — same statement restated through the join structure. Smoke.agda pins all five new headlines. Closes the linearity-side of the rung listed under "Open at this rung" in CLAUDE.md. The remaining decorations (EchoIndexed has landed; EchoChoreo and EchoEpistemic remain) follow the same recipe. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 36d4396 commit d327b0e

2 files changed

Lines changed: 130 additions & 0 deletions

File tree

proofs/agda/EchoLinear.agda

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,126 @@ affine-canonical (tt , tt) = refl
4747

4848
affine-all-equal : (e1 e2 : LEcho affine) e1 ≡ e2
4949
affine-all-equal e1 e2 = trans (affine-canonical e1) (sym (affine-canonical e2))
50+
51+
-- Per-decoration composition lemma.
52+
--
53+
-- Mirrors `EchoGraded.degrade-comp` for the two-mode (linear ⊑ affine)
54+
-- linearity decoration: weakening between modes commutes with
55+
-- transitive composition of the mode-ordering. See
56+
-- docs/echo-types/composition.md §6 (decoration commuting) and
57+
-- docs/echo-types/roadmap.md "Per-decoration composition lemmas".
58+
--
59+
-- The mode ordering is the smallest reflexive-and-`linear≤affine`
60+
-- relation: linear ⊑ linear, linear ⊑ affine, affine ⊑ affine. The
61+
-- weakening `degradeMode` reuses `weaken` for the strict step and
62+
-- the identity on the reflexive cases. Composition then closes
63+
-- definitionally on every constructor pair, exactly as in
64+
-- `EchoGraded.degrade-comp`.
65+
66+
data _≤m_ : Mode Mode Set where
67+
linear≤linear : linear ≤m linear
68+
linear≤affine : linear ≤m affine
69+
affine≤affine : affine ≤m affine
70+
71+
≤m-trans : {m1 m2 m3} m1 ≤m m2 m2 ≤m m3 m1 ≤m m3
72+
≤m-trans linear≤linear p23 = p23
73+
≤m-trans linear≤affine affine≤affine = linear≤affine
74+
≤m-trans affine≤affine affine≤affine = affine≤affine
75+
76+
degradeMode : {m1 m2} m1 ≤m m2 LEcho m1 LEcho m2
77+
degradeMode linear≤linear e = e
78+
degradeMode linear≤affine e = weaken e
79+
degradeMode affine≤affine e = e
80+
81+
-- Headline per-decoration composition lemma: two successive mode
82+
-- weakenings agree with a single weakening along the composed
83+
-- ordering proof.
84+
degradeMode-comp :
85+
{m1 m2 m3}
86+
(p12 : m1 ≤m m2)
87+
(p23 : m2 ≤m m3)
88+
(e : LEcho m1)
89+
degradeMode p23 (degradeMode p12 e) ≡ degradeMode (≤m-trans p12 p23) e
90+
degradeMode-comp linear≤linear p23 e = refl
91+
degradeMode-comp linear≤affine affine≤affine e = refl
92+
degradeMode-comp affine≤affine affine≤affine e = refl
93+
94+
-- Identity weakening corollary: degrading along a reflexive proof
95+
-- is the identity. Useful when chaining with `degradeMode-comp`.
96+
degradeMode-id-linear : (e : LEcho linear) degradeMode linear≤linear e ≡ e
97+
degradeMode-id-linear _ = refl
98+
99+
degradeMode-id-affine : (e : LEcho affine) degradeMode affine≤affine e ≡ e
100+
degradeMode-id-affine _ = refl
101+
102+
-- The strict mode step `degradeMode linear≤affine` agrees with
103+
-- `weaken` definitionally, so the existing strict-weakening
104+
-- non-recoverability witness extends to `degradeMode`.
105+
degradeMode-strict-is-weaken :
106+
(e : LEcho linear) degradeMode linear≤affine e ≡ weaken e
107+
degradeMode-strict-is-weaken _ = refl
108+
109+
-- Propositionality of the mode order. Each ordered pair `(m1, m2)`
110+
-- has at most one inhabitant in `_≤m_` — this is the linearity-side
111+
-- analogue of `EchoGraded.≤g-prop` and is what lets us collapse a
112+
-- `(≤m-trans p12 p23)`-shaped composition proof against an
113+
-- independently-given `p13 : m1 ≤m m3` in `degradeMode-compose`.
114+
≤m-prop : {m1 m2} (p p' : m1 ≤m m2) p ≡ p'
115+
≤m-prop linear≤linear linear≤linear = refl
116+
≤m-prop linear≤affine linear≤affine = refl
117+
≤m-prop affine≤affine affine≤affine = refl
118+
119+
-- Join on Mode. `affine` is top, so `_⊔m_` is determined by `m1`.
120+
_⊔m_ : Mode Mode Mode
121+
linear ⊔m m2 = m2
122+
affine ⊔m _ = affine
123+
124+
-- Join is the categorical least-upper-bound in `_≤m_`: two upper
125+
-- bounds (`≤m-⊔m-left`, `≤m-⊔m-right`) and a universal property
126+
-- (`≤m-⊔m-univ`). Mirrors `EchoGraded.≤g-⊔g-{left, right, univ}`.
127+
128+
≤m-⊔m-left : m1 m2 m1 ≤m (m1 ⊔m m2)
129+
≤m-⊔m-left linear linear = linear≤linear
130+
≤m-⊔m-left linear affine = linear≤affine
131+
≤m-⊔m-left affine linear = affine≤affine
132+
≤m-⊔m-left affine affine = affine≤affine
133+
134+
≤m-⊔m-right : m1 m2 m2 ≤m (m1 ⊔m m2)
135+
≤m-⊔m-right linear linear = linear≤linear
136+
≤m-⊔m-right linear affine = affine≤affine
137+
≤m-⊔m-right affine linear = linear≤affine
138+
≤m-⊔m-right affine affine = affine≤affine
139+
140+
≤m-⊔m-univ :
141+
{m1 m2 m3} m1 ≤m m3 m2 ≤m m3 (m1 ⊔m m2) ≤m m3
142+
≤m-⊔m-univ linear≤linear p2 = p2
143+
≤m-⊔m-univ linear≤affine p2 = p2
144+
≤m-⊔m-univ affine≤affine _ = affine≤affine
145+
146+
-- Free-factoring composition law: any direct ordering proof
147+
-- `p13 : m1 ≤m m3` agrees with the composed-via-`m2` weakening,
148+
-- because `≤m-prop` makes the choice of factoring irrelevant.
149+
-- Linearity-side analogue of `EchoGraded.degrade-compose`.
150+
degradeMode-compose :
151+
{m1 m2 m3}
152+
(p12 : m1 ≤m m2)
153+
(p23 : m2 ≤m m3)
154+
(p13 : m1 ≤m m3)
155+
(e : LEcho m1)
156+
degradeMode p23 (degradeMode p12 e) ≡ degradeMode p13 e
157+
degradeMode-compose p12 p23 p13 e
158+
rewrite ≤m-prop p13 (≤m-trans p12 p23) = degradeMode-comp p12 p23 e
159+
160+
-- Same statement restated through the join structure: any
161+
-- weakening to a common upper bound `m3` factors through the
162+
-- `m1 ⊔m m2` join. Linearity-side analogue of
163+
-- `EchoGraded.degrade-via-join`.
164+
degradeMode-via-join :
165+
{m1 m2 m3}
166+
(p1 : m1 ≤m m3)
167+
(p2 : m2 ≤m m3)
168+
(e : LEcho m1)
169+
degradeMode p1 e
170+
≡ degradeMode (≤m-⊔m-univ p1 p2) (degradeMode (≤m-⊔m-left m1 m2) e)
171+
degradeMode-via-join {m1} {m2} p1 p2 e =
172+
sym (degradeMode-compose (≤m-⊔m-left m1 m2) (≤m-⊔m-univ p1 p2) p1 e)

proofs/agda/Smoke.agda

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,15 @@ open import EchoLinear using
8989
; no-section-weaken
9090
; _≤m_
9191
; ≤m-trans
92+
; ≤m-prop
93+
; _⊔m_
94+
; ≤m-⊔m-left
95+
; ≤m-⊔m-right
96+
; ≤m-⊔m-univ
9297
; degradeMode
9398
; degradeMode-comp
99+
; degradeMode-compose
100+
; degradeMode-via-join
94101
)
95102

96103
open import EchoGraded using

0 commit comments

Comments
 (0)