packages feed

MiniAgda-0.2014.1.9: lib/colist.ma

-- colist.ma -- MiniAgda colist library

cofun CoList : ++(A : Set) -> -(i : Size) -> Set
{ CoList A i = Maybe (A & ([i' < i] -> CoList A i')) 
}

fun colist : [A : Set] -> [i : Size] -> |i| -> List A i -> CoList A i
{ colist A i nil               = nil
; colist A i (cons a (i', as)) = cons a (\ i'' -> colist A (max i' i'') as)
}  

fun cotake : [A : Set] -> [i : Size] -> Nat i -> CoList A i -> List A i
{ cotake A i zero          as         = nil
; cotake A i n             nil        = nil
; cotake A i (suc (i', n)) (cons a l) = cons a (i', cotake A i' n (l i'))
}

fun codrop : [A : Set ] -> 
             [i : Size] -> Nat i -> 
             [j : Size] -> CoList A (j+i) -> CoList A j
{ codrop A i zero          j l          = l
; codrop A i n             j nil        = nil
; codrop A i (suc (i', n)) j (cons a l) = codrop A i' n j (l (j+i'))
}

-- direct encoding of tail
check
fun cotail : [A : Set] [i : Size] (l : CoList A $i) -> CoList A i
{ cotail A i nil        = nil
; cotail A i (cons a l) = l i 
}

-- tail as instance of drop
let cotail [A : Set] : [i : Size] (l : CoList A $i) -> CoList A i
  = codrop A $0 (suc (0, zero))

fun coappend : [A : Set] -> [i : Size] -> |i| -> 
               CoList A i -> CoList A i -> CoList A i
{ coappend A i nil        bs = bs
; coappend A i (cons a l) bs = cons a (\ i' -> coappend A i' (l i') bs)
}

-- list take

let take [A : Set] [i : Size] (n : Nat i) (as : List A i) : List A i 
  = cotake A i n (colist A i as) 

{-

fun cotail : [A : Set] -> [i : Size] -> CoList A $i -> CoList A i
{ cotail A i l = case l
   { nil -> nil
   ; (cons a as) -> cons a (\ j -> as $j

mapMaybe (A & ([i' < $i] -> CoList A i'))  
                        (A & ([i' < i] -> CoList A i'))
    
}
-}