module Chapter5.Ornament.Examples.Fin where open import Function open import Data.Empty open import Data.Unit open import Data.Nat open import Data.Fin open import Data.Product open import Relation.Binary.PropositionalEquality open import Chapter1.Logic open import Chapter2.IDesc open import Chapter2.IDesc.Fixpoint open import Chapter2.IDesc.Examples.Nat open import Chapter5.Ornament u : ℕ → ⊤ u _ = tt module Constraint where FinO : orn NatD u u FinO = orn.mk λ n → `σ (λ { zero → insert ℕ λ m → insert (suc m ≡ n) λ _ → `1 ; (suc zero) → insert ℕ λ m → insert (suc m ≡ n) λ _ → `var (inv m) `× `1 ; (suc (suc ())) }) Fin' : ℕ → Set Fin' = μ ⟦ FinO ⟧orn fz : ∀{n} → Fin' (suc n) fz {n} = ⟨ zero , n , refl , tt ⟩ fs : ∀{n} → Fin' n → Fin' (suc n) fs {n} k = ⟨ suc zero , n , refl , k , tt ⟩ module Compute where FinO : orn NatD u u FinO = orn.mk λ { zero → insert ⊥ ⊥-elim ; (suc n) → `σ λ { zero → `1 ; (suc zero) → `var (inv n) `× `1 ; (suc (suc ())) } } Fin' : ℕ → Set Fin' = μ ⟦ FinO ⟧orn fz : ∀{n} → Fin' (suc n) fz {n} = ⟨ zero , tt ⟩ fs : ∀{n} → Fin' n → Fin' (suc n) fs {n} k = ⟨ suc zero , k , tt ⟩