module Chapter2.IDesc.Examples.Fin where

open import Data.Unit
open import Data.Nat
open import Data.Fin renaming (Fin to FinNative)
open import Data.Vec 
open import Data.Product

open import Relation.Binary.PropositionalEquality

open import Chapter2.IDesc
open import Chapter2.IDesc.Fixpoint
open import Chapter2.IDesc.Tagged

module Compute where

  FinD : tagDesc 
  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 =  zero , tt 

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

module Constraint where

  FinD : tagDesc 
  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 =  zero , _ , refl , tt 

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