[Agda] help avoiding space leak using strict evaluation
Sergei Meshveliani
mechvel at botik.ru
Tue Sep 6 11:22:55 CEST 2016
On Sun, 2016-09-04 at 07:59 +0200, Ulf Norell wrote:
> The key thing to remember is that _$!_ only evaluates the argument
> to weak head normal form (just like in Haskell). You can step through
> this by hand to see where the space leak is:
>
>
> fooBy 1000 (suc zero) ->
> fooBy 999 $! foo (suc zero) ->
> fooBy 999 (suc (id zero)) ->
> fooBy 998 $! foo (suc (id zero)) ->
> fooBy 998 (suc (id (id zero))) ->
> ...
> []
By the way, has it sense to use this primForce for increasing
performance of type checking in some examples?
For example, consider the following known example which yields an
exponential cost growth of type checking:
------------------------------------------------------------------------
open import Relation.Binary.PropositionalEquality as PE using (_≡_)
open import Data.List using (replicate; foldl)
open import Data.Nat using (ℕ; suc; _+_; _∸_; _*_)
comb : ℕ → ℕ → ℕ
comb a x = suc ((a + x) ∸ a)
test : ℕ → ℕ
test n = foldl comb 0 (replicate n 1)
lemma : test 3 ≡ 2
lemma = PE.refl
-- lemma2 : 12 * 20 ≡ 240
-- lemma2 = PE.refl
{- n time [sec]
18 4
19 6
20 12
21 22
-}
------------------------------------------------------------------------
Will the strictness annotation help?
My current DoCon-A library for algebra needs 12 Gb memory to type-check
in 1 hour. May setting primForce help this?
Thanks,
------
Sergei
>
> / Ulf
>
> On Sat, Sep 3, 2016 at 1:33 AM, Martin Stone Davis
> <martin.stone.davis at gmail.com> wrote:
> I'm trying to use strict evaluation to avoid getting a space
> leak but my attempt fails: the below code blows-up the memory.
> (This question is a follow-up to a discussion in agda issue
> #2161).
>
> --
>
>
> open import Agda.Builtin.Strict
>
> infixr 0 _$!_
> _$!_ : ∀ {a b} {A : Set a} {B : A → Set b} → (∀ x → B x) → ∀ x
> → B x
> f $! x = primForce x f
>
> open import Agda.Builtin.Nat
> using (zero; suc; Nat)
> open import Agda.Builtin.Equality
> using (_≡_; refl)
>
> id : {A : Set} → A → A
> id x = x
>
> data Nat' : Set where
> zero : Nat'
> suc : Nat' → Nat'
>
> foo : Nat' → Nat'
> foo zero = zero
> foo (suc b) = suc (id b)
>
> fooBy : Nat → Nat' → Nat'
> fooBy zero x = x
> fooBy (suc n) x = fooBy n $! foo x
>
> test : fooBy 10000000 (suc zero) ≡ suc zero
> test = refl
>
>
>
>
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>
>
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
More information about the Agda
mailing list