[Agda] Help, I'm failing at sized types.
Andreas Abel
andreas.abel at ifi.lmu.de
Sat Mar 14 00:09:39 CET 2015
In the very latest development versions (maint-2.4.2 or master),
irrelevant sizes work with Size<. (However, there is no published paper
assuring the soundness.)
{-# OPTIONS --experimental-irrelevance #-}
open import Size
{- direction of type flow -}
data Dir : Set where chk syn : Dir
{- sized terms with type flow direction -}
data Tm ..{a : Size} : Dir -> Set where
Type : Tm chk
[_] : .{b : Size< a} -> (e : Tm {b} syn) -> Tm chk
_::_ : .{b c : Size< a} -> (t : Tm {b} chk)(T : Tm {c} chk) -> Tm syn
infixl 3 _::_
{- numbers will be used for fresh names, but no binding for now -}
data Nat : Set where
ze : Nat
su : Nat -> Nat
{-# BUILTIN NATURAL Nat #-}
{- reduction garbage-collects useless type annotations -}
data Red (y : Nat) : {d : Dir}(a b : Tm d) -> Set where
{- b can be larger than a, if we add beta for lambda -}
gamma : {t : Tm chk}{T : Tm chk} ->
Red y [ t :: T ] t
[_] : {e e' : Tm syn} -> Red y e e' -> Red y [ e ] [ e' ]
tm : {t t' T : Tm chk} -> Red y t t' -> Red y (t :: T) (t' :: T)
ty : {t T T' : Tm chk} -> Red y T T' -> Red y (t :: T) (t :: T')
{- reflexive-transitive closure -}
data Reds (y : Nat){d : Dir}(a : Tm d) : Tm d -> Set where
refl : Reds y a a
_,_ : {b c : Tm d} -> Red y a b -> Reds y b c -> Reds y a c
tm* : ∀{y}{t t' T : Tm chk} -> Reds y t t' -> Reds y (t :: T) (t' :: T)
tm* refl = refl
tm* (r , rs) = tm r , tm* rs
ty* : ∀{y}{t T T' : Tm chk} -> Reds y T T' -> Reds y (t :: T) (t :: T')
ty* refl = refl
ty* (r , rs) = ty r , ty* rs
_++_ : ∀{y d}{a b c : Tm d} -> Reds y a b -> Reds y b c -> Reds y a c
refl ++ ss = ss
(r , rs) ++ ss = r , (rs ++ ss)
{- develop a term by doing everything you can see -}
dev : .{a : Size} -> Nat -> {d : Dir} -> Tm {a} d -> Tm d
dev y [ t :: T ] = dev y t
dev y Type = Type
dev y (t :: T) = dev y t :: dev y T
{- when I include lambdas, dev renames before and after recursive calls,
and sized types are just lovely! -}
{- show that you can compute a term to its development -}
devReds : .{a : Size}(y : Nat){d : Dir}(t : Tm {a} d) -> Reds y t (dev y t)
devReds y [ t :: T ] = gamma , devReds y t
devReds y Type = refl
devReds y (t :: T) = tm* (devReds y t) ++ ty* (devReds y T)
On 13.03.2015 15:47, Andreas Abel wrote:
> The workaround is to actively replace all sizes by infinity. Ideally,
> sizes in constructors would be irrelevant, but we are not there yet.
>
> er : ∀{a d} → Tm {a} d → Tm d
> er Type = Type
> er [ t ] = [ er t ]
> er (t :: t') = er t :: er t'
>
> {- show that you can compute a term to its development -}
> devReds : {a : Size}(y : Nat){d : Dir}(t : Tm {a} d)
> -> Reds y (er t) (dev y (er t))
> devReds y [ t :: T ] = gamma , devReds y t
> devReds y Type = refl
> devReds y (t :: T) = {!!}
>
> Now you can give `gamma'. Maybe the explicit erasure will get in your
> way somewhere else, but at least this lemma goes through...
>
> Cheers,
> Andreas
>
> On 13.03.2015 15:20, Conor McBride wrote:
>>
>> On 13 Mar 2015, at 13:04, Conor McBride <conor at strictlypositive.org>
>> wrote:
>>
>>>
>>> I’ll see if I can make progress with the new style.
>>
>> And my next failure didn’t take long. This is a cut-down version of
>> what I’m trying to do.
>>
>> {- direction of type flow -}
>> data Dir : Set where chk syn : Dir
>>
>> {- sized terms with type flow direction -}
>> data Tm {a : Size} : Dir -> Set where
>> [_] : {b : Size< a} -> (e : Tm {b} syn) -> Tm chk
>> Type : Tm chk
>> _::_ : {b c : Size< a} -> (t : Tm {b} chk)(T : Tm {c} chk) -> Tm syn
>> infixl 3 _::_
>>
>> {- numbers will be used for fresh names, but no binding for now -}
>> data Nat : Set where
>> ze : Nat
>> su : Nat -> Nat
>>
>> {-# BUILTIN NATURAL Nat #-}
>>
>> {- reduction garbage-collects useless type annotations -}
>> data Red (y : Nat) : {d : Dir}(a b : Tm d) -> Set where
>> {- b can be larger than a, if we add beta for lambda -}
>> gamma : {t : Tm chk}{T : Tm chk} ->
>> Red y [ t :: T ] t
>> [_] : {e e' : Tm syn} -> Red y e e' -> Red y [ e ] [ e' ]
>> tm : {t t' T : Tm chk} -> Red y t t' -> Red y (t :: T) (t' :: T)
>> ty : {t T T' : Tm chk} -> Red y T T' -> Red y (t :: T) (t :: T’)
>>
>> {- reflexive-transitive closure -}
>> data Reds (y : Nat){d : Dir}(a : Tm d) : Tm d -> Set where
>> refl : Reds y a a
>> _,_ : {b c : Tm d} -> Red y a b -> Reds y b c -> Reds y a c
>>
>> {- develop a term by doing everything you can see -}
>> dev : {a : Size} -> Nat -> {d : Dir} -> Tm {a} d -> Tm d
>> dev y [ t :: T ] = dev y t
>> dev y Type = Type
>> dev y (t :: T) = dev y t :: dev y T
>> {- when I include lambdas, dev renames before and after recursive calls,
>> and sized types are just lovely! -}
>>
>> {- show that you can compute a term to its development -}
>> devReds : {a : Size}(y : Nat){d : Dir}(t : Tm {a} d) -> Reds y t (dev
>> y t)
>> devReds y [ t :: T ] = {!gamma!} , devReds y t
>> devReds y Type = refl
>> devReds y (t :: T) = {!!}
>>
>> {- I can’t give gamma in that hole, due to size mismatch. Nor can I
>> see how to
>> put sizes on the type of gamma to eliminate the mismatch. -}
>>
>> So, the presence of sizes in types is just what I need to make the
>> termination explanation
>> for dev, but the persistence of size information makes it harder to
>> formulate and prove
>> properties of terms. I’m conscious that I’m just blundering about, but
>> hopeful that there
>> might be some knack to learn.
>>
>> I very much hope that, one day, the refinement of Tm with a suitable
>> size discipline might
>> be localized to the definition of dev.
>>
>> All the best
>>
>> Conor
>>
>>
>>
>>>
>>> Thanks
>>>
>>> Conor
>>>
>>>>
>>>> On 13.03.2015 12:51, Conor McBride wrote:
>>>>> Hi
>>>>>
>>>>> Sorry to be a nuisance.
>>>>>
>>>>> I’m trying to do some stuff with sized types, but I think I’m
>>>>> failing at basic stuff like finding
>>>>> the on-switch. Specifically…
>>>>>
>>>>> ****************************************
>>>>> {-# OPTIONS --sized-types #-}
>>>>>
>>>>> module SizeFail where
>>>>>
>>>>> open import Agda.Primitive
>>>>> postulate
>>>>> Size : Set
>>>>> Size<_ : Size -> Set
>>>>> up : Size -> Size
>>>>> infty : Size
>>>>> {-# BUILTIN SIZE Size #-}
>>>>> {-# BUILTIN SIZELT Size<_ #-}
>>>>> {-# BUILTIN SIZESUC up #-}
>>>>> {-# BUILTIN SIZEINF infty #-}
>>>>>
>>>>> data Foo : Size -> Set where
>>>>> boo : {i : Size} -> Foo i
>>>>> coo : {i : Size} -> Foo i -> Foo (up i)
>>>>>
>>>>> subtype? : {i : Size} -> Foo i -> Foo infty
>>>>> subtype? t = t
>>>>> ****************************************
>>>>>
>>>>> …results in the complaint...
>>>>>
>>>>> .i != infty of type Size
>>>>> when checking that the expression t has type Foo infty
>>>>>
>>>>> …whether the pragmas are present or not.
>>>>>
>>>>> Any light gratefully received.
>>>>>
>>>>> (Longer term, I want to do some syntactic mangling in which
>>>>> renaming is obviously size-preserving, so I can apply a renaming to
>>>>> a substructure before I do a recursive call on it.)
>>>>>
>>>>> Cheers
>>>>>
>>>>> Conor_______________________________________________
>>>>> 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/
>>>
>>> _______________________________________________
>>> 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
>>
>
>
--
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/
-------------- next part --------------
{-# OPTIONS --experimental-irrelevance #-}
open import Size
{- direction of type flow -}
data Dir : Set where chk syn : Dir
{- sized terms with type flow direction -}
data Tm ..{a : Size} : Dir -> Set where
Type : Tm chk
[_] : .{b : Size< a} -> (e : Tm {b} syn) -> Tm chk
_::_ : .{b c : Size< a} -> (t : Tm {b} chk)(T : Tm {c} chk) -> Tm syn
infixl 3 _::_
{- numbers will be used for fresh names, but no binding for now -}
data Nat : Set where
ze : Nat
su : Nat -> Nat
{-# BUILTIN NATURAL Nat #-}
{- reduction garbage-collects useless type annotations -}
data Red (y : Nat) : {d : Dir}(a b : Tm d) -> Set where
{- b can be larger than a, if we add beta for lambda -}
gamma : {t : Tm chk}{T : Tm chk} ->
Red y [ t :: T ] t
[_] : {e e' : Tm syn} -> Red y e e' -> Red y [ e ] [ e' ]
tm : {t t' T : Tm chk} -> Red y t t' -> Red y (t :: T) (t' :: T)
ty : {t T T' : Tm chk} -> Red y T T' -> Red y (t :: T) (t :: T')
{- reflexive-transitive closure -}
data Reds (y : Nat){d : Dir}(a : Tm d) : Tm d -> Set where
refl : Reds y a a
_,_ : {b c : Tm d} -> Red y a b -> Reds y b c -> Reds y a c
tm* : ∀{y}{t t' T : Tm chk} -> Reds y t t' -> Reds y (t :: T) (t' :: T)
tm* refl = refl
tm* (r , rs) = tm r , tm* rs
ty* : ∀{y}{t T T' : Tm chk} -> Reds y T T' -> Reds y (t :: T) (t :: T')
ty* refl = refl
ty* (r , rs) = ty r , ty* rs
_++_ : ∀{y d}{a b c : Tm d} -> Reds y a b -> Reds y b c -> Reds y a c
refl ++ ss = ss
(r , rs) ++ ss = r , (rs ++ ss)
{- develop a term by doing everything you can see -}
dev : .{a : Size} -> Nat -> {d : Dir} -> Tm {a} d -> Tm d
dev y [ t :: T ] = dev y t
dev y Type = Type
dev y (t :: T) = dev y t :: dev y T
{- when I include lambdas, dev renames before and after recursive calls,
and sized types are just lovely! -}
{- show that you can compute a term to its development -}
devReds : .{a : Size}(y : Nat){d : Dir}(t : Tm {a} d) -> Reds y t (dev y t)
devReds y [ t :: T ] = gamma , devReds y t
devReds y Type = refl
devReds y (t :: T) = tm* (devReds y t) ++ ty* (devReds y T)
More information about the Agda
mailing list