[Agda] original Nat
Sergei Meshveliani
mechvel at botik.ru
Wed Dec 20 12:56:12 CET 2017
On Wed, 2017-12-20 at 12:09 +0100, Ulf Norell wrote:
> Removing the BUILTIN pragmas would do it, but I would suggest
> using a different, but isomorphic, type for your termination measures.
> That way you don't have to mess with the builtin libraries.
>
I thought of this.
But:
this my Bin3 library proves the isomorphism of toℕ : Bin -> ℕ
with respect to +, *, monotonicity of toℕ for _<_, and so on.
And this all uses many items from Data.Nat.Properties,
and the latter items refer to the items of Data.Nat: Nat._+_, Nat._*_,
Nat._∸_.
So that I would need to also have the version of Nat.Properties
with a different import.
And I wonder of whether this is all that will be needed.
Also may it have sense for Agda to provide somewhat --primitiveNat key
for type-checking or/and compiling without built-ins for operations on ℕ
?
------
Sergei
>
> On Wed, Dec 20, 2017 at 12:04 PM, Sergei Meshveliani
> <mechvel at botik.ru> wrote:
> On Wed, 2017-12-20 at 09:08 +0100, Ulf Norell wrote:
> > Natural number operations _are_ implemented in Agda, and
> you'll find the definitions in
> > Agda.Builtin.Nat. The way that they are built in is that
> when called on closed terms (for
> > instance 101 + 52), the type checker evaluates that using
> Haskell integer arithmetic rather than the Agda definitions.
> >
> >
> > You can read more
> > here:
> http://agda.readthedocs.io/en/latest/language/built-ins.html#natural-numbers
> >
> >
> > Agda.Builtin.Nat is shipped with Agda. You can find its
> location
> > either by middle-clicking
> > the module name in Emacs, or by calling Agda from the
> command line
> > with `-v2`:
> >
> >
> > Bla.agda:
>
> > import Agda.Builtin.Nat
>
> > $ agda -v2 Bla.agda
> > [..]
>
>
> Thank you.
>
> Now, I find it on my machine on
>
> /home/mechvel/.cabal/share/x86_64-linux-ghc-7.10.2/Agda-2.5.3/lib/prim/Agda/Builtin/Nat.agda
>
>
>
> The problem is as follows.
>
> I have prepared a new certified arithmetic for Bin,
> including
> * _<_ and <-cmp comparison based on lexicographic ordering on
> bit lists,
> * _∸_, divMod, gcd,
> * proofs for all important things, like CommutativeMonoid for
> _+_ and
> _*_, and other properties.
>
> The aim is to avoid any built-in arithmetic, with keeping a
> reasonable
> cost order. For example, (divMod x y) needs to cost somewhat
> O(l^2)
> for l = max (bitLength x) (bitLength y).
>
> But:
> in some paces it uses the counter cnt : ℕ for termination
> proof
> (I do not know how to arrange some termination proofs without
> using
> toℕ).
> It is initially obtained by (Bin.toℕ b), and works in the
> loops by
> pattern-matching against (1+ cnt).
>
> Now, I need a performance test showing that, for example,
> divMod x y
> has the intended cost order.
> And it does so.
> But:
> (Bin.toℕ b) applies Nat._+_ and (Nat._*_ 2) in a loop at
> the
> running time.
>
> The cost order for operating with cnt can be small due to
> the two
> reasons:
> (1) lazy evaluation of toℕ, with stepping from (1+ cnt) to
> cnt
> a few number of times,
> (2) built-in performance for Nat._+_ and (Nat._*_ 2).
>
> I need to make sure that the source of (2) can be removed.
> For this, I, probably, need to switch out built-ins for all
> Nat items,
> with letting them evaluate really in _unary_ system. For
> example,
> (Nat.+ 101 52) to compute in 53 steps of pattern matching.
>
> Right?
>
> How does one arrange this?
>
> Needs one to edit the file
> .../share/x86_64-linux-ghc-7.10.2/Agda-2.5.3/lib/prim/Agda/Builtin/Nat.agda
>
> with removing all the lines containing the pragma of
> {-# BUILTIN ...
> #-}
> ?
>
> Thanks,
>
> ------
> Sergei
>
>
> >
> > On Tue, Dec 19, 2017 at 7:43 PM, Sergei Meshveliani
> <mechvel at botik.ru>
> > wrote:
> > Please, what is a regular way to switch between the
> built-in
> > Nat
> > arithmetic and the original one (implemented in
> Agda) ?
> >
> > Data.Nat.Base of lib-0.14 contains
> >
> > open import Agda.Builtin.Nat public using ( zero;
> suc; _+_;
> > _*_ )
> > renaming ( Nat
> to ℕ; _-_
> > to _∸_ )
> >
> > But I do not find the module Agda.Builtin.Nat.
> >
> > I need to use the Nat arithmetic programmed in Agda
> > (ℕ; _+_, _*_, _∸_, _≤_ ...) as in early days.
> >
> > Thanks,
> >
> > ------
> > Sergei
> >
> > _______________________________________________
> > Agda mailing list
> > Agda at lists.chalmers.se
> > https://lists.chalmers.se/mailman/listinfo/agda
> >
> >
>
>
>
>
>
More information about the Agda
mailing list