[Agda] evaluation in compilation

Andreas Abel andreas.abel at ifi.lmu.de
Wed Oct 3 01:47:08 CEST 2012


When I try to load your example, I get a "stack overflow".  So it is not 
a problem of the compiler, but already type checking fails.

I found the problem:

 > zs = merge xs ys
 >
 > hl : List Nat
 > hl   with zs

If you "with" an expression, like "zs" here, it is normalized.  This 
means that Agda has to compute the list of length 16000, with (in this 
case possibly inefficient) call-by-name evaluation strategy.

That can well blow the Agda type checker.

It is advisable to avoid "with" in this case.

-- this works
bla : List ℕ → List ℕ
bla [] = []
bla (z ∷ zs') =  z ∷ (last $ fromL z zs') ∷ []

hl = bla zs

main : IO Unit
main = putStrLn (toCostring $ showNatList hl)

Or use "case" from the std-lib.

Cheers,
Andreas


  Skipping Prelude 
(/Users/abel/public_html/repos/AgdaPrelude/src/Prelude.agdai).
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
    7,195,923,960 bytes allocated in the heap
    1,737,295,060 bytes copied during GC
      285,621,572 bytes maximum residency (14 sample(s))
       21,748,488 bytes maximum slop
              707 MB total memory in use (0 MB lost due to fragmentation)

   Generation 0: 13317 collections,     0 parallel, 48.47s, 49.44s elapsed
   Generation 1:    14 collections,     0 parallel,  3.11s,  5.09s elapsed

   INIT  time    0.00s  (  0.08s elapsed)
   MUT   time   22.88s  ( 25.11s elapsed)
   GC    time   51.58s  ( 54.54s elapsed)
   EXIT  time    0.00s  (  0.00s elapsed)
   Total time   74.46s  ( 79.72s elapsed)

   %GC time      69.3%  (68.4% elapsed)

   Alloc rate    314,514,602 bytes per MUT second

   Productivity  30.7% of total user, 28.7% of total elapsed



On 01.10.12 6:51 PM, Serge D. Mechveliani wrote:
> module Main where
> open import Foreign.Haskell
> open import IO.Primitive
> open import Relation.Nullary
> open import Function using ( _$_ )
> open import Data.Nat as Nat
> open import Data.Nat.Show
> open import Data.List as List
> open import Data.List.NonEmpty renaming ( fromList to fromL )
> open import Data.String renaming ( _++_ to _Str++_ )
> open import Prelude using ( toCostring )             -- by F. Kettelhoit
>
> showNatList : List Nat -> String
> showNatList xs = "[" Str++ (showL xs) Str++ "]"
>    where
>    showL : List Nat -> String
>    showL []        = ""
>    showL (x :: []) = show x
>    showL (x :: xs) = (show x) Str++ "," Str++ showL xs
>
> merge : List Nat -> List Nat -> List Nat
> merge []        ys        =  ys
> merge xs        []        =  xs
> merge (x :: xs) (y :: ys)  with
>                         x <=? y | merge xs (y :: ys) | merge (x :: xs) ys
> ...                  | yes _ | zs | _  =  x :: zs
> ...                  | _     | _  | zs =  y :: zs
>
> concatCopies : {A : Set} -> Nat -> List A -> List A
> concatCopies 0       xs =  []
> concatCopies (suc n) xs =  xs ++ (concatCopies n xs)
>
> xs0 : List Nat
> xs0 = 1 :: 3 :: 4 :: 6 :: []
>
> n : Nat
> n = 16000  -- 32000
>
> xs = concatCopies n xs0
> ys = concatCopies n $ List.reverse xs0
> zs : List Nat
> zs = merge xs ys
>
> hl : List Nat
> hl   with zs
> ... | z :: zs' =  z :: (last $ fromL z zs') :: []
> ... | _       =  []
>
> main : IO Unit
> main = putStrLn (toCostring $ showNatList hl)

-- 
Andreas Abel  <><      Du bist der geliebte Mensch.

Theoretical Computer Science, University of Munich
Oettingenstr. 67, D-80538 Munich, GERMANY

andreas.abel at ifi.lmu.de
http://www2.tcs.ifi.lmu.de/~abel/


More information about the Agda mailing list