From 8e66074a2b5e43c5cb270c525e0acc34194b4a49 Mon Sep 17 00:00:00 2001
From: Wen Kokke <wenkokke@users.noreply.github.com>
Date: Tue, 12 Mar 2019 11:31:36 +0100
Subject: [PATCH] Finished adding units, products, and sums to QTT

---
 extra/qtt/Quantitative.lagda | 353 +++++++++++++++++++++++++----------
 1 file changed, 253 insertions(+), 100 deletions(-)

diff --git a/extra/qtt/Quantitative.lagda b/extra/qtt/Quantitative.lagda
index ef2062ec..43e2318e 100644
--- a/extra/qtt/Quantitative.lagda
+++ b/extra/qtt/Quantitative.lagda
@@ -21,8 +21,6 @@ module qtt.Quantitative
   (0# 1# : Mult)
   (*-+-isSemiring : IsSemiring _≡_ _+_ _*_ 0# 1#)
   where
-
-variable π : Mult
 \end{code}
 
 \begin{code}
@@ -41,9 +39,9 @@ infix  1 _∋_
 infixl 5 _,_
 infixl 5 _,_∙_
 infixr 6 [_∙_]⊸_
-infixr 7 _+̇_
+infixl 7 _+̇_
 infixl 8 _*̇_
-infix  9 _*⟩_
+infixl 8 _*⟩_
 \end{code}
 
 
@@ -56,8 +54,6 @@ data Type : Set where
   `1      : Type
   _⊗_     : Type → Type → Type
   _⊕_     : Type → Type → Type
-
-variable A B C : Type
 \end{code}
 
 \begin{code}
@@ -86,10 +82,14 @@ _ = ∅ , `0 ⊸ `0 , `0
 \begin{code}
 data _∋_ : Precontext → Type → Set where
 
-  Z  : ---------
-       γ , A ∋ A
+  Z  : ∀ {γ} {A}
 
-  S_ : γ ∋ A
+       ---------
+     → γ , A ∋ A
+
+  S_ : ∀ {γ} {A B}
+
+     → γ ∋ A
        ---------
      → γ , B ∋ A
 \end{code}
@@ -167,45 +167,66 @@ identity {γ , B} (S x) = identity x , 0# ∙ B
 \begin{code}
 data _⊢_ : ∀ {γ} (Γ : Context γ) (A : Type) → Set where
 
-  `_    : (x : γ ∋ A)
+  `_    : ∀ {γ} {A}
+
+        → (x : γ ∋ A)
           --------------
         → identity x ⊢ A
 
-  ƛ_    : Γ , π ∙ A ⊢ B
+  ƛ_    : ∀ {γ} {Γ : Context γ} {A B} {π}
+
+        → Γ , π ∙ A ⊢ B
           ----------------
         → Γ ⊢ [ π ∙ A ]⊸ B
 
-  _·_   : Γ ⊢ [ π ∙ A ]⊸ B
+  _·_   : ∀ {γ} {Γ Δ : Context γ} {A B} {π}
+
+        → Γ ⊢ [ π ∙ A ]⊸ B
         → Δ ⊢ A
           ----------------
         → Γ +̇ π *̇ Δ ⊢ B
 
-  ⟨⟩    : 0s {γ} ⊢ `1
+  ⟨⟩    : ∀ {γ}
 
-  case1 : Γ ⊢ `1
+          -----------
+        → 0s {γ} ⊢ `1
+
+  case1 : ∀ {γ} {Γ Δ : Context γ} {A}
+
+        → Γ ⊢ `1
         → Δ ⊢ A
           ---------
         → Γ +̇ Δ ⊢ A
 
-  ⟨_,_⟩ : Γ ⊢ A
+  ⟨_,_⟩ : ∀ {γ} {Γ Δ : Context γ} {A B}
+
+        → Γ ⊢ A
         → Δ ⊢ B
           -------------
         → Γ +̇ Δ ⊢ A ⊗ B
 
-  case⊗ : Γ ⊢ A ⊗ B
+  case⊗ : ∀ {γ} {Γ Δ : Context γ} {A B C}
+
+        → Γ ⊢ A ⊗ B
         → Δ , 1# ∙ A , 1# ∙ B ⊢ C
           -----------------------
         → Γ +̇ Δ ⊢ C
 
-  inj₁  : Γ ⊢ A
+  inj₁  : ∀ {γ} {Γ : Context γ} {A B}
+
+        → Γ ⊢ A
           ---------
         → Γ ⊢ A ⊕ B
 
-  inj₂  : Γ ⊢ B
+  inj₂  : ∀ {γ} {Γ : Context γ} {A B}
+
+        → Γ ⊢ B
           ---------
         → Γ ⊢ A ⊕ B
 
-  case⊕ : Γ ⊢ A ⊕ B
+  case⊕ : ∀ {γ} {Γ Δ : Context γ} {A B C}
+
+        → Γ ⊢ A ⊕ B
         → Δ , 1# ∙ A ⊢ C
         → Δ , 1# ∙ B ⊢ C
           --------------
@@ -510,7 +531,7 @@ Linear maps distribute over sums.
     (π₁ + π₂) *̇ Ξ Z +̇ (Γ₁ +̇ Γ₂) *⟩ (Ξ ∘ S_)
   ≡⟨ *⟩-distribʳ-+̇ Γ₁ Γ₂ (Ξ ∘ S_) |> cong ((π₁ + π₂) *̇ Ξ Z +̇_) ⟩
     (π₁ + π₂) *̇ Ξ Z +̇ (Γ₁ *⟩ (Ξ ∘ S_) +̇ Γ₂ *⟩ (Ξ ∘ S_))
-  ≡⟨ *̇-distribʳ-+̇ (Ξ Z) π₁ π₂ |> cong (_+̇ Γ₁ *⟩ (Ξ ∘ S_) +̇ Γ₂ *⟩ (Ξ ∘ S_)) ⟩
+  ≡⟨ *̇-distribʳ-+̇ (Ξ Z) π₁ π₂ |> cong (_+̇ (Γ₁ *⟩ (Ξ ∘ S_) +̇ Γ₂ *⟩ (Ξ ∘ S_))) ⟩
     (π₁ *̇ Ξ Z +̇ π₂ *̇ Ξ Z) +̇ (Γ₁ *⟩ (Ξ ∘ S_) +̇ Γ₂ *⟩ (Ξ ∘ S_))
   ≡⟨ +̇-assoc (π₁ *̇ Ξ Z +̇ π₂ *̇ Ξ Z) (Γ₁ *⟩ (Ξ ∘ S_)) (Γ₂ *⟩ (Ξ ∘ S_)) |> sym ⟩
     ((π₁ *̇ Ξ Z +̇ π₂ *̇ Ξ Z) +̇ Γ₁ *⟩ (Ξ ∘ S_)) +̇ Γ₂ *⟩ (Ξ ∘ S_)
@@ -604,8 +625,6 @@ ext ρ Z      =  Z
 ext ρ (S x)  =  S (ρ x)
 \end{code}
 
-
-
 \begin{code}
 lem-` : ∀ {γ δ} {A} {Ξ : Matrix γ δ} (x : γ ∋ A) → _
 lem-` {γ} {δ} {A} {Ξ} x =
@@ -660,14 +679,33 @@ lem-, {γ} {δ} Γ Δ {Ξ} =
 
 \begin{code}
 postulate
-  lem-⊗ : ∀ {γ δ} (Δ : Context γ) {A B} {Ξ : Matrix γ δ} →
+  lem-case⊗ : ∀ {γ δ} (Δ : Context γ) {A B} {Ξ : Matrix γ δ} →
       (1# *̇ 0s , 1# * 0# ∙ A , 1# * 1# ∙ B) +̇
-      (1# *̇ 0s , 1# * 1# ∙ A , 1# * 0# ∙ B) +̇
-      Δ *⟩ (λ x → Ξ x , 0# ∙ A , 0# ∙ B)
+      ((1# *̇ 0s , 1# * 1# ∙ A , 1# * 0# ∙ B) +̇
+      Δ *⟩ (λ x → Ξ x , 0# ∙ A , 0# ∙ B))
     ≡
       Δ *⟩ Ξ , 1# ∙ A , 1# ∙ B
 \end{code}
 
+
+\begin{code}
+lem-⟨⟩ : ∀ {γ δ} {Ξ : Matrix δ γ} → _
+lem-⟨⟩ {γ} {δ} {Ξ} =
+  begin
+    0s {γ}
+  ≡⟨ *⟩-zeroˡ Ξ |> sym ⟩
+    0s {δ} *⟩ Ξ
+  ∎
+\end{code}
+
+\begin{code}
+postulate
+  lem-⊕ : ∀ {γ δ} (Γ : Context γ) {A : Type} {Ξ : Matrix γ δ} →
+      (1# *̇ 0s , 1# * 1# ∙ A) +̇ Γ *⟩ (λ x → Ξ x , 0# ∙ A)
+    ≡
+      Γ *⟩ Ξ , 1# ∙ A
+\end{code}
+
 \begin{code}
 rename : ∀ {γ δ} {Γ : Context γ} {B}
 
@@ -682,10 +720,20 @@ rename ρ (ƛ_  {Γ = Γ} N) =
   ƛ (Eq.subst (_⊢ _) (lem-ƛ Γ) (rename (ext ρ) N))
 rename ρ (_·_ {Γ = Γ} {Δ = Δ} L M) =
   Eq.subst (_⊢ _) (lem-· Γ Δ) (rename ρ L · rename ρ M)
+rename ρ ⟨⟩ =
+  Eq.subst (_⊢ _) (lem-⟨⟩ {Ξ = identity ∘ ρ}) ⟨⟩
+rename ρ (case1 {Γ = Γ} {Δ = Δ} L N) =
+  Eq.subst (_⊢ _) (lem-, Γ Δ) (case1 (rename ρ L) (rename ρ N))
 rename ρ (⟨_,_⟩ {Γ = Γ} {Δ = Δ} L M) =
   Eq.subst (_⊢ _) (lem-, Γ Δ) ⟨ rename ρ L , rename ρ M ⟩
 rename ρ (case⊗ {Γ = Γ} {Δ = Δ} L N) =
-  Eq.subst (_⊢ _) (lem-, Γ Δ) (case⊗ (rename ρ L) (Eq.subst (_⊢ _) (lem-⊗ Δ) (rename (ext (ext ρ)) N)))
+  Eq.subst (_⊢ _) (lem-, Γ Δ) (case⊗ (rename ρ L) (Eq.subst (_⊢ _) (lem-case⊗ Δ) (rename (ext (ext ρ)) N)))
+rename ρ (inj₁ {Γ = Γ} L) =
+  inj₁ (rename ρ L)
+rename ρ (inj₂ {Γ = Γ} L) =
+  inj₂ (rename ρ L)
+rename ρ (case⊕ {Γ = Γ} {Δ = Δ} L M N) =
+  Eq.subst (_⊢ _) (lem-, Γ Δ) (case⊕ (rename ρ L) (Eq.subst (_⊢ _) (lem-⊕ Δ) (rename (ext ρ) M)) (Eq.subst (_⊢ _) (lem-⊕ Δ) (rename (ext ρ) N)))
 \end{code}
 
 
@@ -726,16 +774,6 @@ exts {Ξ = Ξ} σ {A} {B} (S x) = Eq.subst (_⊢ A) lem (rename S_ (σ x))
      ∎
 \end{code}
 
-\begin{code}
-lem-⟨⟩ : ∀ {γ δ} {Ξ : Matrix δ γ} → _
-lem-⟨⟩ {γ} {δ} {Ξ} =
-  begin
-    0s {γ}
-  ≡⟨ *⟩-zeroˡ Ξ |> sym ⟩
-    0s {δ} *⟩ Ξ
-  ∎
-\end{code}
-
 \begin{code}
 subst : ∀ {γ δ} {Γ : Context γ} {Ξ : Matrix γ δ} {B}
 
@@ -757,39 +795,63 @@ subst {Ξ = Ξ} σ (case1 {Γ = Γ} {Δ = Δ} L N) =
 subst {Ξ = Ξ} σ (⟨_,_⟩ {Γ = Γ} {Δ = Δ} L M) =
   Eq.subst (_⊢ _) (lem-, Γ Δ) ⟨ subst σ L , subst σ M ⟩
 subst {Ξ = Ξ} σ (case⊗ {Γ = Γ} {Δ = Δ} L N) =
-  Eq.subst (_⊢ _) (lem-, Γ Δ) (case⊗ (subst σ L) (Eq.subst (_⊢ _) (lem-⊗ Δ) (subst (exts (exts σ)) N)))
+  Eq.subst (_⊢ _) (lem-, Γ Δ) (case⊗ (subst σ L) (Eq.subst (_⊢ _) (lem-case⊗ Δ) (subst (exts (exts σ)) N)))
 subst {Ξ = Ξ} σ (inj₁ {Γ = Γ} L) =
-  Eq.subst (_⊢ _) {!!} (inj₁ (subst σ L))
+  inj₁ (subst σ L)
 subst {Ξ = Ξ} σ (inj₂ {Γ = Γ} L) =
-  Eq.subst (_⊢ _) {!!} (inj₂ (subst σ L))
+  inj₂ (subst σ L)
 subst {Ξ = Ξ} σ (case⊕ {Γ = Γ} {Δ = Δ} L M N) =
-  {!Eq.subst (_⊢ _) ? (case⊕ (subst σ L) (subst (exts σ) M) (subst (exts σ) N))!}
+  Eq.subst (_⊢ _) (lem-, Γ Δ) (case⊕ (subst σ L) (Eq.subst (_⊢ _) (lem-⊕ Δ) (subst (exts σ) M)) (Eq.subst (_⊢ _) (lem-⊕ Δ) (subst (exts σ) N)))
+\end{code}
+
+
+# Values
+
+\begin{code}
+data Value : ∀ {γ} {Γ : Context γ} {A} → Γ ⊢ A → Set where
+
+  V-ƛ    : ∀ {γ} {Γ : Context γ} {A B} {π} {N : Γ , π ∙ A ⊢ B}
+
+      -----------
+    → Value (ƛ N)
+
+  V-⟨⟩   : ∀ {γ}
+
+      --------------
+    → Value (⟨⟩ {γ})
+
+  V-,    : ∀ {γ} {Γ Δ : Context γ} {A B} {L : Γ ⊢ A} {M : Δ ⊢ B}
+
+    → Value L
+    → Value M
+      ---------------
+    → Value ⟨ L , M ⟩
+
+  V-inj₁ : ∀ {γ} {Γ : Context γ} {A B} {L : Γ ⊢ A}
+
+    → Value L
+      --------------
+    → Value (inj₁ {B = B} L)
+
+  V-inj₂ : ∀ {γ} {Γ : Context γ} {A B} {L : Γ ⊢ B}
+
+    → Value L
+      --------------
+    → Value (inj₂ {A = A} L)
 \end{code}
 
 
 # Single Substitution
 
 \begin{code}
-lem-[] : ∀ {γ} (Γ Δ : Context γ) {π} → _
-lem-[] {γ} Γ Δ {π} =
-  begin
-    π *̇ Δ +̇ Γ *⟩ identity
-  ≡⟨ +̇-comm (π *̇ Δ) (Γ *⟩ identity) ⟩
-    Γ *⟩ identity +̇ π *̇ Δ
-  ≡⟨ *⟩-identityʳ Γ |> cong (_+̇ π *̇ Δ) ⟩
-    Γ +̇ π *̇ Δ
-  ∎
-\end{code}
-
-\begin{code}
-_[_] : ∀ {γ} {Γ Δ : Context γ} {A B} {π}
+_⊸[_] : ∀ {γ} {Γ Δ : Context γ} {A B} {π}
 
   → Γ , π ∙ B ⊢ A
   → Δ ⊢ B
     --------------
   → Γ +̇ π *̇ Δ ⊢ A
 
-_[_] {γ} {Γ} {Δ} {A} {B} {π} N M = Eq.subst (_⊢ _) (lem-[] Γ Δ) (subst σ′ N)
+_⊸[_] {γ} {Γ} {Δ} {A} {B} {π} N M = Eq.subst (_⊢ _) lem (subst σ′ N)
   where
     Ξ′ : Matrix (γ , B) γ
     Ξ′ Z     = Δ
@@ -797,27 +859,45 @@ _[_] {γ} {Γ} {Δ} {A} {B} {π} N M = Eq.subst (_⊢ _) (lem-[] Γ Δ) (subst 
     σ′ : ∀ {A} → (x : γ , B ∋ A) → Ξ′ x ⊢ A
     σ′ Z     = M
     σ′ (S x) = ` x
+
+    lem =
+      begin
+        π *̇ Δ +̇ Γ *⟩ identity
+      ≡⟨ +̇-comm (π *̇ Δ) (Γ *⟩ identity) ⟩
+        Γ *⟩ identity +̇ π *̇ Δ
+      ≡⟨ *⟩-identityʳ Γ |> cong (_+̇ π *̇ Δ) ⟩
+       Γ +̇ π *̇ Δ
+      ∎
 \end{code}
 
 \begin{code}
-postulate
-  lem-[][] : ∀ {γ} (Γ Δ Θ : Context γ) →
-      1# *̇ Δ +̇ 1# *̇ Γ +̇ Θ *⟩ identity
-    ≡
-      (Γ +̇ Δ) +̇ Θ
+_1[_] : ∀ {γ} {Γ Δ : Context γ} {A} {V : Γ ⊢ `1}
+
+  → Δ ⊢ A
+  → Value V
+    ---------
+  → Γ +̇ Δ ⊢ A
+
+_1[_] {Δ = Δ}  N V-⟨⟩ = Eq.subst (_⊢ _) lem N
+  where
+    lem =
+      begin
+        Δ
+      ≡⟨ +̇-identityˡ Δ |> sym ⟩
+        0s +̇ Δ
+      ∎
 \end{code}
 
-
 \begin{code}
-_[_][_] : ∀ {γ} {Γ Δ Θ : Context γ} {A B C}
+_⊗[_][_] : ∀ {γ} {Γ Δ Θ : Context γ} {A B C}
 
   → Θ , 1# ∙ A , 1# ∙ B ⊢ C
   → Γ ⊢ A
   → Δ ⊢ B
     ---------------
-  → (Γ +̇ Δ) +̇ Θ ⊢ C
+  → Γ +̇ Δ +̇ Θ ⊢ C
 
-_[_][_] {γ} {Γ} {Δ} {Θ} {A} {B} {C} N L M = Eq.subst (_⊢ _) (lem-[][] Γ Δ Θ) (subst σ′ N)
+_⊗[_][_] {γ} {Γ} {Δ} {Θ} {A} {B} {C} N L M = Eq.subst (_⊢ _) lem (subst σ′ N)
   where
     Ξ′ : Matrix (γ , A , B) γ
     Ξ′ Z         = Δ
@@ -827,28 +907,44 @@ _[_][_] {γ} {Γ} {Δ} {Θ} {A} {B} {C} N L M = Eq.subst (_⊢ _) (lem-[][] Γ 
     σ′ Z         = M
     σ′ (S Z)     = L
     σ′ (S (S x)) = ` x
+
+    lem =
+      begin
+        1# *̇ Δ +̇ (1# *̇ Γ +̇ Θ *⟩ identity)
+      ≡⟨ *⟩-identityʳ Θ |> cong ((1# *̇ Δ +̇_) ∘ (1# *̇ Γ +̇_)) ⟩
+        1# *̇ Δ +̇ (1# *̇ Γ +̇ Θ)
+      ≡⟨ *̇-identityˡ Γ |> cong ((1# *̇ Δ +̇_) ∘ (_+̇ Θ)) ⟩
+        1# *̇ Δ +̇ (Γ +̇ Θ)
+      ≡⟨ *̇-identityˡ Δ |> cong (_+̇ (Γ +̇ Θ)) ⟩
+        Δ +̇ (Γ +̇ Θ)
+      ≡⟨ +̇-assoc Δ Γ Θ |> sym ⟩
+        (Δ +̇ Γ) +̇ Θ
+      ≡⟨ +̇-comm Δ Γ |> cong (_+̇ Θ) ⟩
+        (Γ +̇ Δ) +̇ Θ
+      ∎
 \end{code}
 
-
-# Values
-
 \begin{code}
-data Value : ∀ {γ} {Γ : Context γ} {A} → Γ ⊢ A → Set where
+_⊕[_] : ∀ {γ} {Γ Δ : Context γ} {A B}
 
-  V-ƛ : {N : Γ , π ∙ A ⊢ B}
+  → Δ , 1# ∙ B ⊢ A
+  → Γ ⊢ B
+    --------------
+  → Γ +̇ Δ ⊢ A
 
-        -----------
-      → Value (ƛ N)
-
-  V-, : {L : Γ ⊢ A} {M : Δ ⊢ B}
-
-
-      → Value L
-      → Value M
-        ---------------
-      → Value ⟨ L , M ⟩
+_⊕[_] {γ} {Γ} {Δ} {A} {B} N M = Eq.subst (_⊢ _) lem (N ⊸[ M ])
+  where
+    lem =
+      begin
+        Δ +̇ 1# *̇ Γ
+      ≡⟨ *̇-identityˡ Γ |> cong (Δ +̇_) ⟩
+        Δ +̇ Γ
+      ≡⟨ +̇-comm Δ Γ ⟩
+        Γ +̇ Δ
+      ∎
 \end{code}
 
+
 # Reduction
 
 \begin{code}
@@ -856,50 +952,93 @@ infix 2 _—→_
 
 data _—→_ : ∀ {γ} {Γ : Context γ} {A} → (Γ ⊢ A) → (Γ ⊢ A) → Set where
 
-  ξ-·₁ : {L L′ : Γ ⊢ [ π ∙ A ]⊸ B} {M : Δ ⊢ A}
+  ξ-·₁ : ∀ {γ} {Γ Δ : Context γ} {A B} {π} {L L′ : Γ ⊢ [ π ∙ A ]⊸ B} {M : Δ ⊢ A}
 
        → L —→ L′
         -----------------
        → L · M —→ L′ · M
 
-  ξ-·₂ : {V : Γ ⊢ [ π ∙ A ]⊸ B} {M M′ : Δ ⊢ A}
+  ξ-·₂ : ∀ {γ} {Γ Δ : Context γ} {A B} {π} {V : Γ ⊢ [ π ∙ A ]⊸ B} {M M′ : Δ ⊢ A}
 
        → Value V
        → M —→ M′
          --------------
        → V · M —→ V · M′
 
-  ξ-,₁ : {L L′ : Γ ⊢ A} {M : Δ ⊢ B}
+  ξ-case1 : ∀ {γ} {Γ Δ : Context γ} {A} {L L′ : Γ ⊢ `1} {M : Δ ⊢ A}
+
+       → L —→ L′
+         -----------------------
+       → case1 L M —→ case1 L′ M
+
+  ξ-,₁ : ∀ {γ} {Γ Δ : Context γ} {A B} {L L′ : Γ ⊢ A} {M : Δ ⊢ B}
 
        → L —→ L′
          -----------------------
        → ⟨ L , M ⟩ —→ ⟨ L′ , M ⟩
 
-  ξ-,₂ : {V : Γ ⊢ A} {M M′ : Δ ⊢ B}
+  ξ-,₂ : ∀ {γ} {Γ Δ : Context γ} {A B} {V : Γ ⊢ A} {M M′ : Δ ⊢ B}
 
        → Value V
        → M —→ M′
          -----------------------
        → ⟨ V , M ⟩ —→ ⟨ V , M′ ⟩
 
-  ξ-⊗  : {L L′ : Γ ⊢ A ⊗ B} {N : Δ , 1# ∙ A , 1# ∙ B ⊢ C}
+  ξ-case⊗ : ∀ {γ} {Γ Δ : Context γ} {A B C} {L L′ : Γ ⊢ A ⊗ B} {N : Δ , 1# ∙ A , 1# ∙ B ⊢ C}
 
        → L —→ L′
          ------------------------
        → case⊗ L N —→ case⊗ L′ N
 
-  β-ƛ  : {N : Γ , π ∙ A ⊢ B} {W : Δ ⊢ A}
+  ξ-inj₁ : ∀ {γ} {Γ : Context γ} {A B} {L L′ : Γ ⊢ A}
 
-       → Value W
-         --------------------
-       → (ƛ N) · W —→ N [ W ]
-
-  β-⊗  :  {V : Γ ⊢ A} {W : Δ ⊢ B} {N : Θ , 1# ∙ A , 1# ∙ B ⊢ C}
-
-       → Value V
-       → Value W
+       → L —→ L′
          ---------------------------------
-       → case⊗ ⟨ V , W ⟩ N —→ N [ V ][ W ]
+       → inj₁ {B = B} L —→ inj₁ {B = B} L′
+
+  ξ-inj₂ : ∀ {γ} {Γ : Context γ} {A B} {L L′ : Γ ⊢ B}
+
+       → L —→ L′
+         ---------------------------------
+       → inj₂ {A = A} L —→ inj₂ {A = A} L′
+
+  ξ-case⊕ : ∀ {γ} {Γ Δ : Context γ} {A B C} {L L′ : Γ ⊢ A ⊕ B} {M : Δ , 1# ∙ A ⊢ C} {N : Δ , 1# ∙ B ⊢ C}
+
+       → L —→ L′
+         ---------------------------
+       → case⊕ L M N —→ case⊕ L′ M N
+
+  β-⊸  : ∀ {γ} {Γ Δ : Context γ} {A B} {π} {N : Γ , π ∙ A ⊢ B} {W : Δ ⊢ A}
+
+       → (VW : Value W)
+         --------------------
+       → (ƛ N) · W —→ N ⊸[ W ]
+
+  β-1  : ∀ {γ} {Γ Δ : Context γ} {A} {V : Γ ⊢ `1} {N : Δ ⊢ A}
+
+       → (VV : Value V)
+         ----------------------
+       → case1 V N —→ N 1[ VV ]
+
+  β-⊗  : ∀ {γ} {Γ Δ Θ : Context γ} {A B C} {V : Γ ⊢ A} {W : Δ ⊢ B} {N : Θ , 1# ∙ A , 1# ∙ B ⊢ C}
+
+       → (VV : Value V)
+       → (VW : Value W)
+         ---------------------------------
+       → case⊗ ⟨ V , W ⟩ N —→ N ⊗[ V ][ W ]
+
+  β-⊕₁ : ∀ {γ} {Γ Δ : Context γ} {A B C} {V : Γ ⊢ A} {M : Δ , 1# ∙ A ⊢ C} {N : Δ , 1# ∙ B ⊢ C}
+
+       → (VV : Value V)
+         -----------------------------
+       → case⊕ (inj₁ V) M N —→ M ⊕[ V ]
+
+
+  β-⊕₂ : ∀ {γ} {Γ Δ : Context γ} {A B C} {V : Γ ⊢ B} {M : Δ , 1# ∙ A ⊢ C} {N : Δ , 1# ∙ B ⊢ C}
+
+       → (VV : Value V)
+         -----------------------------
+       → case⊕ (inj₂ V) M N —→ N ⊕[ V ]
 \end{code}
 
 
@@ -928,17 +1067,31 @@ progress M = go refl M
     go : ∀ {γ} {Γ : Context γ} {A} → γ ≡ ∅ → (M : Γ ⊢ A) → Progress M
     go refl (` ())
     go refl (ƛ N)               = done V-ƛ
-    go refl (L · M)     with go refl L
+    go refl (L · M)       with go refl L
     ...    | step L—→L′         = step (ξ-·₁ L—→L′)
-    ...    | done V-ƛ   with go refl M
+    ...    | done V-ƛ     with go refl M
     ...        | step M—→M′     = step (ξ-·₂ V-ƛ M—→M′)
-    ...        | done V-M       = step (β-ƛ V-M)
-    go refl ⟨ L , M ⟩   with go refl L
+    ...        | done V-M       = step (β-⊸ V-M)
+    go refl ⟨⟩                  = done V-⟨⟩
+    go refl (case1 L N)   with go refl L
+    ...    | step L—→L′         = step (ξ-case1 L—→L′)
+    ...    | done V-L           = step (β-1 V-L)
+    go refl ⟨ L , M ⟩     with go refl L
     ...    | step L—→L′         = step (ξ-,₁ L—→L′)
-    ...    | done V-L   with go refl M
+    ...    | done V-L     with go refl M
     ...        | step M—→M′     = step (ξ-,₂ V-L M—→M′)
     ...        | done V-M       = done (V-, V-L V-M)
-    go refl (case⊗ L N) with go refl L
-    ...    | step L—→L′         = step (ξ-⊗ L—→L′)
+    go refl (case⊗ L N)   with go refl L
+    ...    | step L—→L′         = step (ξ-case⊗ L—→L′)
     ...    | done (V-, V-L V-M) = step (β-⊗ V-L V-M)
+    go refl (inj₁ L)      with go refl L
+    ...    | step L—→L′         = step (ξ-inj₁ L—→L′)
+    ...    | done V-L           = done (V-inj₁ V-L)
+    go refl (inj₂ L)      with go refl L
+    ...    | step L—→L′         = step (ξ-inj₂ L—→L′)
+    ...    | done V-L           = done (V-inj₂ V-L)
+    go refl (case⊕ L M N) with go refl L
+    ...    | step L—→L′         = step (ξ-case⊕ L—→L′)
+    ...    | done (V-inj₁ V-L)  = step (β-⊕₁ V-L)
+    ...    | done (V-inj₂ V-L)  = step (β-⊕₂ V-L)
 \end{code}