module Chapter6.IDesc.Examples.Fin where

open import Level 
  renaming ( zero to zeroL
           ; suc to sucL )
open import Data.Unit
open import Data.Nat
open import Data.Fin hiding (lift) renaming (Fin to FinNative)
open import Data.Vec 
open import Data.Product

open import Relation.Binary.PropositionalEquality

open import Chapter6.IDesc
open import Chapter6.IDesc.Fixpoint
open import Chapter6.IDesc.Tagged

module Compute where

  FinD : tagDesc zeroL 
  FinD = (0 , λ n  []) , 
         ((λ { zero  0 
             ; (suc n)  2 }) , 
         λ { zero  [] 
           ; (suc n)  `1  
                       `var n  `1  []})

  Fin :   Set
  Fin = μ (toDesc FinD)

  ze : ∀{n}  Fin (suc n)
  ze =  lift zero , lift tt 

  su : ∀{n}  Fin n  Fin (suc n)
  su k =  lift (suc zero) , k , lift tt  

module Constraint where

  FinD : tagDesc zeroL 
  FinD = (2 , λ n  (  λ m  
                      (n  suc m) λ _  `1)   
                    (  λ m 
                       (n  suc m) λ _  `var m  `1)  []) ,
          n  0) , λ n  []

  Fin :   Set
  Fin = μ (toDesc FinD)

  ze : ∀{n}  Fin (suc n)
  ze =  lift zero , _ , refl , lift tt 

  su : ∀{n}  Fin n  Fin (suc n)
  su k =  lift (suc zero) , _ , refl , k , lift tt