@@ -16,7 +16,8 @@ def Update [CMRA α] (x y : α) := ∀ n mz,
1616infixr :50 " ~~> " => Update
1717
1818section updates
19- variable [CMRA α]
19+
20+ variable [CMRA α] [CMRA β] (f : α → β) (g : β → α)
2021
2122-- (* Global Instance cmra_updateP_proper :
2223-- Proper ((≡) ==> pointwise_relation _ iff ==> iff) (@cmra_updateP SI A).
@@ -26,23 +27,23 @@ variable [CMRA α]
2627-- Proper ((≡) ==> (≡) ==> iff) (@cmra_update SI A).
2728-- Proof. Admitted. *)
2829
29- theorem UpdateP.left_eqv {P : α → Prop } {x y: α} (e: x ≡ y) (u: x ~~>: P): y ~~>: P :=
30+ theorem UpdateP.equiv_left {P : α → Prop } {x y: α} (e: x ≡ y) (u: x ~~>: P): y ~~>: P :=
3031 fun n mz v => u n mz (CMRA.validN_ne (CMRA.opM_left_dist mz e.symm.dist) v)
3132
32- theorem Update.left_eqv {x y z: α} (e: x ≡ y) (u: x ~~> z): y ~~> z :=
33+ theorem Update.equiv_left {x y z: α} (e: x ≡ y) (u: x ~~> z): y ~~> z :=
3334 fun n mz v => u n mz (CMRA.validN_ne (CMRA.opM_left_dist mz e.symm.dist) v)
3435
35- theorem Update.right_eqv {x y z: α} (e: y ≡ z) (u: x ~~> y): x ~~> z :=
36+ theorem Update.equiv_right {x y z: α} (e: y ≡ z) (u: x ~~> y): x ~~> z :=
3637 fun n mz v => CMRA.validN_ne (CMRA.opM_left_dist mz e.dist) (u n mz v)
3738
3839instance [CMRA α] : Trans OFE.Equiv UpdateP UpdateP (α := α) where
39- trans e u := UpdateP.left_eqv e.symm u
40+ trans e u := UpdateP.equiv_left e.symm u
4041
4142instance [CMRA α] : Trans OFE.Equiv Update Update (α := α) where
42- trans e u := Update.left_eqv (id (OFE.Equiv.symm e)) u
43+ trans e u := Update.equiv_left (id (OFE.Equiv.symm e)) u
4344
4445instance [CMRA α] : Trans Update OFE.Equiv Update (α := α) where
45- trans u e := Update.right_eqv e u
46+ trans u e := Update.equiv_right e u
4647
4748
4849theorem Update.of_updateP {x y: α} (h: x ~~>: (y = ·)): x ~~> y :=
@@ -145,14 +146,14 @@ theorem Update.op_l (x y : α) : x • y ~~> x := fun _ _ => CMRA.validN_op_opM_
145146theorem Update.op_r (x y : α) : x • y ~~> y := fun _ _ => CMRA.validN_op_opM_right
146147
147148theorem Update.included (x y : α) : x ≼ y → y ~~> x :=
148- fun ⟨z, ez⟩ => Update.left_eqv ez.symm (Update.op_l x z)
149+ fun ⟨z, ez⟩ => Update.equiv_left ez.symm (Update.op_l x z)
149150
150151theorem Update.valid0 (x y : α) : (✓{0 } x → x ~~> y) → x ~~> y :=
151152 fun h n mz v => h (CMRA.valid0_of_validN (CMRA.validN_opM v)) n mz v
152153
153154-- Frame preserving updates for total and discete CMRAs
154155
155- theorem total_updateP [CMRA.IsTotal α] (x : α) (P : α → Prop )
156+ theorem UpdateP.total [CMRA.IsTotal α] (x : α) (P : α → Prop )
156157 : x ~~>: P ↔ ∀ (n : Nat) (z : α), ✓{n} (x • z) → ∃ y, P y ∧ ✓{n} (y • z) where
157158 mp uxp := fun n z v => uxp n (some z) v
158159 mpr h := fun n mz v =>
@@ -162,7 +163,7 @@ theorem total_updateP [CMRA.IsTotal α] (x : α) (P : α → Prop)
162163 ⟨y, py, CMRA.validN_op_opM_left vy⟩
163164 | .some z => h n z v
164165
165- theorem total_update [CMRA.IsTotal α] (x y : α)
166+ theorem Update.total [CMRA.IsTotal α] (x y : α)
166167 : x ~~> y ↔ ∀ (n : Nat) (z : α), ✓{n} (x • z) → ✓{n} (y • z) where
167168 mp uxy := fun n z v => uxy n (some z) v
168169 mpr h := fun n mz v =>
@@ -172,7 +173,7 @@ theorem total_update [CMRA.IsTotal α] (x y : α)
172173 | .some z => h n z v
173174
174175
175- theorem discrete_updateP [CMRA.Discrete α] (x : α) (P : α → Prop )
176+ theorem UpdateP.discrete [CMRA.Discrete α] (x : α) (P : α → Prop )
176177 : x ~~>: P ↔ ∀ (mz : Option α), ✓ (x •? mz) → ∃ y, P y ∧ ✓ (y •? mz) where
177178 mp uxp := fun mz v =>
178179 let ⟨y, py, vy⟩ := uxp 0 mz (CMRA.Valid.validN v)
@@ -181,32 +182,30 @@ theorem discrete_updateP [CMRA.Discrete α] (x : α) (P : α → Prop)
181182 let ⟨y, py, vy⟩ := h mz ((CMRA.valid_iff_validN' n).mpr v)
182183 ⟨y, py, CMRA.Valid.validN vy⟩
183184
184- theorem discrete_update [CMRA.Discrete α] (x y : α)
185+ theorem Update.discrete [CMRA.Discrete α] (x y : α)
185186 : x ~~> y ↔ ∀ (mz : Option α), ✓ (x •? mz) → ✓ (y •? mz) where
186187 mp uxp := fun mz v => CMRA.discrete_valid $ uxp 0 mz (CMRA.Valid.validN v)
187188 mpr h := fun n mz v => CMRA.Valid.validN $ h mz ((CMRA.valid_iff_validN' n).mpr v)
188189
189- theorem discrete_total_updateP [CMRA.Discrete α] [CMRA.IsTotal α] (x : α) (P : α → Prop )
190+ theorem UpdateP.discrete_total [CMRA.Discrete α] [CMRA.IsTotal α] (x : α) (P : α → Prop )
190191 : x ~~>: P ↔ ∀ (z : α), ✓ (x • z) → ∃ y, P y ∧ ✓ (y • z) where
191192 mp uxp := fun z vz =>
192- let ⟨y, py, vy⟩ := (total_updateP x P).mp uxp 0 z (CMRA.Valid.validN vz)
193+ let ⟨y, py, vy⟩ := (UpdateP.total x P).mp uxp 0 z (CMRA.Valid.validN vz)
193194 ⟨y, py, CMRA.discrete_valid vy⟩
194195 mpr h :=
195196 have this n z (v: ✓{n} x • z): ∃ y, P y ∧ ✓{n} (y • z) :=
196197 let ⟨y, py, vy⟩ := h z ((CMRA.valid_iff_validN' n).mpr v)
197198 ⟨y, py, CMRA.Valid.validN vy⟩
198- (total_updateP x P).mpr this
199+ (UpdateP.total x P).mpr this
199200
200- theorem discrete_total_update [CMRA.Discrete α] [CMRA.IsTotal α] (x y : α)
201+ theorem Update.discrete_total [CMRA.Discrete α] [CMRA.IsTotal α] (x y : α)
201202 : x ~~> y ↔ ∀ (z : α), ✓ (x • z) → ✓ (y • z) where
202203 mp uxp := fun z vz =>
203- CMRA.discrete_valid $ (total_update x y).mp uxp 0 z (CMRA.Valid.validN vz)
204+ CMRA.discrete_valid $ (Update.total x y).mp uxp 0 z (CMRA.Valid.validN vz)
204205 mpr h :=
205206 have this n z (v: ✓{n} x • z): ✓{n} (y • z) :=
206207 CMRA.Valid.validN $ h z ((CMRA.valid_iff_validN' n).mpr v)
207- (total_update x y).mpr this
208-
209- end updates
208+ (Update.total x y).mpr this
210209
211210-- (** * Transport *)
212211-- Section cmra_transport.
@@ -222,101 +221,84 @@ end updates
222221
223222-- End cmra_transport.
224223
225- -- Isomorphism
226- section iso_cmra
227- variable [CMRA α] [CMRA β] (f : α → β) (g : β → α)
228-
229- theorem iso_updateP {P : β → Prop } {Q : α → Prop } {y : β}
230- (gf : ∀ x, g (f x) ≡ x)
231- (g_op : ∀ y1 y2, g (y1 • y2) ≡ g y1 • g y2)
232- (g_validN : ∀ n y, ✓{n} (g y) ↔ ✓{n} y)
233- (uyp: y ~~>: P)
234- (pq: ∀ y', P y' → Q (g y'))
235- : g y ~~>: Q :=
236- fun n mz v =>
237- have : ✓{n} y •? Option.map f mz :=
238- match mz with
239- | .none => (g_validN n _).mp v
240- | .some z =>
241- have : g y • z ≡ g (y • f z) :=
242- (CMRA.op_right_eqv _ (gf z).symm).trans (g_op y (f z)).symm
243- (g_validN n _).mp (CMRA.validN_ne this.dist v)
244- have ⟨x, px, vx⟩ := uyp n (mz.map f) this
245- have : g (x •? Option.map f mz) ≡ g x •? mz :=
246- match mz with
247- | .none => OFE.Equiv.rfl
248- | .some z => (g_op x (f z)).trans (CMRA.op_right_eqv (g x) (gf z))
249- ⟨g x, pq x px, CMRA.validN_ne this.dist ((g_validN n _).mpr vx)⟩
250-
251- theorem iso_updateP' (P : β → Prop ) (y : β)
252- (gf : ∀ x, g (f x) ≡ x)
253- (g_op : ∀ y1 y2, g (y1 • y2) ≡ g y1 • g y2)
254- (g_validN : ∀ n y, ✓{n} (g y) ↔ ✓{n} y)
255- (uyp: y ~~>: P)
256- : g y ~~>: λ x ↦ ∃ y, x = g y ∧ P y :=
257- iso_updateP f g gf g_op g_validN uyp (fun z pz => ⟨z, rfl, pz⟩)
258-
259- end iso_cmra
260-
261- section update_lift_cmra
262- variable [CMRA α] [CMRA β]
263-
264- theorem Update.lift_updateP (f : β → α) (x : β) (y : β)
265- (H : ∀ P, x ~~>: P → f x ~~>: λ a' ↦ ∃ b', a' = f b' ∧ P b')
224+ /-! ## Isomorphism -/
225+ theorem UpdateP.iso {P : β → Prop } {Q : α → Prop } {y : β}
226+ (gf : ∀ x, g (f x) ≡ x)
227+ (g_op : ∀ y1 y2, g (y1 • y2) ≡ g y1 • g y2)
228+ (g_validN : ∀ n y, ✓{n} (g y) ↔ ✓{n} y)
229+ (uyp: y ~~>: P)
230+ (pq: ∀ y', P y' → Q (g y'))
231+ : g y ~~>: Q :=
232+ fun n mz v =>
233+ have : ✓{n} y •? Option.map f mz :=
234+ match mz with
235+ | .none => (g_validN n _).mp v
236+ | .some z =>
237+ have : g y • z ≡ g (y • f z) :=
238+ (CMRA.op_right_eqv _ (gf z).symm).trans (g_op y (f z)).symm
239+ (g_validN n _).mp (CMRA.validN_ne this.dist v)
240+ have ⟨x, px, vx⟩ := uyp n (mz.map f) this
241+ have : g (x •? Option.map f mz) ≡ g x •? mz :=
242+ match mz with
243+ | .none => OFE.Equiv.rfl
244+ | .some z => (g_op x (f z)).trans (CMRA.op_right_eqv (g x) (gf z))
245+ ⟨g x, pq x px, CMRA.validN_ne this.dist ((g_validN n _).mpr vx)⟩
246+
247+ theorem UpdateP.iso' (P : β → Prop ) (y : β)
248+ (gf : ∀ x, g (f x) ≡ x)
249+ (g_op : ∀ y1 y2, g (y1 • y2) ≡ g y1 • g y2)
250+ (g_validN : ∀ n y, ✓{n} (g y) ↔ ✓{n} y)
251+ (uyp: y ~~>: P)
252+ : g y ~~>: λ x ↦ ∃ y, x = g y ∧ P y :=
253+ UpdateP.iso f g gf g_op g_validN uyp (fun z pz => ⟨z, rfl, pz⟩)
254+
255+ /-! ## Lift -/
256+ theorem Update.lift_updateP (x y : β)
257+ (H : ∀ P, x ~~>: P → g x ~~>: λ a' ↦ ∃ b', a' = g b' ∧ P b')
266258 (uxy: x ~~> y)
267- : f x ~~> f y :=
259+ : g x ~~> g y :=
268260 Update.of_updateP fun n mz v =>
269261 have ⟨z, hz, vz⟩ := H _ (UpdateP.of_update uxy) n mz v
270- have hz : z = f y := by simp at hz ⊢; exact hz
262+ have hz : z = g y := by simp at hz ⊢; exact hz
271263 ⟨z, hz.symm, vz⟩
272264
273- end update_lift_cmra
274-
275- section prod
276- variable [CMRA α] [CMRA β]
277-
278- theorem prod_updateP {P : α → Prop } {Q : β → Prop } {R : α × β → Prop } {x : α × β}
279- (uxp: x.fst ~~>: P) (uxq: x.snd ~~>: Q) (pq: ∀ a b, P a → Q b → R (a, b))
280- : x ~~>: R :=
281- fun n mz v =>
282- match mz with
283- | .none =>
284- have ⟨y₁, py, vy₁⟩ := uxp n .none (Prod.validN_fst v)
285- have ⟨y₂, qy, vy₂⟩ := uxq n .none (Prod.validN_snd v)
286- ⟨(y₁, y₂), pq y₁ y₂ py qy, ⟨vy₁, vy₂⟩⟩
287- | .some z =>
288- have ⟨y₁, py, vy₁⟩ := uxp n (.some z.fst) (Prod.validN_fst v)
289- have ⟨y₂, qy, vy₂⟩ := uxq n (.some z.snd) (Prod.validN_snd v)
290- ⟨(y₁, y₂), pq y₁ y₂ py qy, ⟨vy₁, vy₂⟩⟩
291-
292- theorem prod_updateP' (P : α → Prop ) (Q : β → Prop ) (x : α × β)
293- (uxp: x.fst ~~>: P) (uxq: x.snd ~~>: Q) : x ~~>: λ y ↦ P (y.fst) ∧ Q (y.snd) :=
294- prod_updateP uxp uxq (fun _ _ px qy => ⟨px, qy⟩)
295-
296- theorem prod_update (x : α × β) (uxy₁: x.fst ~~> y.fst) (uxy₂: x.snd ~~> y.snd) : x ~~> y :=
297- Update.of_updateP $
298- prod_updateP (UpdateP.of_update uxy₁) (UpdateP.of_update uxy₂)
299- (fun _ _ ya yb => Prod.ext ya yb)
300-
301- end prod
302-
303- section option
304- variable [CMRA α]
305-
306- theorem option_updateP {P : α → Prop } {Q : Option α → Prop } {x : α}
307- (uxp: x ~~>: P) (pq: ∀ y, P y → Q (some y)) : some x ~~>: Q :=
308- fun n mz v =>
309- match mz with
310- | .none => let ⟨w, pw, vw⟩ := uxp n .none v; ⟨w, pq w pw, vw⟩
311- | .some .none => let ⟨w, pw, vw⟩ := uxp n .none v; ⟨w, pq w pw, vw⟩
312- | .some (.some z) => let ⟨w, pw, vw⟩ := uxp n (.some z) v; ⟨w, pq w pw, vw⟩
265+ /-! ## Product -/
266+ theorem UpdateP.prod {P : α → Prop } {Q : β → Prop } {R : α × β → Prop } {x : α × β}
267+ (uxp: x.fst ~~>: P) (uxq: x.snd ~~>: Q) (pq: ∀ a b, P a → Q b → R (a, b))
268+ : x ~~>: R :=
269+ fun n mz v =>
270+ match mz with
271+ | .none =>
272+ have ⟨y₁, py, vy₁⟩ := uxp n .none (Prod.validN_fst v)
273+ have ⟨y₂, qy, vy₂⟩ := uxq n .none (Prod.validN_snd v)
274+ ⟨(y₁, y₂), pq y₁ y₂ py qy, ⟨vy₁, vy₂⟩⟩
275+ | .some z =>
276+ have ⟨y₁, py, vy₁⟩ := uxp n (.some z.fst) (Prod.validN_fst v)
277+ have ⟨y₂, qy, vy₂⟩ := uxq n (.some z.snd) (Prod.validN_snd v)
278+ ⟨(y₁, y₂), pq y₁ y₂ py qy, ⟨vy₁, vy₂⟩⟩
279+
280+ theorem UpdateP.prod' (P : α → Prop ) (Q : β → Prop ) (x : α × β)
281+ (uxp: x.fst ~~>: P) (uxq: x.snd ~~>: Q) : x ~~>: λ y ↦ P (y.fst) ∧ Q (y.snd) :=
282+ UpdateP.prod uxp uxq (fun _ _ px qy => ⟨px, qy⟩)
283+
284+ theorem Update.prod (x : α × β) (uxy₁: x.fst ~~> y.fst) (uxy₂: x.snd ~~> y.snd) : x ~~> y :=
285+ Update.of_updateP $
286+ UpdateP.prod (UpdateP.of_update uxy₁) (UpdateP.of_update uxy₂)
287+ (fun _ _ ya yb => Prod.ext ya yb)
313288
314- theorem option_updateP' (P : α → Prop ) (x : α) (uxp: x ~~>: P)
315- : some x ~~>: Option.rec False P :=
316- option_updateP uxp (fun _ py => py)
289+ /-! ## Option -/
290+ theorem UpdateP.option {P : α → Prop } {Q : Option α → Prop } {x : α}
291+ (uxp: x ~~>: P) (pq: ∀ y, P y → Q (some y)) : some x ~~>: Q :=
292+ fun n mz v =>
293+ match mz with
294+ | .none => let ⟨w, pw, vw⟩ := uxp n .none v; ⟨w, pq w pw, vw⟩
295+ | .some .none => let ⟨w, pw, vw⟩ := uxp n .none v; ⟨w, pq w pw, vw⟩
296+ | .some (.some z) => let ⟨w, pw, vw⟩ := uxp n (.some z) v; ⟨w, pq w pw, vw⟩
317297
318- theorem option_update (x y : α) (uxy: x ~~> y): some x ~~> some y :=
319- Update.of_updateP $
320- option_updateP ( UpdateP.of_update uxy) (fun _ => congrArg some )
298+ theorem UpdateP.option' (P : α → Prop ) (x : α) (uxp: x ~~>: P)
299+ : some x ~~>: Option.rec False P :=
300+ UpdateP.option uxp (fun _ py => py )
321301
322- end option
302+ theorem Update.option (x y : α) (uxy: x ~~> y): some x ~~> some y :=
303+ Update.of_updateP $
304+ UpdateP.option (UpdateP.of_update uxy) (fun _ => congrArg some)
0 commit comments