[Coq-Club] [Agda] Re: [HoTT] newbie questions about homotopy
theory & advantage of UF/Coq
Conor McBride
conor at strictlypositive.org
Thu Jan 9 12:10:06 CET 2014
On 8 Jan 2014, at 17:53, Andreas Abel <andreas.abel at ifi.lmu.de> wrote:
> Conor,
>
> that's on the latest darcs version of Agda, I guess?
No. 2.3.2.1 from cabal.
>
> At least my own version of --without-K rejects your match on Refl:
>
> The indices
> WOne
> X
> are not constructors (or literals) applied to variables (note that
> parameters count as constructor arguments)
> when checking that the pattern Refl has type WOne <-> X
>
> But you say it is justified, is it?
I believe so.
This is quite like the thing Jesper wrote yesterday, but with labelled
types, built as records, for added clarity. At each step, I show the
labelled type of the programming problem, corresponding to the left-hand
side of the function being constructed. The pattern refinement of Noo
is exactly that given by the standard-issue eliminator for <->.
Note that I've used only case analysis here, the purpose being to show
that the covering can be constructed without K.
Cheers
Conor
---
{-# OPTIONS --without-K #-}
module PE where
data Zero : Set where
elimZero : (z : Zero)(P : Zero -> Set) -> P z
elimZero ()
data WOne : Set where
wrap : (Zero -> WOne) -> WOne
elimWOne : (x : WOne) ->
(P : WOne -> Set) ->
((f : Zero -> WOne) -> ((z : Zero) -> P (f z)) -> P (wrap f)) ->
P x
elimWOne (wrap f) P p = p f \ z -> elimWOne (f z) P p
caseWOne : (x : WOne) ->
(P : WOne -> Set) ->
((f : Zero -> WOne) -> P (wrap f)) ->
P x
caseWOne w P p = elimWOne w P \ f _ -> p f
data _<->_ (X : Set) : Set -> Set where
Refl : X <-> X
elim<-> : {X Y : Set}(Q : X <-> Y) ->
(P : (Y : Set)(Q : X <-> Y) -> Set) ->
P X Refl ->
P Y Q
elim<-> Refl P p = p
postulate
myIso : WOne <-> (Zero -> WOne)
record Moo (w : WOne) : Set where
constructor moo=
field
callMoo : Zero
open Moo
moo' : (w : WOne) -> Moo w -> Zero
moo' w = callMoo
record Noo (X : Set)(Q : WOne <-> X)(x : X) : Set where
constructor noo=
field
callNoo : Zero
open Noo
noo' : (X : Set)(Q : WOne <-> X)(x : X) -> Noo X Q x -> Zero
noo' X Q x = callNoo
noo : (X : Set)(Q : WOne <-> X)(x : X) -> Noo X Q x
noo X Q x = {- Noo X Q x -}
elim<-> Q (\ X Q -> (x : X) -> Noo X Q x)
(\ x -> {- Noo WOne Refl x -}
noo= (moo' x {!{- Moo x -}!}))
x
moo : (w : WOne) -> Moo w
moo w = {- Moo w -}
caseWOne w Moo \ f -> {- Moo (wrap f) -}
moo= (noo' (Zero -> WOne) myIso f (noo (Zero -> WOne) myIso f))
>
> Cheers,
> Andreas
>
> On 07.01.2014 17:42, Conor McBride wrote:
>>> Very good. Agda is right and Coq got it wrong. As I said previosuly the
>>> definition of loop implicitely uses K.
>>
>> Not so fast! The code below is accepted using the --without-K flag, and
>> the elimination that noo does is a based path induction, IIUC.
>>
>> Conor
>>
>> {-# OPTIONS --without-K #-}
>>
>> module BadWithoutK where
>>
>> data Zero : Set where
>>
>> data WOne : Set where
>> wrap : (Zero -> WOne) -> WOne
>>
>> data _<->_ (X : Set) : Set -> Set where
>> Refl : X <-> X
>>
>> postulate
>> myIso : WOne <-> (Zero -> WOne)
>>
>> moo : WOne -> Zero
>> noo : (X : Set) -> (WOne <-> X) -> X -> Zero
>>
>> moo (wrap f) = noo (Zero -> WOne) myIso f
>> noo .WOne Refl x = moo x
>>
>> bad : Zero
>> bad = moo (wrap \ ())
>
> --
> Andreas Abel <>< Du bist der geliebte Mensch.
>
> Theoretical Computer Science, University of Munich
> Oettingenstr. 67, D-80538 Munich, GERMANY
>
> andreas.abel at ifi.lmu.de
> http://www2.tcs.ifi.lmu.de/~abel/
> <ConorMcBride.agda>
More information about the Agda
mailing list