{-# OPTIONS --safe --sized-types #-}
module Data.Pred where
open import Data.Var hiding (_<$>_)
open import Data.Environment
open import Agda.Builtin.List
open import Function
open import Relation.Unary using (IUniversal; _⇒_)
private
variable
I : Set
σ : I
Γ Δ Θ : List I
T : I ─Scoped
record Pred (T : I ─Scoped) : Set₁ where
constructor mkPred
field pred : ∀ σ → ∀[ T σ ⇒ const Set ]
open Pred public
record All (𝓟 : Pred T) (Γ : List I) (ρ : (Γ ─Env) T Δ) : Set where
constructor packᴾ
field lookupᴾ : (k : Var σ Γ) → pred 𝓟 σ (lookup ρ k)
open All public
private
variable
𝓟 : Pred T
_<$>ᴾ_ : {f : {i : I} → T i Δ → T i Θ} →
(∀ {i} {t : T i Δ} → pred 𝓟 i t → pred 𝓟 i (f t)) →
{ρ : (Γ ─Env) T Δ} → All 𝓟 Γ ρ → All 𝓟 Γ (f <$> ρ)
lookupᴾ (F <$>ᴾ ρ) k = F (lookupᴾ ρ k)
εᴾ : All 𝓟 [] (([] ─Env) T Δ ∋ ε)
lookupᴾ εᴾ ()
infixl 20 _∙ᴾ_
_∙ᴾ_ : ∀ {ρ : (Γ ─Env) T Δ} {v : T σ Δ} → All 𝓟 Γ ρ → pred 𝓟 σ v → All 𝓟 (σ ∷ Γ) (ρ ∙ v)
lookupᴾ (ρ ∙ᴾ v) z = v
lookupᴾ (ρ ∙ᴾ v) (s k) = lookupᴾ ρ k