packages feed

MiniAgda-0.2014.1.9: test/fail/bfTypeNotAdmissible.ma

data Prod (+A : Set) (+B : Set) : Set
{
  pair : A -> B -> Prod A B
}

fun split : (A : Set) -> (B : Set) -> Prod A B ->  
            (C : Set) -> (A -> B -> C) -> C  
{
  split A B (pair a b) C f = f a b
}

sized data List (+ A : Set) : Size -> Set 
{
  nil  : (i : Size) -> List A ($ i) ;
  cons : (i : Size) -> A -> List A i -> List A ($ i)
}

fun append : (A : Set) -> List A # -> List A # -> List A #
{
  append A (nil .#) l = l;
  append A (cons .# a as) l = cons # a (append A as l)
}

sized data Rose (+A : Set) : Size -> Set
{
  rose : (i : Size) -> A -> List (Rose A i) # -> Rose A ($ i)
}



fun step : (j : Size) -> (A : Set) -> (i : Size) ->
           List (Rose A ($ i)) j -> 
           Prod (List A j) (List (Rose A i) #) 

{
  step .($ j) A i (nil j) = pair (nil _) (nil _);

  step .($ j) A .i (cons j (rose i a rs') rs) =
    split (List A j) (List (Rose A i) #) 
       (step j A i rs) 
          (Prod (List A ($ j)) (List (Rose A i) #))
       (\ as -> \ rs'' -> pair
           (cons _ a as) 
           (append (Rose A i) rs' rs'')) 

}

fun bf' : (A : Set) -> (i : Size) -> List A # -> List (Rose A i) # -> List A # 
{
  bf' A i as (nil .#) = as;
  bf' A .($ i) as (cons .# (rose i a r) rs) = append A as 
    (split
        (List A #) (List (Rose A i) #) 
      (step # A i (cons  _ (rose _ a r) rs))
        (List A #) 
      (bf' A i) 
    )
}

{-
mutual {

  fun bf' : (A : Set) -> (i : Size) -> List A # -> List (Rose A i) # -> List A # 
  {
    bf' A ($ i) as (nil .(Rose A ($ i)) .#) = as;
    bf' A ($ i) as (cons .(Rose A ($ i)) .# r rs) =
      append A as (bf A i r rs)
  }
  
  fun bf : (A : Set) -> (i : Size) -> Rose A i -> List (Rose A i) # -> List A #
  {
  
    bf A i r rs = 
      (split
          (List A #) (List (Rose A i) #) 
        (step # A i (cons (Rose A ($ i)) _ r rs))
          (List A #) 
        (bf' A i) 
      )
  }
  
}

-}