From b176f8e6f75ec34eb8e3e6259a3b9bb245f7868c Mon Sep 17 00:00:00 2001 From: akaiDing <tingtind@umich.edu> Date: Fri, 13 Oct 2023 20:09:25 -0400 Subject: [PATCH] Add lemmas for representable relation --- .../Semantics/Concrete/DynNew.agda | 94 +++++++++++++++++-- .../Concrete/MonotonicityProofs.agda | 71 ++++++++++---- 2 files changed, 138 insertions(+), 27 deletions(-) diff --git a/formalizations/guarded-cubical/Semantics/Concrete/DynNew.agda b/formalizations/guarded-cubical/Semantics/Concrete/DynNew.agda index fad9ca3..22b665b 100644 --- a/formalizations/guarded-cubical/Semantics/Concrete/DynNew.agda +++ b/formalizations/guarded-cubical/Semantics/Concrete/DynNew.agda @@ -17,12 +17,14 @@ open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Structure open import Cubical.Foundations.Equiv open import Cubical.Foundations.Univalence +open import Cubical.Foundations.Transport open import Cubical.Relation.Binary open import Cubical.Data.Nat renaming (ℕ to Nat) open import Cubical.Data.Sum open import Cubical.Data.Unit open import Cubical.Data.Empty +open import Cubical.Data.Sigma open import Common.LaterProperties --open import Common.Preorder.Base @@ -37,6 +39,7 @@ open import Common.Poset.Constructions open import Common.Poset.Monotone open import Common.Poset.MonotoneRelation open import Semantics.MonotoneCombinators +open import Semantics.Concrete.MonotonicityProofs open import Semantics.LockStepErrorOrdering k @@ -44,6 +47,7 @@ open BinaryRelation open LiftPoset open ClockedCombinators k + private variable ℓ ℓ' ℓX ℓX' : Level @@ -62,6 +66,8 @@ DynP' D = ℕ ⊎p (▸' k (λ t → D t ==> 𝕃 (D t))) DynP : Poset ℓ-zero ℓ-zero DynP = fix DynP' + + unfold-DynP : DynP ≡ DynP' (next DynP) unfold-DynP = fix-eq DynP' @@ -74,6 +80,46 @@ DynP-Sum = unfold-DynP ⟨DynP⟩-Sum : ⟨ DynP ⟩ ≡ Nat ⊎ (▹ (⟨ DynP ==> 𝕃 DynP ⟩)) -- MonFun DynP (𝕃 DynP) ⟨DynP⟩-Sum i = ⟨ DynP-Sum i ⟩ + + +case : {ℓA ℓB ℓC : Level} -> {A : Type ℓA} {B : Type ℓB} {C : Type ℓC} -> + (A -> C) -> (B -> C) -> ((A ⊎ B) -> C) +case f g = λ { (inl a) → f a ; (inr b) → g b } + + +Rel-DynP-lem : ∀ d d' -> rel DynP d d' -> + (Σ[ n ∈ ⟨ ℕ ⟩ ] + (Σ[ n' ∈ ⟨ ℕ ⟩ ] + (transport ⟨DynP⟩-Sum d ≡ inl n) + × (transport ⟨DynP⟩-Sum d' ≡ inl n') + × (n ≡ n'))) ⊎ + (Σ[ f~ ∈ ⟨ ▹' k ((DynP ==> 𝕃 DynP)) ⟩ ] + (Σ[ g~ ∈ ⟨ ▹' k ((DynP ==> 𝕃 DynP)) ⟩ ] + (transport ⟨DynP⟩-Sum d ≡ inr f~) + × (transport ⟨DynP⟩-Sum d' ≡ inr g~) + × (▸ (λ t → f~ t ≤mon g~ t)))) +Rel-DynP-lem d d' d≤d' = + let dSum = transport ⟨DynP⟩-Sum d in let d'Sum = transport ⟨DynP⟩-Sum d' in + let dSum≤d'Sum = rel-transport DynP-Sum d≤d' in (rel-sum dSum d'Sum dSum≤d'Sum) + + +⊎p-rel-lem-l : {ℓA ℓ'A ℓB ℓ'B : Level} {A : Poset ℓA ℓ'A} {B : Poset ℓB ℓ'B} -> + (a : ⟨ A ⟩) -> + (x : ⟨ A ⟩ ⊎ ⟨ B ⟩) -> + rel (A ⊎p B) (inl a) x -> + Σ[ a' ∈ ⟨ A ⟩ ] (x ≡ inl a') × rel A a a' +⊎p-rel-lem-l a (inl a') H = a' , (refl , (lower H)) + +⊎p-rel-lem-r : {ℓA ℓ'A ℓB ℓ'B : Level} {A : Poset ℓA ℓ'A} {B : Poset ℓB ℓ'B} -> + (b : ⟨ B ⟩) -> + (x : ⟨ A ⟩ ⊎ ⟨ B ⟩) -> + rel (A ⊎p B) (inr b) x -> + Σ[ b' ∈ ⟨ B ⟩ ] (x ≡ inr b') × rel B b b' +⊎p-rel-lem-r b (inr b') H = b' , (refl , (lower H)) + + + + InjNat : ⟨ ℕ ==> DynP ⟩ InjNat = mCompU (mTransport (sym DynP-Sum)) σ1 @@ -83,28 +129,60 @@ InjArr = mCompU (mTransport (sym DynP-Sum)) (mCompU σ2 Next) ProjNat : ⟨ DynP ==> 𝕃 ℕ ⟩ ProjNat = mCompU (Case' mRet (K _ ℧)) (mTransport DynP-Sum) - ▹g→g : MonFun ((▸'' k) (DynP ==> 𝕃 DynP)) (𝕃 (DynP ==> 𝕃 DynP)) ▹g→g = record { f = λ f~ -> θ (λ t -> η (f~ t)) ; - isMon = λ {f~} {g~} f~≤g~ → ord-θ-monotone _ (λ t -> ord-η-monotone _ (f~≤g~ t)) - -- ord-θ-monotone _ (λ t -> ord-η-monotone _ (f~≤g~ t)) - } + isMon = λ {f~} {g~} f~≤g~ → ord-θ-monotone _ (λ t -> ord-η-monotone _ (f~≤g~ t)) } + +ProjNat-nat : ∀ d n -> + transport ⟨DynP⟩-Sum d ≡ inl n -> + MonFun.f ProjNat d ≡ η n +ProjNat-nat d n eq = + cong₂ (MonFun.f {X = DynP} {Y = 𝕃 ℕ}) + (refl {x = ProjNat}) + ((sym (transport⁻Transport ⟨DynP⟩-Sum d)) ∙ λ i -> transport⁻ ⟨DynP⟩-Sum (eq i)) + ∙ λ i → MonFun.f {!!} (transportTransport⁻ ⟨DynP⟩-Sum (inl n) i) + +ProjNat-fun : ∀ d g~ -> + transport ⟨DynP⟩-Sum d ≡ inr g~ -> + MonFun.f ProjNat d ≡ ℧ +ProjNat-fun d g~ eq = + cong₂ (MonFun.f {X = DynP} {Y = 𝕃 ℕ}) + (refl {x = ProjNat}) + ((sym (transport⁻Transport ⟨DynP⟩-Sum d)) ∙ λ i -> transport⁻ ⟨DynP⟩-Sum (eq i)) + ∙ λ i → MonFun.f (Case' mRet (K {!𝕃 (DynP ==> 𝕃 DynP)!} ℧)) (transportTransport⁻ ⟨DynP⟩-Sum (inr g~) i) ProjArr : ⟨ DynP ==> 𝕃 (DynP ==> 𝕃 DynP) ⟩ ProjArr = mCompU (Case' (K _ ℧) ▹g→g) (mTransport DynP-Sum) - - + + +ProjArr-nat : ∀ d n -> + transport ⟨DynP⟩-Sum d ≡ inl n -> + MonFun.f ProjArr d ≡ ℧ +ProjArr-nat d n eq = + cong₂ (MonFun.f {X = DynP} {Y = 𝕃 (DynP ==> 𝕃 DynP)}) + (refl {x = ProjArr}) + ((sym (transport⁻Transport ⟨DynP⟩-Sum d)) ∙ λ i -> transport⁻ ⟨DynP⟩-Sum (eq i)) + ∙ λ i → MonFun.f (Case' (K ℕ ℧) ▹g→g) (transportTransport⁻ ⟨DynP⟩-Sum (inl n) i) + ProjArr-fun : ∀ d g~ -> transport ⟨DynP⟩-Sum d ≡ inr g~ -> MonFun.f ProjArr d ≡ θ (λ t -> η (g~ t)) -ProjArr-fun d g~ eq = {!!} ∙ +ProjArr-fun d g~ eq = + cong₂ (MonFun.f {X = DynP} {Y = 𝕃 (DynP ==> 𝕃 DynP)}) + (refl {x = ProjArr}) + ((sym (transport⁻Transport ⟨DynP⟩-Sum d)) ∙ λ i -> transport⁻ ⟨DynP⟩-Sum (eq i)) + ∙ (λ i -> MonFun.f (Case' (K ℕ ℧) ▹g→g) (transportTransport⁻ ⟨DynP⟩-Sum (inr g~) i)) + +-- MonFun.f ProjArr (transport⁻ ⟨DynP⟩-Sum (inr g~)) ≡ _y_510 + + {-{!!} ∙ -- (λ i -> MonFun.f (mCompU (Case' (K _ ℧) aux) (mTransport DynP-Sum)) d) ∙ (congS ((λ { (inl a) → MonFun.f (K ℕ ℧) a ; (inr b) → MonFun.f ▹g→g b })) eq) ∙ - {!!} + refl -} -- MonFun.f ProjArr d ≡ θ (λ t → η (g~ t)) -- (transp (λ i → ⟨ DynP-Sum i ⟩) i0 d) diff --git a/formalizations/guarded-cubical/Semantics/Concrete/MonotonicityProofs.agda b/formalizations/guarded-cubical/Semantics/Concrete/MonotonicityProofs.agda index 07948b8..7a9f763 100644 --- a/formalizations/guarded-cubical/Semantics/Concrete/MonotonicityProofs.agda +++ b/formalizations/guarded-cubical/Semantics/Concrete/MonotonicityProofs.agda @@ -106,14 +106,15 @@ module ClockedProofs (k : Clock) where ret-monotone : {A : Poset ℓA ℓ'A} -> (a a' : ⟨ A ⟩) -> - (rAA : ⟨ A ⟩ -> ⟨ A ⟩ -> Type ℓR) -> + rel A a a' -> rel (𝕃 A) (ret a) (ret a') - ret-monotone = {!!} + ret-monotone {A = A} = λ a a' a≤a' → + LiftRelation.Properties.ord-η-monotone ⟨ A ⟩ ⟨ A ⟩ _ a≤a' _×rel_ : {A : Type ℓA} {A' : Type ℓA'} {B : Type ℓB} {B' : Type ℓB'} -> (R : A -> A' -> Type ℓR1) -> (S : B -> B' -> Type ℓR2) -> (p : A × B) -> (p' : A' × B') -> Type (ℓ-max ℓR1 ℓR2) - (R ×rel S) (a , b) (a' , b') = R a a' × S b b' --R a a' , S b b' won't work + (R ×rel S) (a , b) (a' , b') = R a a' × S b b' lift×-monotone-het : {A : Poset ℓA ℓ'A} {A' : Poset ℓA' ℓ'A'} {B : Poset ℓB ℓ'B} {B' : Poset ℓB' ℓ'B'} -> @@ -124,7 +125,17 @@ module ClockedProofs (k : Clock) where ((_ LiftRelation.≾ _) R ×rel (_ LiftRelation.≾ _) S) (lift× lab) (lift× la'b') lift×-monotone-het {A = A} {A' = A'} {B = B} {B' = B'} R S lab la'b' lab≤la'b' = let fixed = fix monotone-lift×' in - transport {!!} {!!} + -- transport⁻Transport + transport (sym (λ i → LiftP'.unfold-≾ {!i!} {!!} {!!})) + (fixed lab la'b' (transport (λ i → LiftP'.unfold-≾ i lab la'b') lab≤la'b')) +--(sym λ i → LiftP'.unfold-≾ {!!} {!unfold-lift×-inv i!} {!!}) +{- +(LiftP1'._≾_ ×rel LiftP2'._≾_) (lift× lab) (lift× la'b') ≡ + Σ + (lift×' (next lift×) lab .fst ≾'P1' lift×' (next lift×) la'b' .fst) + (λ _ → + lift×' (next lift×) lab .snd ≾'P2' lift×' (next lift×) la'b' .snd) +-} where _≾'LA_ = LiftPoset._≾'_ A _≾'LA'_ = LiftPoset._≾'_ A' @@ -142,12 +153,29 @@ module ClockedProofs (k : Clock) where monotone-lift×' : ▹ ((lab : ⟨ 𝕃 (A ×p B) ⟩) -> (la'b' : ⟨ 𝕃 (A' ×p B') ⟩) -> lab ≾'P' la'b' -> - (lift×' (next lift×) lab .fst ≾'P1' {!!}) × ({!!} ≾'P2' {!!})) -> - -- {!? ≾'P1' ?!} × {! ? ≾'P2' ?!}) -> + (lift×' (next lift×) lab .fst ≾'P1' lift×' (next lift×) la'b' .fst) + × (lift×' (next lift×) lab .snd ≾'P2' lift×' (next lift×) la'b' .snd)) -> (lab : ⟨ 𝕃 (A ×p B) ⟩) -> (la'b' : ⟨ 𝕃 (A' ×p B') ⟩) -> lab ≾'P' la'b' -> - {!!} - monotone-lift×' = {!!} + (lift×' (next lift×) lab .fst ≾'P1' lift×' (next lift×) la'b' .fst) + × (lift×' (next lift×) lab .snd ≾'P2' lift×' (next lift×) la'b' .snd) + monotone-lift×' IH (η (a , b)) (η (a' , b')) (x , y) = + transport (λ i → LiftP1'.unfold-≾ i (η a) (η a')) (LiftP1'.Properties.ord-η-monotone x) + , transport (λ i → LiftP2'.unfold-≾ i (η b) (η b')) (LiftP2'.Properties.ord-η-monotone y) + monotone-lift×' IH ℧ l' l≤l' = tt* , tt* + monotone-lift×' IH (θ p) (θ p') l≤l' = + (λ t → transport + (λ i → (sym LiftP1'.unfold-≾) i + ((sym unfold-lift×) i (p t) .fst) + ((sym unfold-lift×) i (p' t) .fst)) + (IH t (p t) (p' t) + (transport (λ i → LiftP'.unfold-≾ i (p t) (p' t)) (l≤l' t)) .fst)) + , λ t → transport + (λ i → (sym LiftP2'.unfold-≾) i + ((sym unfold-lift×) i (p t) .snd) + ((sym unfold-lift×) i (p' t) .snd)) + (IH t (p t) (p' t) + (transport (λ i → LiftP'.unfold-≾ i (p t) (p' t)) (l≤l' t)) .snd) --todo: follow ext-monotone-het lift×-inv-monotone-het : {A : Poset ℓA ℓ'A} {A' : Poset ℓA' ℓ'A'} @@ -183,7 +211,14 @@ module ClockedProofs (k : Clock) where (p : ⟨ 𝕃 A ×p 𝕃 B ⟩) -> (p' : ⟨ 𝕃 A' ×p 𝕃 B' ⟩) -> ((p .fst ≾'P1' p' .fst) × (p .snd ≾'P2' p' .snd)) -> lift×-inv' (next lift×-inv) p ≾'P' lift×-inv' (next lift×-inv) p' - monotone-lift×-inv' IH (η a , η b) (η a' , η b') (la≤la' , lb≤lb') = transport (λ i → LiftP'.unfold-≾ i {!lift×-inv (η a , η b )!} {!!}) {!!} + monotone-lift×-inv' IH (η a1 , η b1) (η a2 , η b2) (a1≤a2 , b1≤b2) = + transport + (λ i → LiftP'.unfold-≾ {!i!} (lift×-inv (η a1 , η b1)) (lift×-inv (η a2 , η b2))) + {!!} + {- + lift×-inv' (next lift×-inv) (η a1 , η b1) ≾'P' + lift×-inv' (next lift×-inv) (η a2 , η b2) + -} monotone-lift×-inv' IH ((η a) , (θ lb~)) ((η a') , (θ lb'~)) (la≤la' , lb≤lb') = {!!} monotone-lift×-inv' IH (℧ , _) (℧ , _) (la≤la' , lb≤lb') = {!!} monotone-lift×-inv' IH (_ , ℧) (_ , ℧) (la≤la' , lb≤lb') = {!!} @@ -225,8 +260,7 @@ module ClockedProofs (k : Clock) where monotone-ext' : - ▹ ( - (la : ⟨ 𝕃 A ⟩) -> (la' : ⟨ 𝕃 A' ⟩) -> + ▹ ((la : ⟨ 𝕃 A ⟩) -> (la' : ⟨ 𝕃 A' ⟩) -> (la ≾'LALA' la') -> (ext' f (next (ext f)) la) ≾'LBLB' (ext' f' (next (ext f')) la')) -> @@ -234,11 +268,11 @@ module ClockedProofs (k : Clock) where (la ≾'LALA' la') -> (ext' f (next (ext f)) la) ≾'LBLB' (ext' f' (next (ext f')) la') - monotone-ext' IH (η x) (η y) x≤y = transport (λ i → LiftBB'.unfold-≾ i (f x) (f' y)) (f≤f' x y x≤y) - {-transport + monotone-ext' IH (η x) (η y) x≤y = + transport (λ i → LiftBB'.unfold-≾ i (f x) (f' y)) - (f≤f' x y x≤y)-} - monotone-ext' IH ℧ la' la≤la' = {!!} --tt* + (f≤f' x y x≤y) + monotone-ext' IH ℧ la' la≤la' = tt* monotone-ext' IH (θ lx~) (θ ly~) la≤la' = λ t -> transport (λ i → (sym (LiftBB'.unfold-≾)) i @@ -247,8 +281,6 @@ module ClockedProofs (k : Clock) where (IH t (lx~ t) (ly~ t) (transport (λ i -> LiftAA'.unfold-≾ i (lx~ t) (ly~ t)) (la≤la' t))) - - -- ext respects monotonicity (in the usual homogeneous sense) -- This can be rewritten to reuse the above result! ext-monotone : @@ -257,7 +289,8 @@ module ClockedProofs (k : Clock) where (la la' : ⟨ 𝕃 A ⟩) -> rel (𝕃 A) la la' -> rel (𝕃 B) (ext f la) (ext f' la') - ext-monotone {A} {B} f f' f≤f' la la' la≤la' = {!!} + ext-monotone {A = A} {B = B} f f' f≤f' la la' la≤la' = + ext-monotone-het {A = A} {A' = A} {B = B} {B' = B} (rel A) (rel B) f f' f≤f' la la' la≤la' lift×-monotone : {A : Poset ℓA ℓ'A} {B : Poset ℓB ℓ'B} -> (l l' : ⟨ 𝕃 (A ×p B) ⟩) -> @@ -269,7 +302,7 @@ module ClockedProofs (k : Clock) where (l l' : ⟨ 𝕃 A ×p 𝕃 B ⟩) -> rel (𝕃 A ×p 𝕃 B) l l' -> rel (𝕃 (A ×p B)) (lift×-inv l) (lift×-inv l') - lift×-inv-monotone = {!!} + lift×-inv-monotone = {!!} bind-monotone : {la la' : ⟨ 𝕃 A ⟩} -> -- GitLab