[Agda] type check with large constant
Sergei Meshveliani
mechvel at botik.ru
Mon Feb 12 16:57:18 CET 2018
On Mon, 2018-02-12 at 08:18 +0100, Ulf Norell wrote:
> I haven't looked at what the type checker is doing in detail that
> makes test2 so extremely slow, but note that built-in arithmetic does
> not kick in for open terms. In your example `(a + n) ∸ a` contains a
> free variable `n`, if the type checker has to evaluate it (which I
> suspect it does for test2, but not test1) it will use the non-built-in
> recursive definitions for `_+_` and `_∸_`.
Did you mean `a' being free there rather than `n' ?
As to `a', it is a constant, it is substituted with 12345, at some
stage. I do not know of whether this occurrence is qualified as free.
> I would advise abstracting over `a` whenever you can.
Thank you for your note. I shall think about this.
------
Sergei
> On Sat, Feb 10, 2018 at 2:45 PM, Sergei Meshveliani <mechvel at botik.ru>
> wrote:
> Dear all,
>
> I need to type-check a program that uses a certain large
> global constant a.
> And the function test2 below is type-checked much longer
> than test1, It takes too long.
> This is Agda 2.5.3.
>
> Can people, please, explain the effect?
>
> --------------------------------------------------------------
> open import Function using (_∘_; _$_)
> open import Relation.Binary.PropositionalEquality using (_≡_;
> cong)
> open import Data.Nat using (ℕ; suc; _+_; _∸_)
> open import Data.Nat.Properties using (+-comm)
>
> a : ℕ
> a = 12345
>
> test1 : ∀ n → (a + n) ∸ a ≡ (n + a) ∸ a
> test1 n = cong (_∸ a) (+-comm a n)
>
> test2 : ∀ n → suc ((a + n) ∸ a) ≡ suc ((n + a) ∸ a)
> test2 n = cong (suc ∘ (_∸ a)) (+-comm a n)
>
> -- cong suc (test1 n)
> ---------------------------------------------------------------
>
> The interactive type-checker highlights the expression
> cong (suc ∘ (_∸ a)) (+-comm a n)
>
> and hangs for a long time.
>
> Also test2 type-checks fast if it is implemented as
> cong suc (test1 n).
>
> I can type-check the whole program with, say, a = 7.
> But for a good run-time performance `a' needs to be large
> (and it relies on that the run-time arithmetic is built-in).
>
> Thanks,
>
> ------
> Sergei
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>
>
More information about the Agda
mailing list