{-# OPTIONS --type-in-type #-} module Chapter3.IDesc where open import Data.Unit open import Data.Nat open import Data.Fin open import Data.Vec open import Data.Product open import Chapter2.IDesc open import Chapter2.IDesc.Tagged open import Chapter2.IDesc.Fixpoint data IDescC : Set where `var` `1` `×` `σ` `Σ` `Π` : IDescC IDescD : Set → func ⊤ ⊤ IDescD I = func.mk λ _ → `Σ IDescC λ { `var` → `Σ I λ _ → `1 ; `1` → `1 ; `×` → `var tt `× `var tt `× `1 ; `σ` → `Σ ℕ λ n → (`Π (Fin n) λ _ → `var tt) `× `1 ; `Σ` → `Σ Set λ S → (`Π S λ _ → `var tt) `× `1 ; `Π` → `Σ Set λ S → (`Π S λ _ → `var tt) `× `1 } IDesc' : Set → Set₁ IDesc' I = μ (IDescD I) tt `var' : ∀{I} → I → IDesc' I `var' i = ⟨ `var` , i , tt ⟩ `1' : ∀{I} → IDesc' I `1' = ⟨ `1` , tt ⟩ _`×'_ : ∀{I} (A B : IDesc' I) → IDesc' I A `×' B = ⟨ `×` , A , B , tt ⟩ `σ' : ∀{I} (n : ℕ)(T : Fin n → IDesc' I) → IDesc' I `σ' n T = ⟨ `σ` , n , T , tt ⟩ `Σ' : ∀{I} (S : Set)(T : S → IDesc' I) → IDesc' I `Σ' S T = ⟨ `Σ` , S , T , tt ⟩ `Π' : ∀{I} (S : Set)(T : S → IDesc' I) → IDesc' I `Π' S T = ⟨ `Π` , S , T , tt ⟩