[Agda] Associativity for free!
James Chapman
james at cs.ioc.ee
Wed Oct 26 23:45:19 CEST 2011
Thanks for the references Randy.
I also forgot to say before…
Alan: neat trick!
Best,
James
On Oct 27, 2011, at 12:34 AM, Randy Pollack wrote:
>> 2. [...] Another solution I learnt from Conor [...]
>>
>> data _≤_ {X : Set} : List X → List X → Set where
>> done : [] ≤ []
>> keep : ∀{x}{xs xs'} → xs ≤ xs' → (x :: xs) ≤ (x :: xs')
>> skip : ∀{x}{xs xs'} → xs ≤ xs' → xs ≤ (x :: xs')
>
> I think you will find this approach for weakening (of PTS typing) used
> already in Geuvers and Nederhof, JAR 1991 (widely circulated by 1989).
> Following Geuvers and Nederhof, this approach is used in many papers
> that mentions weakening of a type system or a logic since that time
> (e.g. McKinna/Pollack, Pitts, Urban, ...).
>
> Best,
> Randy
> ---
> On Wed, Oct 26, 2011 at 5:01 PM, James Chapman <james at cs.ioc.ee> wrote:
>> Hi Alan,
>>
>> I too have encountered this problem, rather than tackling it head on here are two ways of tiptoeing around it.
>>
>> 1. A trivial solution for your example is simply to make _++_ associate to the left:
>>
>> data List (X : Set) : Set where
>> [] : List X
>> _::_ : X → List X → List X
>>
>> _++_ : ∀{X} → List X → List X → List X
>> [] ++ xs' = xs'
>> (x :: xs) ++ xs' = x :: (xs ++ xs')
>>
>> infixl 5 _++_
>>
>> postulate P : ∀{X} → List X → Set
>>
>> postulate weakening : ∀ {A} (as bs cs : List A) →
>> P (as ++ cs) → P (as ++ bs ++ cs)
>>
>> weaken2 : ∀ {A} (as bs cs ds : List A) →
>> P (as ++ bs ++ ds) → P (as ++ bs ++ cs ++ ds)
>> weaken2 as bs cs ds p = weakening (as ++ bs) cs ds p
>>
>> This may sound silly and perhaps you might somewhere else need append to associate to the right. Nisse told me that in a recent implementation of a dependently typed lambda calculus he defined both versions and didn't end up needing them both at the same time. Do you need both at the same time?
>>
>> 2. I guess you run into the this problem where ++ is an operation on contexts right? Another solution I learnt from Conor (exercise 15, his AFP notes http://www.strictlypositive.org/epigram-notes.ps.gz) is simply to avoid it. Instead of giving weakening this type, give a first order presentation of weakenings (functions from a context to the same context with more stuff chucked in arbitrary places). For lists this function space would be the following inductively defined sublist relation:
>>
>> data _≤_ {X : Set} : List X → List X → Set where
>> done : [] ≤ []
>> keep : ∀{x}{xs xs'} → xs ≤ xs' → (x :: xs) ≤ (x :: xs')
>> skip : ∀{x}{xs xs'} → xs ≤ xs' → xs ≤ (x :: xs')
>>
>> Then, weakening would be something like:
>>
>> weakening : ∀{X}{xs xs' : List X} → P xs → xs ≤ xs' → P xs'
>>
>> By doing this ++ never appears in the types, so we don't have to use subst. I used this technique (called order preserving embeddings) in chapter 4 of my thesis (http://www.cs.ioc.ee/~james/papers/thesis.pdf ) and it was much more pleasant than using ++ as we did in our Big-step normalization paper (http://www.cs.ioc.ee/~james/papers/tait2.pdf) on which this chapter was based.
>>
>> Best wishes,
>>
>> James
>>
>>
>> _______________________________________________
>> Agda mailing list
>> Agda at lists.chalmers.se
>> https://lists.chalmers.se/mailman/listinfo/agda
>>
>>
More information about the Agda
mailing list