[Agda] Inspect.
flicky frans
flickyfrans at gmail.com
Mon Dec 29 13:55:23 CET 2014
An example, taken from the original post about inspect on steroids
[1], works well:
open import Level
open import Relation.Binary.PropositionalEquality as P hiding (inspect)
record Reveal_·_is_ {α β} {A : Set α} {B : A -> Set β}
(f : (x : A) -> B x) (x : A) (y : B x) : Set (α ⊔ β) where
constructor [_]
field eq : f x ≡ y
inspect : ∀ {α β} {A : Set α} {B : A -> Set β}
-> (f : (x : A) -> B x) -> (x : A) -> Reveal f · x is f x
inspect f x = [ refl ]
postulate
Nat : Set
T : Nat → Set
foo : (f : Nat → Nat)(x : Nat) → T (f x)
foo f x with f x | inspect f x
foo f x | z | [ fx=z ] = {!!}
``fx=z'' is of type ``f x ≡ z''. When I'm using the ``inspect'' from
the standard library
foo : (f : Nat → Nat)(x : Nat) → T (f x)
foo f x with f x | P.inspect f x
foo f x | z | [ fx=z ] = {!!}
I get
fx=z : .Data.Unit.Core.reveal (.Data.Unit.Core.hide f x) ≡ z
Or with opened Data.Unit.Core
fx=z : reveal (hide f x) ≡ z
Which is beta-equal to ``f x ≡ z'', but looks somewhat confusing.
I didn't test this new ``inspect'' properly, because I don't actually
know, what other properties it must have besides hiding a function
application.
Am I right in thinking, that unification works as follows?
When you pattern-match like this:
... with f x | inspect f x
... | y | [ p ] = {!!}
Agda replaces all occurrences of ``f x'' with ``y'' in the context and
in the type of ``inspect f x'', which is ``Reveal f · x is f x'', so
the type becomes ``Reveal f · x is y''. Then you pattern-match on
``inspect f x'' and get ``p : f x ≡ y''.
[1] http://comments.gmane.org/gmane.comp.lang.agda/3125
2014-12-29 13:41 GMT+03:00, Andreas Abel <andreas.abel at ifi.lmu.de>:
> Frankly, I do not know. We could replace the current definition by your
> simplification, provided that both work equally well wrt. unification.
> Did you do the experiments?
>
> Cheers,
> Andreas
>
> On 27.12.2014 17:52, flicky frans wrote:
>> Hello. I am probably missing something obvious, but why `inspect' is
>> not defined like this?
>>
>> record Reveal_·_is_ {α β} {A : Set α} {B : A -> Set β}
>> (f : (x : A) -> B x) (x : A) (y : B x) : Set (α ⊔ β) where
>> constructor [_]
>> field eq : f x ≡ y
>>
>> inspect : ∀ {α β} {A : Set α} {B : A -> Set β}
>> -> (f : (x : A) -> B x) -> (x : A) -> Reveal f · x is f x
>> inspect f x = [ refl ]
>>
>> This looks simpler and still allows you to pattern-match on (f x) and
>> to remember, that (f x ≡ y).
>> _______________________________________________
>> Agda mailing list
>> Agda at lists.chalmers.se
>> https://lists.chalmers.se/mailman/listinfo/agda
>>
>
>
> --
> Andreas Abel <>< Du bist der geliebte Mensch.
>
> Department of Computer Science and Engineering
> Chalmers and Gothenburg University, Sweden
>
> andreas.abel at gu.se
> http://www2.tcs.ifi.lmu.de/~abel/
>
More information about the Agda
mailing list