@@ -47,3 +47,126 @@ affine-canonical (tt , tt) = refl
4747
4848affine-all-equal : ∀ (e1 e2 : LEcho affine) → e1 ≡ e2
4949affine-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)
0 commit comments