[Agda] type check with large constant
Ulf Norell
ulf.norell at gmail.com
Mon Feb 12 17:10:02 CET 2018
I did mean `n`, which is a free variable of the term `(a + n) ∸ a`.
Built-in arithmetic
can only do its thing if all arguments to the built-in function are
constants, but in this
case `n` is an argument to the function and its value is not fixed at type
checking time.
/ Ulf
On Mon, Feb 12, 2018 at 4:57 PM, Sergei Meshveliani <mechvel at botik.ru>
wrote:
> 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
> >
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.chalmers.se/pipermail/agda/attachments/20180212/6de89062/attachment.html>
More information about the Agda
mailing list