├── higher-rank-syntax.agda-lib └── src ├── Alternatives.agda ├── FixPointRel.agda ├── Rank.agda ├── Renaming.agda ├── SizeInduction.agda ├── Substitution.agda └── Syntax.agda /higher-rank-syntax.agda-lib: -------------------------------------------------------------------------------- 1 | name: higher-rank-syntax -- formalization of higher-rank syntax 2 | depend: agda-categories 3 | include: src 4 | -------------------------------------------------------------------------------- /src/Alternatives.agda: -------------------------------------------------------------------------------- 1 | -- Old attempts at convincing Agda that substituition terminates. 2 | 3 | open import Agda.Primitive 4 | open import Relation.Unary hiding (_∈_) 5 | open import Relation.Binary 6 | open import Relation.Binary.PropositionalEquality 7 | open import Data.Product using (_,_; _×_) 8 | open import Function using (_∘_) 9 | open import Data.List hiding ([_]; tabulate; map) 10 | 11 | open ≡-Reasoning 12 | 13 | import Syntax 14 | import Renaming 15 | 16 | 17 | module Alternatives (Class : Set) where 18 | 19 | open Syntax Class 20 | open Renaming Class 21 | 22 | -- Lifting of renamings to substitutions, and of variables to expressions 23 | 24 | lift : ∀ {γ δ} → (γ →ʳ δ) → (γ →ˢ δ) 25 | 26 | η : ∀ {γ a} (x : a ∈ γ) → Arg γ a 27 | 28 | lift 𝟘 = 𝟘 29 | lift [ x ] = [ η x ] 30 | lift (ρ₁ ⊕ ρ₂) = lift ρ₁ ⊕ lift ρ₂ 31 | 32 | η x = var-left x ` lift (tabulate var-right) 33 | 34 | -- Ideally we would like the following to be the definition of lift, 35 | -- but Agda termination gets in the way 36 | 37 | lift-map-η : ∀ {γ δ} (ρ : γ →ʳ δ) → lift ρ ≡ map η ρ 38 | lift-map-η 𝟘 = refl 39 | lift-map-η [ x ] = refl 40 | lift-map-η (ρ₁ ⊕ ρ₂) = cong₂ _⊕_ (lift-map-η ρ₁) (lift-map-η ρ₂) 41 | 42 | lift-𝟙ʳ : ∀ {γ} → lift 𝟙ʳ ≡ tabulate (η {γ = γ}) 43 | lift-𝟙ʳ = trans (lift-map-η 𝟙ʳ) map-tabulate 44 | 45 | -- Identity substitution 46 | 47 | 𝟙ˢ : ∀ {γ} → γ →ˢ γ 48 | 𝟙ˢ = lift 𝟙ʳ 49 | 50 | -- Substitution extension 51 | 52 | ⇑ˢ : ∀ {γ δ θ} → γ →ˢ δ → γ ⊕ θ →ˢ δ ⊕ θ 53 | ⇑ˢ {θ = θ} f = map [ ⇑ʳ (tabulate var-left) ]ʳ_ f ⊕ lift (tabulate var-right) 54 | 55 | -- The interaction of lifting with various operations 56 | 57 | lift-∙ : ∀ {γ δ} (ρ : γ →ʳ δ) {a} (x : a ∈ γ) → 58 | lift ρ ∙ x ≡ η (ρ ∙ x) 59 | lift-∙ [ _ ] var-here = refl 60 | lift-∙ (ρ₁ ⊕ ρ₂) (var-left x) = lift-∙ ρ₁ x 61 | lift-∙ (ρ₁ ⊕ ρ₂) (var-right y) = lift-∙ ρ₂ y 62 | 63 | 𝟙ˢ-∙ : ∀ {γ a} {x : a ∈ γ} → 𝟙ˢ ∙ x ≡ η x 64 | 𝟙ˢ-∙ {x = x} = trans (lift-∙ 𝟙ʳ x) (cong η 𝟙ʳ-≡) 65 | 66 | lift-tabulate : ∀ {γ δ} (f : ∀ {α} → α ∈ γ → α ∈ δ) {a} (x : a ∈ γ) → 67 | lift (tabulate f) ∙ x ≡ η (f x) 68 | lift-tabulate f var-here = refl 69 | lift-tabulate f (var-left x) = lift-tabulate (λ z → f (var-left z)) x 70 | lift-tabulate f (var-right y) = lift-tabulate (λ z → f (var-right z)) y 71 | 72 | ∘ʳ-lift : ∀ {γ δ θ} (ρ : γ →ʳ δ) (τ : δ →ʳ θ) {a} (x : a ∈ γ) → 73 | lift (τ ∘ʳ ρ) ∙ x ≡ lift τ ∙ (ρ ∙ x) 74 | ∘ʳ-lift [ x ] τ var-here = sym (lift-∙ τ x) 75 | ∘ʳ-lift (ρ₁ ⊕ ρ₂) τ (var-left x) = ∘ʳ-lift ρ₁ τ x 76 | ∘ʳ-lift (ρ₁ ⊕ ρ₂) τ (var-right y) = ∘ʳ-lift ρ₂ τ y 77 | 78 | []ʳ-lift : ∀ {γ δ θ} (ρ : γ →ʳ δ) (τ : δ →ʳ θ) {a} (x : a ∈ γ) → [ ⇑ʳ τ ]ʳ (lift ρ ∙ x) ≡ lift (τ ∘ʳ ρ) ∙ x 79 | []ʳ-η : ∀ {γ δ} (ρ : γ →ʳ δ) {a} (x : a ∈ γ) → [ ⇑ʳ ρ ]ʳ η x ≡ η (ρ ∙ x) 80 | 81 | []ʳ-lift [ x ] τ var-here = []ʳ-η τ x 82 | []ʳ-lift (ρ₁ ⊕ ρ₂) τ (var-left x) = []ʳ-lift ρ₁ τ x 83 | []ʳ-lift (ρ₁ ⊕ ρ₂) τ (var-right x) = []ʳ-lift ρ₂ τ x 84 | 85 | ⇑ʳ-∘ʳ-tabulate-var-right : ∀ {γ δ θ} (ρ : γ →ʳ δ) → 86 | (⇑ʳ {θ = θ} ρ ∘ʳ tabulate var-right) ≡ tabulate var-right 87 | ⇑ʳ-∘ʳ-tabulate-var-right {θ = θ} ρ = shape-≡ ξ 88 | where ξ : ∀ {a} (x : a ∈ θ) → (⇑ʳ ρ ∘ʳ tabulate var-right) ∙ x ≡ tabulate var-right ∙ x 89 | ξ x = trans 90 | (trans 91 | (∘ʳ-∙ {ρ = ⇑ʳ ρ} {τ = tabulate var-right} {x = x}) 92 | (trans (cong (⇑ʳ ρ ∙_) (tabulate-∙ var-right)) (tabulate-∙ var-right))) 93 | (sym (tabulate-∙ var-right)) 94 | 95 | [⇑ʳ]-lift-var-right : ∀ {γ δ θ} (ρ : γ →ʳ δ) {a} (x : a ∈ θ) → 96 | [ ⇑ʳ (⇑ʳ ρ) ]ʳ lift (tabulate var-right) ∙ x ≡ lift (tabulate var-right) ∙ x 97 | [⇑ʳ]-lift-var-right ρ x = trans ([]ʳ-lift (tabulate var-right) (⇑ʳ ρ) x) (cong (λ τ → lift τ ∙ x) (⇑ʳ-∘ʳ-tabulate-var-right ρ)) 98 | 99 | ʳ∘ˢ-lift-var-right : ∀ {γ δ θ} (ρ : γ →ʳ δ) {a} (x : a ∈ θ) → 100 | ((⇑ʳ {θ = θ} ρ) ʳ∘ˢ lift (tabulate var-right)) ∙ x ≡ lift (tabulate var-right) ∙ x 101 | ʳ∘ˢ-lift-var-right ρ x = 102 | trans 103 | (ʳ∘ˢ-∙ {ρ = ⇑ʳ ρ} {ts = lift (tabulate var-right)}) 104 | ([⇑ʳ]-lift-var-right ρ x) 105 | 106 | []ʳ-η ρ x = ≡-` (map-∙ {f = var-left} {ps = ρ}) (λ z → ʳ∘ˢ-lift-var-right ρ z) 107 | 108 | 109 | ʳ∘ˢ-lift : ∀ {γ δ θ} (ρ : γ →ʳ δ) (τ : δ →ʳ θ) {a} (x : a ∈ γ) → 110 | (τ ʳ∘ˢ lift ρ) ∙ x ≡ lift (τ ∘ʳ ρ) ∙ x 111 | ʳ∘ˢ-lift [ x ] τ var-here = ≡-` ( map-∙ {f = var-left} {ps = τ}) λ z → ʳ∘ˢ-lift-var-right τ z 112 | ʳ∘ˢ-lift (ρ₁ ⊕ ρ₂) τ (var-left x) = ʳ∘ˢ-lift ρ₁ τ x 113 | ʳ∘ˢ-lift (ρ₁ ⊕ ρ₂) τ (var-right x) = ʳ∘ˢ-lift ρ₂ τ x 114 | 115 | lift-map : ∀ {γ δ θ} (f : ∀ {α} → α ∈ γ → α ∈ δ) (ρ : θ →ʳ γ) → 116 | lift (map f ρ) ≡ map [ ⇑ʳ (tabulate f) ]ʳ_ (lift ρ) 117 | lift-map f 𝟘 = refl 118 | lift-map f [ x ] = cong [_] (trans (cong η (sym (tabulate-∙ f))) (sym ([]ʳ-η (tabulate f) x))) 119 | lift-map f (ρ₁ ⊕ ρ₂) = cong₂ _⊕_ (lift-map f ρ₁) (lift-map f ρ₂) 120 | 121 | ⇑ˢ-lift : ∀ {γ δ θ} (ρ : γ →ʳ δ) → ⇑ˢ {θ = θ} (lift ρ) ≡ lift (⇑ʳ ρ) 122 | ⇑ˢ-lift ρ = cong₂ _⊕_ (sym (lift-map var-left ρ)) refl 123 | 124 | shift : Shape → List Shape → Shape 125 | shift γ [] = γ 126 | shift γ (δ ∷ δs) = (shift γ δs) ⊕ δ 127 | 128 | ⟰ʳ : ∀ {γ δ Ξ} → (γ →ʳ δ) → (shift γ Ξ →ʳ shift δ Ξ) 129 | ⟰ʳ {Ξ = []} ρ = ρ 130 | ⟰ʳ {Ξ = _ ∷ _} ρ = ⇑ʳ (⟰ʳ ρ) 131 | 132 | ⟰ˢ : ∀ {γ δ Ξ} → (γ →ˢ δ) → (shift γ Ξ →ˢ shift δ Ξ) 133 | ⟰ˢ {Ξ = []} f = f 134 | ⟰ˢ {Ξ = _ ∷ _} f = ⇑ˢ (⟰ˢ f) 135 | 136 | data act-defined : ∀ {γ cl} → Expr γ cl → Set where 137 | act-sub : ∀ {γ δ} {cl} (x : (δ , cl) ∈ γ) → (ts : δ →ˢ γ) → 138 | (∀ {a} (z : a ∈ δ) → act-defined (ts ∙ z)) → act-defined (x ` ts) 139 | -- act-∙ : ∀ {γ δ} {cl} (f : γ →ˢ δ) (x : (δ , cl) ∈ γ) → (ts : δ →ˢ γ) → 140 | -- (act-defined (f ∙ x) 141 | 142 | 143 | module SubstitutionWithFucus where 144 | -- An attempt that explicitly deals with all the shifting and weakening 145 | 146 | infix 4 _⇒ˢ_ 147 | data _⇒ˢ_ : Shape → Shape → Set where 148 | sbs : ∀ {γ δ} (f : γ →ˢ δ) → γ ⇒ˢ δ 149 | 𝟙⊕ : ∀ {δ θ} (f : θ ⇒ˢ δ) → δ ⊕ θ ⇒ˢ δ 150 | rgh : ∀ {γ δ θ} (f : γ ⇒ˢ δ) → γ ⊕ θ ⇒ˢ δ ⊕ θ 151 | 𝟙, : ∀ {γ δ θ} (f : γ ⇒ˢ θ ⊕ δ) → θ ⊕ γ ⇒ˢ θ ⊕ δ 152 | 153 | infix 7 _∙∙_ 154 | _∙∙_ : ∀ {γ δ} (f : γ ⇒ˢ δ) {a} → a ∈ γ → Arg δ a 155 | sbs f ∙∙ x = f ∙ x 156 | 𝟙⊕ f ∙∙ var-left x = η x 157 | 𝟙⊕ f ∙∙ var-right y = f ∙∙ y 158 | rgh f ∙∙ var-left x = [ ⇑ʳ (tabulate var-left) ]ʳ (f ∙∙ x) 159 | rgh f ∙∙ var-right y = η (var-right y) 160 | 𝟙, f ∙∙ var-left x = η (var-left x) 161 | 𝟙, f ∙∙ var-right y = f ∙∙ y 162 | 163 | {-# TERMINATING #-} 164 | act : ∀ {γ δ cl} (f : γ ⇒ˢ δ) → Expr γ cl → Expr δ cl 165 | act (sbs f) (x ` ts) = act (𝟙⊕ (sbs (tabulate λ z → act (rgh (sbs f)) (ts ∙ z)))) (f ∙ x) 166 | act (𝟙⊕ f) (var-left x ` ts) = x ` (tabulate λ z → act (rgh (𝟙⊕ f)) (ts ∙ z)) 167 | act (𝟙⊕ f) (var-right y ` ts) = act (𝟙⊕ (sbs (tabulate λ z → act (rgh (𝟙⊕ f)) (ts ∙ z)))) (f ∙∙ y) 168 | act (rgh f) (var-left x ` ts) = act (𝟙, (sbs (tabulate (λ z → act (rgh (rgh f)) (ts ∙ z))))) (f ∙∙ x) 169 | act (rgh f) (var-right y ` ts) = var-right y ` tabulate λ z → act (rgh (rgh f)) (ts ∙ z) 170 | act (𝟙, f) (var-left x ` ts) = var-left x ` tabulate (λ z → act (rgh (𝟙, f)) (ts ∙ z)) 171 | act (𝟙, f) (var-right x ` ts) = act (𝟙⊕ (sbs (tabulate (λ z → act (rgh (𝟙, f)) (ts ∙ z))))) (f ∙∙ x) 172 | 173 | 174 | module IdealDefintion where 175 | -- The naive definition, which Agda does not see as terminating 176 | infix 6 [_]ˢ_ 177 | infix 6 _∘ˢ_ 178 | 179 | {-# TERMINATING #-} 180 | [_]ˢ_ : ∀ {γ δ cl} (f : γ →ˢ δ) → Expr γ cl → Expr δ cl 181 | 182 | {-# TERMINATING #-} 183 | _∘ˢ_ : ∀ {γ δ θ} (g : δ →ˢ θ) (f : γ →ˢ δ) → γ →ˢ θ 184 | 185 | [ f ]ˢ x ` ts = [ 𝟙ˢ ⊕ (f ∘ˢ ts) ]ˢ (f ∙ x) 186 | g ∘ˢ f = tabulate (λ x → [ ⇑ˢ g ]ˢ f ∙ x) 187 | 188 | [lift]ˢ : ∀ {γ δ cl} (ρ : γ →ʳ δ) (e : Expr γ cl) → [ lift ρ ]ˢ e ≡ [ ρ ]ʳ e 189 | [lift]ˢ ρ (x ` ts) = trans (cong [ 𝟙ˢ ⊕ lift ρ ∘ˢ ts ]ˢ_ (lift-∙ ρ x)) {!!} 190 | 191 | [𝟙]ˢ : ∀ {γ cl} {e : Expr γ cl} → [ 𝟙ˢ ]ˢ e ≡ e 192 | [𝟙]ˢ {e = x ` ts} = trans (cong [ 𝟙ˢ ⊕ (𝟙ˢ ∘ˢ ts) ]ˢ_ 𝟙ˢ-∙) {!!} 193 | 194 | 195 | 196 | 197 | module BoveCappreta where 198 | -- Instead we use the Bove-Cappreta method, whereby we define the support of [_]ˢ_ and _∘ˢ_, then we define the maps 199 | -- as partial maps defined on the support, and finally show that the supports are the entire domains. 200 | -- See doi:10.1017/S0960129505004822 201 | 202 | -- The action of a substitution defined at a given argument 203 | data defined : ∀ {γ δ cl} (f : γ →ˢ δ) (e : Expr γ cl) → Set 204 | 205 | -- The action of substitution 206 | act : ∀ {γ δ cl} (f : γ →ˢ δ) (e : Expr γ cl) → defined f e → Expr δ cl 207 | 208 | -- The action is defined when the recursive calls are defined 209 | data defined where 210 | df : ∀ {γ δ} {f : γ →ˢ δ} {γˣ clˣ} {x : (γˣ , clˣ) ∈ γ} {ts : γˣ →ˢ γ} 211 | (D : ∀ {a} (z : a ∈ γˣ) → defined (⇑ˢ f) (ts ∙ z)) → 212 | (E : defined (𝟙ˢ ⊕ tabulate (λ z → act (⇑ˢ f) (ts ∙ z) (D z))) (f ∙ x)) → 213 | defined f (x ` ts) 214 | 215 | act f (x ` ts) (df D E) = act (𝟙ˢ ⊕ tabulate (λ z → act (⇑ˢ f) (ts ∙ z) (D z))) (f ∙ x) E 216 | 217 | -- we'll do this later 218 | postulate total-D : ∀ {γ δ} {f : γ →ˢ δ} {γˣ clˣ} (x : (γˣ , clˣ) ∈ γ) (ts : γˣ →ˢ γ) → 219 | ∀ {a} (z : a ∈ γˣ) → defined (⇑ˢ f) (ts ∙ z) 220 | 221 | postulate total-E : ∀ {γ δ} {f : γ →ˢ δ} {γˣ clˣ} (x : (γˣ , clˣ) ∈ γ) (ts : γˣ →ˢ γ) → 222 | defined (𝟙ˢ ⊕ tabulate (λ {a} (z : a ∈ γˣ) → act (⇑ˢ f) (ts ∙ z) 223 | (total-D x ts z))) (f ∙ x) 224 | 225 | total-act : ∀ {γ δ cl} (f : γ →ˢ δ) (e : Expr γ cl) → defined f e 226 | total-act f (x ` ts) = df (total-D x ts) (total-E x ts) 227 | 228 | infix 6 [_]ˢ_ 229 | [_]ˢ_ : ∀ {γ δ cl} (f : γ →ˢ δ) → Expr γ cl → Expr δ cl 230 | [ f ]ˢ e = act f e (total-act f e) 231 | 232 | [𝟙]ˢ : ∀ {γ cl} {e : Expr γ cl} → [ 𝟙ˢ ]ˢ e ≡ e 233 | [𝟙]ˢ {e = x ` ts} = {!!} 234 | 235 | [lift]ˢ : ∀ {γ δ cl} (ρ : γ →ʳ δ) (e : Expr γ cl) → [ lift ρ ]ˢ e ≡ [ ρ ]ʳ e 236 | [lift]ˢ ρ (x ` ts) = {! !} 237 | 238 | 239 | module AsGraph where 240 | -- action of substitution as a graph 241 | infix 4 [_]ˢ_:=_ 242 | data [_]ˢ_:=_ : ∀ {γ δ cl} → (γ →ˢ δ) → Expr γ cl → Expr δ cl → Set where 243 | sbs : ∀ {γ δ} {f : γ →ˢ δ} {γˣ clˣ} {x : (γˣ , clˣ) ∈ γ} {ts : γˣ →ˢ γ} (d : γˣ →ˢ δ) {e} → 244 | (∀ {a} (z : a ∈ γˣ) → [ ⇑ˢ f ]ˢ ts ∙ z := d ∙ z) → 245 | [ 𝟙ˢ ⊕ d ]ˢ f ∙ x := e → 246 | [ f ]ˢ (x ` ts) := e 247 | 248 | act-⊕-left : ∀ {γ δ θ} {f : γ →ˢ θ} {g : δ →ˢ θ} {γˣ clˣ} {x : (γˣ , clˣ) ∈ γ} {ts : γˣ →ˢ γ ⊕ δ} (d : γˣ →ˢ θ) e → 249 | (∀ {a} (z : a ∈ γˣ) → [ ⇑ˢ (f ⊕ g) ]ˢ ts ∙ z := d ∙ z) → 250 | [ 𝟙ˢ ⊕ d ]ˢ (f ∙ x) := e → 251 | [ f ⊕ g ]ˢ var-left x ` ts := e 252 | act-⊕-left d e r₁ r₂ = sbs d r₁ r₂ 253 | 254 | act-⇑ˢ : ∀ {γ δ θ} {f : γ →ˢ δ} {γˣ clˣ} {ts : γˣ →ˢ γ} {x : (γˣ , clˣ) ∈ γ} {ts : γˣ →ˢ γ ⊕ θ} (d : γˣ →ˢ δ ⊕ θ) e → 255 | (∀ {a} (z : a ∈ γˣ) → [ ⇑ˢ (⇑ˢ f) ]ˢ ts ∙ z := d ∙ z) → 256 | [ 𝟙ˢ ⊕ d ]ˢ [ ⇑ʳ (tabulate var-left) ]ʳ f ∙ x := e → 257 | [ ⇑ˢ f ]ˢ var-left x ` ts := e 258 | act-⇑ˢ {γ = γ} {θ = θ} {f = f} {x = x} d e r₁ r₂ = 259 | sbs d r₁ (subst (λ u → [ 𝟙ˢ ⊕ d ]ˢ u := e) (sym (map-∙ {ps = f} {x = x})) r₂) 260 | 261 | act-η : ∀ {γ δ} (f : γ →ˢ δ) {a} (x : a ∈ γ) → [ ⇑ˢ f ]ˢ η x := f ∙ x 262 | act-η f x = {!!} 263 | 264 | act-lift : ∀ {γ δ cl} (ρ : γ →ʳ δ) (e : Expr γ cl) → 265 | [ lift ρ ]ˢ e := [ ρ ]ʳ e 266 | act-lift ρ (x ` ts) = sbs (ρ ʳ∘ˢ ts) (λ z → {!!}) {!lift-∙!} 267 | 268 | infix 6 [_]ˢ_ 269 | [_]ˢ_ : ∀ {γ δ cl} (f : γ →ˢ δ) → Expr γ cl → Expr δ cl 270 | [ f ]ˢ e = {!!} 271 | 272 | []ˢ-total : ∀ {γ δ cl} (f : γ →ˢ δ) (e : Expr γ cl) → [ f ]ˢ e := [ f ]ˢ e 273 | []ˢ-total f e = {!!} 274 | -------------------------------------------------------------------------------- /src/FixPointRel.agda: -------------------------------------------------------------------------------- 1 | open import Agda.Primitive 2 | open import Relation.Unary 3 | open import Relation.Binary 4 | open import Relation.Binary.PropositionalEquality 5 | open import Induction.WellFounded 6 | 7 | -- This is the same as Induction.WellFounded.Fixpoint, but works for any 8 | -- relation that is preserved by the recursor, instead of just ≡ 9 | 10 | module FixPointRel 11 | {a r e} {A : Set a} 12 | {_<_ : Rel A r} (wf : WellFounded _<_) ℓ 13 | (P : Pred A ℓ) (f : WfRec _<_ P ⊆′ P) 14 | (_≈_ : ∀ {x : A} → Rel (P x) e) 15 | (f-ext : (x : A) {IH IH′ : WfRec _<_ P x} → (∀ {y} y