From 842d7932f62668d71b6b2109c2abf53293dae39d Mon Sep 17 00:00:00 2001
From: Max New <maxsnew@gmail.com>
Date: Wed, 24 May 2023 16:37:49 -0400
Subject: [PATCH] some example gtt theorems

---
 .../guarded-cubical/Syntax/Logic.agda         | 35 +++++++-
 .../guarded-cubical/Syntax/Terms.agda         | 80 ++++++++++++++++---
 .../guarded-cubical/Syntax/Types.agda         |  8 ++
 3 files changed, 109 insertions(+), 14 deletions(-)

diff --git a/formalizations/guarded-cubical/Syntax/Logic.agda b/formalizations/guarded-cubical/Syntax/Logic.agda
index 36d66b8..4aa743b 100644
--- a/formalizations/guarded-cubical/Syntax/Logic.agda
+++ b/formalizations/guarded-cubical/Syntax/Logic.agda
@@ -71,7 +71,7 @@ data EvCtx⊑ where
 
   dn-L : ∀ S⊑T → EvCtx⊑ [] (refl-⊑ (ty-right S⊑T)) (ty-prec S⊑T) (dn S⊑T) ∙E
   dn-R : ∀ S⊑T → EvCtx⊑ [] (ty-prec S⊑T) (refl-⊑ (ty-left S⊑T)) ∙E (dn S⊑T)
