module Chapter5.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 Chapter5.IDesc
open import Chapter5.IDesc.Fixpoint
open import Chapter5.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