module Chapter6.EnumU.Pi where open import Level renaming ( zero to zeroL ; suc to sucL ) open import Function open import Data.Unit open import Data.Product open import Data.Nat open import Data.Fin hiding (lift) open import Chapter2.Logic open import Chapter4.Desc open import Chapter4.Desc.Fixpoint open import Chapter4.Desc.Lifting open import Chapter4.Desc.Induction open import Chapter6.EnumU private record ⟨π_$_⟩ (E : EnumU {sucL zeroL})(P : EnumT E → Set) : Set₁ where constructor return field call : Set open ⟨π_$_⟩ public πh : (E : EnumU)(P : EnumT E → Set) → ⟨π E $ P ⟩ πh = induction EnumUD (λ E → (P : EnumT E → Set) → ⟨π E $ P ⟩) (λ {xs} → α {xs}) where α : {E : ⟦ EnumUD ⟧ EnumU} → [_]^ {k = zeroL} (EnumUD {sucL zeroL}) (λ E → (P : EnumT E → Set) → ⟨π E $ P ⟩) E → (P : EnumT ⟨ E ⟩ → Set) → ⟨π ⟨ E ⟩ $ P ⟩ α {lift zero , lift tt} (lift tt) = λ P → return ⊤ α {lift (suc zero) , (a , e , lift tt)} (ih , lift tt) = λ P → return (P ze × call (ih (P ∘ su))) α {lift (suc (suc ())) , _} _ π : (E : EnumU)(P : EnumT E → Set) → Set π E P = call (πh E P)