-  retractionR : ∀ S⊑T → EvCtx⊑ (refl-⊑ (ty-right S⊑T) ∷ []) (refl-⊑ (ty-right S⊑T)) (refl-⊑ (ty-right S⊑T)) ∙E (upE S⊑T ∘E dn S⊑T)
+  retractionR : ∀ S⊑T → EvCtx⊑ [] (refl-⊑ (ty-right S⊑T)) (refl-⊑ (ty-right S⊑T)) ∙E (upE S⊑T ∘E dn S⊑T)
 
   trans : EvCtx⊑ C b c E E' → EvCtx⊑ C' b' c' E' E'' → EvCtx⊑ (trans-⊑ctx C C') (trans b b') (trans c c') E E''
   isProp⊑ : isProp (EvCtx⊑ C c d E E')
@@ -112,4 +112,35 @@ M ≈m M' = Comp⊑-homo M M' × Comp⊑-homo M' M
 _≈e_ : (E E' : EvCtx Γ S T) → Type _
 E ≈e E' = EvCtx⊑-homo E E' × EvCtx⊑-homo E' E
 
--- TODO: show up, down are monotone, derive semantics of function casts
+up-monotone : (S⊑S' : S ⊑ S')(S⊑T : S ⊑ T)(S'⊑T' : S' ⊑ T') (T⊑T' : T ⊑ T')
+            → Val⊑ (S⊑T ∷ []) S'⊑T' (up (mkTyPrec S⊑S')) (up (mkTyPrec T⊑T'))
+up-monotone {S}{S'}{T}{T'} S⊑S' S⊑T S'⊑T' T⊑T' =
+  transport (λ i → Val⊑ (split-dom (~ i) ∷ []) (split-cod (~ i)) (substId {V = up (mkTyPrec S⊑S')} i) (varβ {δ = !s}{V = (up (mkTyPrec T⊑T'))} i))
+  (trans (up-L (mkTyPrec (S⊑S'))) (var {C = []})
+  [ transport (λ i → Subst⊑ (trans S⊑T (refl-⊑ T) ∷ []) (swap-middle i) (ids1-expand (~ i)) (!s ,s up (mkTyPrec T⊑T')))
+    (!s ,s trans ((var {C = []})) (up-R (mkTyPrec T⊑T'))) ]v)
+  where
+    split-cod : S'⊑T' ≡ trans (refl-⊑ _) S'⊑T'
+    split-cod = isProp⊑ _ _
+
+    split-dom : S⊑T ≡ trans S⊑T (refl-⊑ _)
+    split-dom = isProp⊑ _ _
+
+    swap-middle : Path ((S ∷ []) ⊑ctx (T' ∷ [])) (trans S⊑T T⊑T' ∷ []) (trans S⊑S' S'⊑T' ∷ [])
+    swap-middle i = (isProp⊑ (trans S⊑T T⊑T') (trans S⊑S' S'⊑T') i) ∷ []
+
+-- TODO: show down is monotone
+
+⇀-up-uniqueness : ∀ S⊑S' T⊑T' →
+  up (S⊑S' ⇀TP T⊑T')
+  ≈v lda (bind' (dn' S⊑S' (ret' var)) -- downcast the input
+         (bind' (app' var2 var) -- apply the original function
+         (ret' (up' T⊑T' var))) ) -- upcast the output
+⇀-up-uniqueness S⊑S' T⊑T' =
+  ( {!!}
+  , {!!})
+
+⇀-dn-uniqueness : ∀ S⊑S' T⊑T' →
+  dn (S⊑S' ⇀TP T⊑T')
+  ≈e bind (ret' (lda (dn' T⊑T' (app' var1 (up' S⊑S' var)))))
+⇀-dn-uniqueness = {!!}
diff --git a/formalizations/guarded-cubical/Syntax/Terms.agda b/formalizations/guarded-cubical/Syntax/Terms.agda
index 32b96e4..1a6aa5d 100644
--- a/formalizations/guarded-cubical/Syntax/Terms.agda
+++ b/formalizations/guarded-cubical/Syntax/Terms.agda
@@ -116,13 +116,14 @@ data EvCtx where
   substId : E [ ids ]e ≡ E
   substAssoc : E [ γ ∘s δ ]e ≡ E [ γ ]e [ δ ]e
 
+  ∙substDist : ∙E {S = S} [ γ ]e ≡ ∙E
   ∘substDist : (E ∘E F) [ γ ]e ≡ (E [ γ ]e) ∘E (F [ γ ]e)
 
   bind : Comp (S ∷ Γ) T → EvCtx Γ S T
   -- E[∙] ≡ x <- ∙; E[ret x]
   ret-η : E ≡ bind (E [ wk ]e [ retP [ !s ,s var ]cP ]∙P)
 
-  dn : (S⊑T : TyPrec) → EvCtx Γ (ty-right S⊑T) (ty-left S⊑T)
+  dn : (S⊑T : TyPrec) → EvCtx [] (ty-right S⊑T) (ty-left S⊑T)
 
   isSetEvCtx : isSet (EvCtx Γ S T)
 
@@ -176,19 +177,23 @@ app' Vf Va = app [ !s ,s Vf ,s Va ]c
 !s-nat : (γ : Subst Γ []) → !s ∘s γ ≡ !s
 !s-nat γ = []η
 
-,s-nat : (δ : Subst Θ Δ) (γ : Subst Δ Γ) (V : Val Δ S)
-       → (γ ,s V) ∘s δ ≡ ((γ ∘s δ) ,s (V [ δ ]v))
-,s-nat δ γ V =
-  ,sη
-  ∙ cong₂ _,s_ (∘Assoc ∙ cong (_∘s δ) wkβ)
-               (substAssoc ∙ cong _[ δ ]v varβ)
+!s-ext : {γ : Subst Γ []} → γ ≡ δ
+!s-ext = []η ∙ sym []η
+
+,s-nat : (γ ,s V) ∘s δ ≡ ((γ ∘s δ) ,s (V [ δ ]v))
+,s-nat =
+  ,sη ∙ cong₂ _,s_ (∘Assoc ∙ cong₂ (_∘s_) wkβ refl)
+               (substAssoc ∙ cong₂ _[_]v varβ refl)
+
+,s-ext : wk ∘s γ ≡ wk ∘s δ → (var [ γ ]v ≡ var [ δ ]v) → γ ≡ δ
+,s-ext wkp varp = ,sη ∙ cong₂ _,s_ wkp varp ∙ sym ,sη
 
 -- Some examples for functions
 app'-nat : (γ : Subst Δ Γ) (Vf : Val Γ (S ⇀ T)) (Va : Val Γ S)
          → app' Vf Va [ γ ]c ≡ app' (Vf [ γ ]v) (Va [ γ ]v)
 app'-nat γ Vf Va =
   sym substAssoc
-  ∙ cong (app [_]c) (,s-nat _ _ _ ∙ cong₂ _,s_ (,s-nat _ _ _ ∙ cong₂ _,s_ []η refl) refl)
+  ∙ cong (app [_]c) (,s-nat ∙ cong₂ _,s_ (,s-nat  ∙ cong₂ _,s_ []η refl) refl)
 
 lda-nat : (γ : Subst Δ Γ) (M : Comp (S ∷ Γ) T)
         → (lda M) [ γ ]v ≡ lda (M [ γ ∘s wk ,s var ]c)
@@ -198,8 +203,8 @@ lda-nat {Δ = Δ}{Γ = Γ}{S = S} γ M =
                                                                                     ∙ cong (lda M [_]v) (sym wkβ)
                                                                                     ∙ substAssoc))
                                                       (sym varβ)
-                              ∙ cong (_,s (var [ the-subst ]v)) (sym (,s-nat _ _ _))
-                              ∙ sym (,s-nat _ _ _))
+                              ∙ cong (_,s (var [ the-subst ]v)) (sym ,s-nat)
+                              ∙ sym ,s-nat)
              ∙ substAssoc
              ∙ cong (_[ the-subst ]c) fun-β) where
   the-subst : Subst (S ∷ Δ) (S ∷ Γ)
@@ -208,9 +213,9 @@ lda-nat {Δ = Δ}{Γ = Γ}{S = S} γ M =
 fun-β' : (M : Comp (S ∷ Γ) T) (V : Val Γ S)
        → app' (lda M) V ≡ M [ ids ,s V ]c
 fun-β' M V =
-  cong (app [_]c) (cong₂ _,s_ (cong₂ _,s_ (sym []η) ((sym substId ∙ cong (lda M [_]v) (sym wkβ)) ∙ substAssoc) ∙ sym (,s-nat _ _ _))
+  cong (app [_]c) (cong₂ _,s_ (cong₂ _,s_ (sym []η) ((sym substId ∙ cong (lda M [_]v) (sym wkβ)) ∙ substAssoc) ∙ sym ,s-nat)
                               (sym varβ)
-                  ∙ sym (,s-nat _ _ _))
+                  ∙ sym ,s-nat)
   ∙ substAssoc
   ∙ cong (_[ ids ,s V ]c) fun-β
 
@@ -223,6 +228,29 @@ err' = err [ !s ]c
 ret' : Val Γ S → Comp Γ S
 ret' V = ret [ !s ,s V ]c
 
+bind' : Comp Γ S → Comp (S ∷ Γ) T → Comp Γ T
+bind' M K = bind K [ M ]∙
+
+bind-nat : (bind M) [ γ ]e ≡ bind (M [ γ ∘s wk ,s var ]c)
+bind-nat {M = M} {γ = γ} = ret-η ∙ cong bind (cong (_[ ret [ !s ,s var ]c ]∙) (sym substAssoc)
+                             ∙ cong₂ _[_]∙ (cong (bind M [_]e) (sym wkβ) ∙ substAssoc)
+                                           (cong (ret [_]c) (cong₂ _,s_ !s-ext (sym varβ) ∙ sym ,s-nat) ∙ substAssoc)
+                             ∙ sym substPlugDist
+                             ∙ cong (_[ γ ∘s wk ,s var ]c) ret-β)
+
+bind'-nat : (bind' M N) [ γ ]c ≡ bind' (M [ γ ]c) (N [ γ ∘s wk ,s var ]c)
+bind'-nat = substPlugDist ∙ cong₂ _[_]∙ bind-nat refl
+
+ret-β' : bind' (ret' V) M ≡ (M [ ids ,s V ]c)
+ret-β' =
+  (cong₂ _[_]∙ ((sym substId ∙ cong₂ _[_]e refl (sym wkβ)) ∙ substAssoc)
+               (cong (ret [_]c) (,s-ext !s-ext (varβ ∙ (sym varβ ∙ sym varβ) ∙ cong (var [_]v) (sym ,s-nat))) ∙ substAssoc)
+  ∙ sym substPlugDist)
+  ∙ cong₂ _[_]c ret-β refl
+
+ret-η' : M ≡ bind' M (ret' var)
+ret-η' = sym plugId ∙ cong₂ _[_]∙ (ret-η ∙ cong bind (cong₂ _[_]∙ ∙substDist refl ∙ plugId)) refl
+
 up' : ∀ S⊑T → Val Γ (ty-left S⊑T) → Val Γ (ty-right S⊑T)
 up' S⊑T V = up S⊑T [ !s ,s V ]v
 
@@ -231,3 +259,31 @@ upC S⊑T V = ret' (up' S⊑T V)
 
 upE : ∀ S⊑T → EvCtx Γ (ty-left S⊑T) (ty-right S⊑T)
 upE S⊑T = bind (ret' (up' S⊑T var))
+
+dn' : ∀ S⊑T → Comp Γ (ty-right S⊑T) → Comp Γ (ty-left S⊑T)
+dn' S⊑T M = dn S⊑T [ !s ]e [ M ]∙
+
+ids1-expand : Path (Subst (S ∷ []) (S ∷ [])) ids (!s ,s var)
+ids1-expand = ,sη ∙ cong₂ _,s_ []η substId
+
+var0 : Val (S ∷ Γ) S
+var0 = var
+
+var1 : Val (S ∷ T ∷ Γ) T
+var1 = var [ wk ]v
+
+var2 : Val (S ∷ T ∷ U ∷ Γ) U
+var2 = var1 [ wk ]v
+
+wk-expand : Path (Subst (S ∷ T ∷ []) (T ∷ [])) wk (!s ,s var1)
+wk-expand = ,s-ext !s-ext (sym varβ)
+
+big-η-expand-fun : ∀ (V : Val [ U ] (S ⇀ T)) →
+  V ≡ lda (bind' (ret' var)
+          (bind' (app' (V [ !s ,s var2 ]v) var)
+          (ret' var)))
+big-η-expand-fun V =
+  fun-η ∙ cong lda ((ret-η'
+  ∙ cong₂ bind'
+    (cong (app [_]c) (cong₂ _,s_ (cong₂ _,s_ !s-ext (cong (V [_]v) (wk-expand ∙ ,s-ext !s-ext (varβ ∙ (((sym substId ∙ cong₂ _[_]v refl (sym wkβ)) ∙ substAssoc) ∙ cong₂ _[_]v (sym varβ) refl) ∙ sym substAssoc)) ∙ substAssoc) ∙ sym ,s-nat) (sym varβ) ∙ sym ,s-nat) ∙ substAssoc)
+    (cong (ret [_]c) (,s-ext !s-ext (((varβ ∙ sym varβ) ∙ cong₂ _[_]v (sym varβ) refl) ∙ sym substAssoc)) ∙ substAssoc) ∙ sym bind'-nat) ∙ sym ret-β')
diff --git a/formalizations/guarded-cubical/Syntax/Types.agda b/formalizations/guarded-cubical/Syntax/Types.agda
index 669826f..f8247ed 100644
--- a/formalizations/guarded-cubical/Syntax/Types.agda
+++ b/formalizations/guarded-cubical/Syntax/Types.agda
@@ -44,10 +44,17 @@ record TyPrec : Type where
     ty-prec  : ty-left ⊑ ty-right
 
 open TyPrec
+mkTyPrec : S ⊑ T → TyPrec
+mkTyPrec p = record { ty-left = _ ; ty-right = _ ; ty-prec = p }
 
 refl-TP : ∀ (S : Ty) → TyPrec
 refl-TP S = record { ty-left = S ; ty-right = S ; ty-prec = refl-⊑ S }
 
+_⇀TP_ : TyPrec → TyPrec → TyPrec
+(c ⇀TP d) .ty-left = ty-left c ⇀ ty-left d
+(c ⇀TP d) .ty-right = ty-right c ⇀ ty-right d
+(c ⇀TP d) .ty-prec = c .ty-prec ⇀ d .ty-prec
+
 Ctx = List Ty
 private
   variable
@@ -87,6 +94,7 @@ cons c C .ctx-prec = (ty-prec c) ∷ (ctx-prec C)
 refl-CP : Ctx → CtxPrec
 refl-CP [] = nil
 refl-CP (S ∷ Γ) = cons (refl-TP S) (refl-CP Γ)
+
 module _ where
   open import Cubical.Foundations.HLevels
   open import Cubical.Data.W.Indexed
-- 
GitLab