{-# OPTIONS --without-K --safe #-}
module N-ary where
open import Level using (Level; 0ℓ; _⊔_)
open import StateOfTheArt as Unary
hiding ( ∃⟨_⟩; ∀[_]; Π[_]; _⇒_; _∩_; _∪_; ¬_
; _≡_; refl
; map
; cong
; cong₂
; subst
)
open Listy
open import Data.Nat.Base using (ℕ; zero; suc)
open import Relation.Binary.PropositionalEquality
open import Function using (_∘_; id; flip; _$_)
private
variable
a b c r i j s : Level
A : Set a
B : Set b
C : Set c
I : Set i
J : Set j
R : Set r
Levels : ℕ → Set
Levels zero = ⊤
Levels (suc n) = Level × Levels n
private
variable
n : ℕ
ls : Levels n
⨆ : ∀ n → Levels n → Level
⨆ zero _ = 0ℓ
⨆ (suc n) (l , ls) = l ⊔ (⨆ n ls)
Sets : ∀ n (ls : Levels n) → Set (Level.suc (⨆ n ls))
Sets zero _ = Lift _ ⊤
Sets (suc n) (l , ls) = Set l × Sets n ls
_<$>_ : (∀ {l} → Set l → Set l) →
∀ {n ls} → Sets n ls → Sets n ls
_<$>_ f {zero} as = _
_<$>_ f {suc n} (a , as) = f a , f <$> as
private
variable
as : Sets n ls
Product : ∀ n {ls} → Sets n ls → Set (⨆ n ls)
Product zero _ = ⊤
Product (suc n) (a , as) = a × Product n as
Arrows : ∀ n {ls} → Sets n ls → Set r → Set (r ⊔ (⨆ n ls))
Arrows zero _ b = b
Arrows (suc n) (a , as) b = a → Arrows n as b
curryₙ : ∀ n {ls} {as : Sets n ls} →
(Product n as → R) → Arrows n as R
curryₙ zero f = f _
curryₙ (suc n) f = curryₙ n ∘ curry f
uncurryₙ : ∀ n {ls} {as : Sets n ls} →
Arrows n as R → (Product n as → R)
uncurryₙ zero f = const f
uncurryₙ (suc n) f = uncurry (uncurryₙ n ∘ f)
Equalₙ : ∀ n {ls} {as : Sets n ls} →
(vs ws : Product n as) → Sets n ls
Equalₙ zero vs ws = _
Equalₙ (suc n) (v , vs) (w , ws) = (v ≡ w) , Equalₙ n vs ws
fromEqualₙ : ∀ n {ls} {as : Sets n ls} {vs ws : Product n as} →
Product n (Equalₙ n vs ws) → vs ≡ ws
fromEqualₙ zero _ = refl
fromEqualₙ (suc n) (eq , eqs) = cong₂ _,_ eq (fromEqualₙ n eqs)
_%=_⊢_ : ∀ n {ls} {as : Sets n ls} → (I → J) →
Arrows n as (J → B) → Arrows n as (I → B)
zero %= f ⊢ g = g ∘ f
suc n %= f ⊢ g = (n %= f ⊢_) ∘ g
open import Function using (_∘_)
mapₙ : ∀ n {ls} {as : Sets n ls} →
(B → C) → Arrows n as B → Arrows n as C
mapₙ zero f v = f v
mapₙ (suc n) f g = mapₙ n f ∘ g
focusₙ : ∀ n {ls} {as : Sets n ls} →
Arrows n as (A → B) → (A → Arrows n as B)
focusₙ n f a = mapₙ n (_$ a) f
module _ m n {ls ls'} {as : Sets m ls} {bs : Sets n ls'}
(f : Arrows m as (A → Arrows n bs B)) where
private
f' : Product m as → A → Product n bs → B
f' vs a ws = uncurryₙ n (uncurryₙ m f vs a) ws
congAt : ∀ {vs ws a₁ a₂} → a₁ ≡ a₂ → f' vs a₁ ws ≡ f' vs a₂ ws
congAt {vs} {ws} = cong (λ a → f' vs a ws)
holeₙ : ∀ n {ls} {as : Sets n ls} →
(A → Arrows n as B) → Arrows n as (A → B)
holeₙ zero f = f
holeₙ (suc n) f = holeₙ n ∘ flip f
constₙ : ∀ n {ls} {as : Sets n ls} → B → Arrows n as B
constₙ zero = id
constₙ (suc n) = const ∘ (constₙ n)
infix 5 ∃⟨_⟩ ∀[_] Π[_]
quantₙ : (∀ {i l} {I : Set i} → (I → Set l) → Set (i ⊔ l)) →
∀ n {ls} {as : Sets n ls} →
Arrows n as (Set r) → Set (r ⊔ (⨆ n ls))
quantₙ Q zero f = f
quantₙ Q (suc n) f = Q (λ x → quantₙ Q n (f x))
∃⟨_⟩ : Arrows n {ls} as (Set r) → Set (r ⊔ (⨆ n ls))
∃⟨_⟩ = quantₙ Unary.∃⟨_⟩ _
∀[_] : Arrows n {ls} as (Set r) → Set (r ⊔ (⨆ n ls))
∀[_] = quantₙ Unary.∀[_] _
Π[_] : Arrows n {ls} as (Set r) → Set (r ⊔ (⨆ n ls))
Π[_] = quantₙ Unary.Π[_] _
lift₂ : ∀ n {ls} {as : Sets n ls} → (A → B → C) →
Arrows n as A → Arrows n as B → Arrows n as C
lift₂ zero op f g = op f g
lift₂ (suc n) op f g = λ x → lift₂ n op (f x) (g x)
lmap : (Level → Level) → ∀ n → Levels n → Levels n
lmap f zero ls = _
lmap f (suc n) (l , ls) = f l , lmap f n ls
smap : ∀ f → (∀ {l} → Set l → Set (f l)) →
∀ n {ls} → Sets n ls → Sets n (lmap f n ls)
smap f F zero as = _
smap f F (suc n) (a , as) = F a , smap f F n as
palg : ∀ f (F : ∀ {l} → Set l → Set (f l)) n {ls} {as : Sets n ls} →
(∀ {l} {r : Set l} → F r → r) → Product n (smap f F n as) → Product n as
palg f F zero alg ps = _
palg f F (suc n) alg (p , ps) = alg p , palg f F n alg ps
liftₙ : ∀ k n {ls rs} {as : Sets n ls} {bs : Sets k rs} {r} {b : Set r} →
Arrows k bs b → Arrows k (smap _ (Arrows n as) k bs) (Arrows n as b)
liftₙ k n op = curryₙ k λ fs →
curryₙ n λ vs →
uncurryₙ k op $
palg _ _ k (λ f → uncurryₙ n f vs) fs
infixr 6 _⇒_
_⇒_ : Arrows n {ls} as (Set r) → Arrows n as (Set s) →
Arrows n as (Set (r ⊔ s))
_⇒_ = lift₂ _ (λ A B → (A → B))
infixr 7 _∩_
_∩_ : Arrows n {ls} as (Set r) → Arrows n as (Set s) →
Arrows n as (Set (r ⊔ s))
_∩_ = lift₂ _ (λ A B → (A × B))
infixr 8 _∪_
_∪_ : Arrows n {ls} as (Set r) → Arrows n as (Set s) →
Arrows n as (Set (r ⊔ s))
_∪_ = lift₂ _ (λ A B → (A ⊎ B))
infix 9 ¬_
¬_ : Arrows n {ls} as (Set r) → Arrows n as (Set r)
¬_ = liftₙ 1 _ (λ A → (A → ⊥))