module A201602.DepCx (Hyp : Set) (⟦_⟧H : Hyp → Set) where open import Data.Fin using (Fin ; zero ; suc) open import Data.Nat using (ℕ ; zero ; suc) open import Data.Product using (Σ ; _,_ ; proj₁ ; proj₂) open import Data.Unit renaming (⊤ to Unit) open import Function using () renaming (_∘_ to _○_) mutual infixr 4 _,_ data DepCx : Set where ∅ : DepCx _,_ : (Γ : DepCx) → (F : ⟦ Γ ⟧C → Hyp) → DepCx ⟦_⟧C : DepCx → Set ⟦ ∅ ⟧C = Unit ⟦ Γ , F ⟧C = Σ ⟦ Γ ⟧C (λ γ → ⟦ F γ ⟧H) len : DepCx → ℕ len ∅ = zero len (Γ , F) = suc (len Γ) data _∋_ : (Γ : DepCx) (F : ⟦ Γ ⟧C → Hyp) → Set where here : ∀{Γ F} → (Γ , F) ∋ (F ○ proj₁) pop : ∀{Γ F E} → Γ ∋ F → (Γ , E) ∋ (F ○ proj₁) ⟦_⟧∋ : ∀{Γ F} → Γ ∋ F → (γ : ⟦ Γ ⟧C) → ⟦ F γ ⟧H ⟦ here ⟧∋ (γ , a) = a ⟦ pop i ⟧∋ (γ , b) = ⟦ i ⟧∋ γ ix : ∀{Γ F} → Γ ∋ F → Fin (len Γ) ix here = zero ix (pop i) = suc (ix i) 𝟎 : ∀{Γ F} → (Γ , F) ∋ (F ○ proj₁) 𝟎 = here 𝟏 : ∀{Γ F G} → ((Γ , F) , G) ∋ (F ○ proj₁ ○ proj₁) 𝟏 = pop 𝟎 𝟐 : ∀{Γ F G H} → (((Γ , F) , G) , H) ∋ (F ○ proj₁ ○ proj₁ ○ proj₁) 𝟐 = pop 𝟏 𝟑 : ∀{Γ F G H I} → ((((Γ , F) , G) , H) , I) ∋ (F ○ proj₁ ○ proj₁ ○ proj₁ ○ proj₁) 𝟑 = pop 𝟐