module BoundSig where
open import Function
open import Data.Empty
open import Data.Unit
open import Data.Bool
open import Data.Fin hiding (_+_)
open import Data.Nat
open import Data.Sum
open import Data.Product
open import Relation.Unary
open import Relation.Binary.PropositionalEquality
record World (Ctxts : Set)(Types : Set) : Set₁ where
field
_⇒_ : (Γ Δ : Ctxts) → Set
_⊗_ : (Γ Δ : Ctxts) → Ctxts
inl : ∀{Γ Δ} → Γ ⇒ (Γ ⊗ Δ)
inr : ∀{Γ Δ} → Δ ⇒ (Γ ⊗ Δ)
⟦_⟧ : Ctxts → (Types → Set)
⟦_⟧map : ∀{Γ Δ} → Γ ⇒ Δ → ⟦ Γ ⟧ ⊆ ⟦ Δ ⟧
strict-⟦⟧ : ∀{Γ Δ} → ⟦ Γ ⊗ Δ ⟧ ⊆ ⟦ Γ ⟧ ∪ ⟦ Δ ⟧
module MapW {Ctxts : Set}{Types : Set}(w : World Ctxts Types) where
open World w
inl-⟦⟧ : ∀ {Γ} Δ → ⟦ Γ ⟧ ⊆ ⟦ Γ ⊗ Δ ⟧
inl-⟦⟧ Δ = ⟦ inl ⟧map
inr-⟦⟧ : ∀ {Δ} Γ → ⟦ Δ ⟧ ⊆ ⟦ Γ ⊗ Δ ⟧
inr-⟦⟧ Δ = ⟦ inr ⟧map
mapL : ∀{Γ Δ Ω : Ctxts} →
(⟦ Γ ⟧ ⊆ ⟦ Δ ⟧) → ⟦ Γ ⊗ Ω ⟧ ⊆ ⟦ Δ ⊗ Ω ⟧
mapL ρ k = [ inl-⟦⟧ _ ∘ ρ , inr-⟦⟧ _ ]′ (strict-⟦⟧ k)
record Presentation (Ctxts : Set)(Types : Set) : Set₁ where
field
Op : Types → Set
Ar : ∀{T} → Op T → Set
Bi : ∀ {T sh} → Ar {T} sh → Ctxts
Ty : ∀ {T sh} → Ar {T} sh → Types
module Terms {Ctxts Types}(w : World Ctxts Types)
(Σ : Presentation Ctxts Types) where
open World w
open Presentation Σ
mutual
data Tm (Γ : Ctxts) : Types → Set where
`var : ∀{T} → ⟦ Γ ⟧ T → Tm Γ T
`op : ∀{T} → (sh : Op T)
(Xs : (pos : Ar sh) → Scope[ Bi pos ] Γ (Ty pos)) → Tm Γ T
data Scope[_] (Ω Γ : Ctxts)(T : Types) : Set where
sc : Tm (Γ ⊗ Ω) T → Scope[ Ω ] Γ T
module Subst {Ctxts Types}(w : World Ctxts Types)
(Σ : Presentation Ctxts Types) where
open World w
open MapW w
open Presentation Σ
open Terms w Σ
mutual
mapSc : ∀{Ω Γ Δ} →
(⟦ Γ ⟧ ⊆ ⟦ Δ ⟧) → Scope[ Ω ] Γ ⊆ Scope[ Ω ] Δ
mapSc {Ω} ρ (sc tm) = sc (mapTm (mapL {Ω = Ω} ρ) tm)
mapTm : ∀{Γ Δ} →
(⟦ Γ ⟧ ⊆ ⟦ Δ ⟧) → Tm Γ ⊆ Tm Δ
mapTm ρ (`var x) = `var (ρ x)
mapTm ρ (`op sh Xs) = `op sh λ pos → mapSc {Bi pos} ρ (Xs pos)
str : {Γ Δ : Ctxts} → Tm Γ ∪ ⟦ Δ ⟧ ⊆ Tm (Γ ⊗ Δ)
str {Δ = Δ} (inj₁ tm) = mapTm (inl-⟦⟧ Δ) tm
str (inj₂ k) = `var (inr-⟦⟧ _ k)
return : ∀{Γ} → ⟦ Γ ⟧ ⊆ Tm Γ
return = `var
mutual
sub : ∀{Γ Δ} → (⟦ Γ ⟧ ⊆ Tm Δ) → Tm Γ ⊆ Tm Δ
sub ρ (`var x) = ρ x
sub ρ (`op sh Xs) = `op sh (λ pos → scopeSub {Bi pos} ρ (Xs pos))
scopeSub : ∀{Ω Γ Δ} → (⟦ Γ ⟧ ⊆ Tm Δ) → Scope[ Ω ] Γ ⊆ Scope[ Ω ] Δ
scopeSub {Ω} ρ (sc tm) = sc (sub (λ v → str (Data.Sum.map ρ id (strict-⟦⟧ v))) tm)
module LC where
monFin : ∀{n m} → Fin (n + m) → Fin m ⊎ Fin n
monFin {zero} xs = inj₁ xs
monFin {suc m} zero = inj₂ zero
monFin {suc m} (suc xs) with monFin {m} xs
monFin {suc m} (suc xs) | inj₁ x = inj₁ x
monFin {suc m} (suc xs) | inj₂ y = inj₂ (suc y)
monFin⁻¹ : ∀{n m} → Fin m ⊎ Fin n → Fin (n + m)
monFin⁻¹ {n}{m} k = [ raise n , inject+ m ]′ k
ℕW : World ℕ ⊤
ℕW = record
{ _⇒_ = λ m n → Fin m → Fin n
; _⊗_ = λ m n → n + m
; inl = λ {Γ}{Δ} → raise Δ
; inr = λ {Γ}{Δ} → inject+ Γ
; ⟦_⟧ = λ n tt → Fin n
; ⟦_⟧map = λ ρ → ρ
; strict-⟦⟧ = monFin
}
Σλam : Presentation ℕ ⊤
Σλam = record { Op = λ tt → Bool
; Ar = λ { true → ⊤
; false → Bool }
; Bi = λ { {_} {true} tt → 1
; {_} {false} b → 0 }
; Ty = λ { {_} {true} tt → tt
; {_} {false} a → tt } }
open Terms ℕW Σλam
λam : ℕ → Set
λam n = Tm n tt
var : ∀{n} → Fin n → λam n
var = `var
app : ∀{n} → λam n → λam n → λam n
app f s = `op false (λ { true → sc f
; false → sc s })
abs : ∀{n} → λam (suc n) → λam n
abs b = `op true (λ { tt → sc b })
open Subst ℕW Σλam
subst⊢ : ∀{m n} → λam m → (Fin m → λam n) → λam n
subst⊢ tm ρ = sub ρ tm
tm1 : λam 0
tm1 = abs (var zero)
tm2 : λam 1
tm2 = abs (app (var (suc zero)) (var zero))
tm3 : λam 0
tm3 = subst⊢ tm2 ρ
where ρ : Fin 1 → λam 0
ρ zero = tm1
ρ (suc ())
module STLC where
data Typ : Set where
`■ : Typ
_`⇒_ : (A B : Typ) → Typ
data Ctxt : Set where
ε : Ctxt
_▹_ : Ctxt → Typ → Ctxt
data _`∈_ (T : Typ) : (Γ : Ctxt) → Set where
ze : ∀{Γ} → T `∈ (Γ ▹ T)
suc : ∀{Γ T'} → T `∈ Γ → T `∈ (Γ ▹ T')
_∷_ : Ctxt → Ctxt → Ctxt
Γ ∷ ε = Γ
Γ ∷ (Ω ▹ S) = (Γ ∷ Ω) ▹ S
monW : ∀{Ω Γ T} → T `∈ (Γ ∷ Ω) → T `∈ Γ ⊎ T `∈ Ω
monW {ε} k = inj₁ k
monW {Ω ▹ T} ze = inj₂ ze
monW {Ω ▹ x} (suc k) with monW {Ω} k
monW {Ω ▹ x₁} (suc k) | inj₁ x = inj₁ x
monW {Ω ▹ x} (suc k) | inj₂ y = inj₂ (suc y)
raiseW : ∀ {Γ} Δ → ∀{T} → T `∈ Γ → T `∈ (Γ ∷ Δ)
raiseW ε k = k
raiseW (Δ ▹ x) k = suc (raiseW Δ k)
injectW : ∀ {Γ} Δ → ∀{T} → T `∈ Γ → T `∈ (Δ ∷ Γ)
injectW Δ ze = ze
injectW Δ (suc k) = suc (injectW Δ k)
monW⁻¹ : ∀{Ω Γ T} → T `∈ Γ ⊎ T `∈ Ω → T `∈ (Γ ∷ Ω)
monW⁻¹ {Ω}{Γ} = [ raiseW Ω , injectW Γ ]′
CtxtW : World Ctxt Typ
CtxtW = record
{ _⇒_ = λ Γ Δ → ∀ {T} → T `∈ Γ → T `∈ Δ
; _⊗_ = _∷_
; inl = λ {Γ}{Δ} → raiseW {Γ} Δ
; inr = λ {Γ}{Δ} → injectW {Δ} Γ
; ⟦_⟧ = λ Γ T → T `∈ Γ
; ⟦_⟧map = λ ρ → ρ
; strict-⟦⟧ = monW
}
Σλam : Presentation Ctxt Typ
Σλam = record { Op = λ T → Typ ⊎ (Σ[ A ∈ Typ ] Σ[ B ∈ Typ ] T ≡ A `⇒ B)
; Ar = λ { (inj₁ S) → Bool
; (inj₂ (A , B , q)) → ⊤ }
; Bi = λ {T} → λ { {sh = inj₁ S} x → ε
; {sh = inj₂ (A , B , q)} tt → ε ▹ A }
; Ty = λ {T} → λ { {sh = inj₁ S} true → S `⇒ T
; {sh = inj₁ S} false → S
; {sh = inj₂ (A , B , q)} tt → B } }
open Terms CtxtW Σλam
_⊢_ : (Γ : Ctxt) → Typ → Set
Γ ⊢ T = Tm Γ T
var : ∀{Γ T} → T `∈ Γ → Γ ⊢ T
var k = `var k
app : ∀{Γ S T} → Γ ⊢ (S `⇒ T) → Γ ⊢ S → Γ ⊢ T
app {S = S} f s = `op (inj₁ S) (λ { true → sc f
; false → sc s })
abs : ∀{Γ S T} → (Γ ▹ S) ⊢ T → Γ ⊢ (S `⇒ T)
abs {S = S}{T = T} b = `op (inj₂ (S , T , refl))
(λ { tt → sc b })
open Subst CtxtW Σλam
subst⊢ : ∀{Γ Δ T} → Γ ⊢ T → (∀{T} → T `∈ Γ → Δ ⊢ T) → Δ ⊢ T
subst⊢ tm ρ = sub ρ tm
tm1 : ε ⊢ (`■ `⇒ `■)
tm1 = abs (var ze)
tm2 : (ε ▹ (`■ `⇒ `■)) ⊢ (`■ `⇒ `■)
tm2 = abs (app (var (suc ze)) (var ze))
tm3 : ε ⊢ (`■ `⇒ `■)
tm3 = subst⊢ tm2 ρ
where ρ : ∀{T} → T `∈ (ε ▹ (`■ `⇒ `■)) → ε ⊢ T
ρ ze = tm1
ρ (suc ())