[Agda] question on irrelevant argument
Andreas Abel
abela at chalmers.se
Mon Jan 20 17:09:20 CET 2014
On 20.01.2014 11:53, Sergei Meshveliani wrote:
> 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,
You are never forced to use _ instead of a variable name on the l.h.s.
> because the checker does not allow its usage as
>
> foo ... nz = ... (nz ...)
On the r.h.s. nz can only used in irrelevant positions, i.e., in
irrelevant arguments to some functions.
> Here '_' instead of nz means, probably that
> "it is used some value of the corresponding type".
If you use _ instead of a variable name on the lhs, the variable is not
in scope but still available to the unifier. So Agda might sometimes
use it to fill in a missing irrelevant argument.
> This example with ⊥-elim-irr is the first case that breaks this
> behavior.
\bot-elem-irr is such a function with irrelevant argument.
>> 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