[Agda] question on irrelevant argument
Sergei Meshveliani
mechvel at botik.ru
Mon Jan 20 11:53:50 CET 2014
On Sun, 2014-01-19 at 22:49 +0100, Andreas Abel wrote:
> > Generally, there are many situations in which I can write a type-checked
> > Agda program only by a lucky occasion.
> >
> > I tried
> > foo2 _ zero _ = ⊥-elim-irr {!!}
>
> If you use _ instead of naming your argument, you cannot refer to it
> later. It appears as
>
> .nz
>
> which does not mean "irrelevant nz" but "not in scope: nz".
>
> Unfortunately, the second can be misread for the first...
>
> If an argument is *irrelevant*, this does not mean that its value could
> not be bound to a variable! Using _ is generally not a good idea, only
> if it is actually not *used*
>
> Note: irrelevant =/= unused!
>
I see.
In many situations I am forced to set '_' for irrelevant argument,
because the checker does not allow its usage as
foo ... nz = ... (nz ...)
Here '_' instead of nz means, probably that
"it is used some value of the corresponding type".
This example with ⊥-elim-irr is the first case that breaks this
behavior.
Regards,
------
Sergei
> On 19.01.2014 20:45, Sergei Meshveliani wrote:
> > On Sun, 2014-01-19 at 15:26 +0100, Ulf Norell wrote:
> >> You can define an irrelevant version of ⊥-elim which you can use in
> >> foo2 and foo3:
> >>
> >>
> >> ⊥-elim-irr : .(x : ⊥) → ∀ {a}{A : Set a} → A
> >> ⊥-elim-irr ()
> >>
> >
> > Thank you.
> >
> > I tried several attempts with this. Finally I discover that this one is
> > type-checked:
> >
> > foo2 : (m n : ℕ) → .(nz : n ≢ zero) → ℕ
> > foo2 _ (suc n) _ = n
> > foo2 _ zero nz = ⊥-elim-irr (nz PE.refl)
> >
> > Generally, there are many situations in which I can write a type-checked
> > Agda program only by a lucky occasion.
> >
> > Thus, I tried in this example
> >
> > foo2 _ zero _ = ⊥-elim-irr ({!!} PE.refl)
> >
> > under emacs, and C-c C-a. This does not help!
> > I tried
> > foo2 _ zero _ = ⊥-elim-irr {!!}
> >
> > This occurs lucky. Here C-c C-a shows "(.nz PE.refl)" -- some hint.
> >
> > It is not still type checked! Then I change here ".nz" to "nz" :
> > "Not in scope: nz".
> >
> > Then I replace there "_ =" with "nz _ =".
> >
> > I expected that it will report that nz declared as irrelevant and
> > cannot be used this way.
> > But it is type-checked!
> > -- unlike with ⊥-elim.
> >
> > Regards,
> >
> > --------
> > Sergei
> >
> >
> >>
> >>
> >> On Sun, Jan 19, 2014 at 2:50 PM, Sergei Meshveliani <mechvel at botik.ru>
> >> wrote:
> >> Please,
> >> how to fix foo2, foo3 shown below?
> >>
> >> ----------------------------------------------------------------
> >> open import Relation.Binary.PropositionalEquality as PE using
> >> (_≡_; _≢_)
> >> open import Data.Empty using (⊥-elim)
> >> open import Data.Nat using (ℕ; module ℕ)
> >>
> >> open ℕ
> >>
> >> foo : (m n : ℕ) → n ≢ zero → ℕ -- this works
> >> foo _ (suc n) _ = n
> >> foo _ zero nz = ⊥-elim (nz PE.refl)
> >>
> >>
> >> foo2 : (m n : ℕ) → .(n ≢ zero) → ℕ
> >> foo2 _ (suc n) _ = n
> >> foo2 _ zero _ = ⊥-elim (u PE.refl) -- is not
> >> type-checked
> >> where
> >> u : zero ≢ zero
> >> u = _
> >> {-
> >> foo3 : (m n : ℕ) → .{nz : n ≢ zero} → ℕ
> >> foo3 _ (suc n) {_} = n
> >> foo3 _ zero {_} = ⊥-elim (u PE.refl) -- is not
> >> type-checked
> >> where
> >> u : zero ≢ zero
> >> u = {!!}
> >> -}
> >> ---------------------------------------------------------------------
> >>
> >> The checker (of development Agda of January 8, 2014)
> >>
> >> does not allow to skip the `zero' branch, nor to set () there,
> >> nor to apply ⊥-elim
> >> (nz is rejected for u, as well as '_').
> >>
> >> Thanks,
> >>
> >> ------
> >> Sergei
> >>
> >> _______________________________________________
> >> 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