[Agda] new generalize feature, first version

Peter Divianszky divipp at gmail.com
Mon Apr 2 14:03:35 CEST 2018


Thanks for this test case too!
I'll add this also to the test suit.
I think it will be easy to fix this one.

Btw, I allowed issue tracking now on my fork:
https://github.com/divipp/agda/issues

My plan is to try to use gradually 'generalize' in a fork of std-lib.
I guess that would be a good overall test case.


On 2018-04-02 03:01, Martin Stone Davis wrote:
> Respect the privacy of --generalize'd identifiers!
> 
> ```
> {-# OPTIONS --generalize #-}
> 
> postulate
>    Nat : Set
>    Fin : Nat → Set
> 
> module _ where
> 
>    private
>      generalize
>        n : Nat
>    {-
>      Using private here has no effect. Private applies only to
>      declarations that introduce new identifiers into the module, like
>      type signatures and data, record, and module declarations.
>      when scope checking the declaration
>        module _ where
>    -}
> 
>    postulate foo : Fin n
> 
> postulate n : Nat
> {-
> Multiple definitions of n. Previous definition at
> [snip]
> when scope checking the declaration
>    n : Nat
> -}
> ```
> 
> 
> On 03/29/2018 05:13 AM, Peter Divianszky wrote:
>> Dear Agda users and implementors,
>>
>> I implemented a first version of forall-generalization, and I would 
>> like to get feedback on it.
>>
>>
>> For users
>> ---------
>>
>> An example Agda file can be found at
>> https://github.com/divipp/agda/blob/master/test/Succeed/Generalize.agda
>>
>> Suppose that the following Set formers were postulated:
>>
>> postulate
>>   Con :                       Set
>>   Ty  : (Γ : Con) →           Set
>>   Sub : (Γ Δ : Con) →         Set
>>   Tm  : (Γ : Con)(A : Ty Γ) → Set
>>
>> There is a new keyword 'generalize', which accept declarations like 
>> 'field' for records:
>>
>> generalize
>>   {Γ Δ Θ} : Con
>>   {A B C} : Ty _
>>   {σ δ ν} : Sub _ _
>>   {t u v} : Tm _ _
>>
>> After these 12 declarations
>>
>> (1) Γ, Δ and Θ behave as Con-typed terms, but they are automatically 
>> forall-generalized, so, for example
>>
>> postulate
>>   id  : Sub Γ Γ
>>   _∘_ : Sub Θ Δ → Sub Γ Θ → Sub Γ Δ
>>
>> means
>>
>> postulate
>>   id  : ∀ {Γ} → Sub Γ Γ
>>   _∘_ : ∀ {Γ Δ Θ} → Sub Θ Δ → Sub Γ Θ → Sub Γ Δ
>>
>> (2) A, B and C behaves as (Ty _)-typed terms (their types contain a 
>> dedicated metavariable for each of them),
>> and they are also automatically forall-generalized.
>> For example,
>>
>> postulate
>>   _▹_ : ∀ Γ → Ty Γ → Con
>>   π₁ : Sub Γ (Δ ▹ A) → Sub Γ Δ
>>
>> means
>>   _▹_ : ∀ Γ → Ty Γ → Con
>>   π₁ : ∀{Γ Δ}{A : Ty Δ} → Sub Γ (Δ ▹ A) → Sub Γ Δ
>>
>> (3) The metavariables of generalizable variables are also 
>> automatically generalized.
>> For example,
>>
>> postulate
>>   ass : (σ ∘ δ) ∘ ν ≡ σ ∘ (δ ∘ ν)
>>
>> means
>>
>> postulate
>>   ass   : ∀{Γ Δ Σ Ω}{σ : Sub Σ Ω}{δ : Sub Δ Σ}{ν : Sub Γ Δ}
>>         → ((σ ∘ δ) ∘ ν) ≡ (σ ∘ (δ ∘ ν))
>>
>> (4) The place and order of generalized variables are fixed by the 
>> following rules:
>>
>> A) generalized bindings are placed at the front of the type signature
>> B) the dependencies between the generalized variables are always 
>> respected
>> C) whenever possible, introduce A before B if A < B
>> - for non-metas, A < B if A was declared before B with a 'generalize' 
>> keyword
>> - a meta is smaller than a non-meta
>> - for metas, A < B if A was declared before B with a 'generalize' 
>> keyword. For example, σ : Sub _1 _2 was declared before δ : Sub _3 _4 so
>> instances of _1, _2, _3, _4 are ordered according to the indices.
>>
>> ----
>>
>> The design goals were the following:
>>
>> - make type signatures shorter
>>   - the type schema of generalizable variables helps
>>     to make even more guesses by the type system
>> - avoid accidental generalization
>>   - only the given names are generalized
>>   - the type of generalizable variables are checked
>>     against the given schema, which adds extra safety
>> - make generalized type signatures reliable
>>   (the ordering, and also the naming, see later)
>>
>> Question:
>>
>> - What should be the keyword?
>>   'notation' seems also good for me.
>>   The idea behind 'notation' is that this language construct
>>   makes informal sentences like "Let Γ Δ Θ denote contexts." formal.
>>
>> Plans (not implemented yet)
>>
>> - automatic generalization of record fields and constructor types
>> - allow 'generalize' keyword in submodules and between record fields
>> - make generalizable variables importable?
>> - Name the generalized metavariables also according by the given 
>> generalizable variables. For example, if _1 : Con, then take the first 
>> freely available <Name> : Con, where <Name> was defined by 
>> 'generalize'. If no more names are available, stop with an error message.
>>
>> You can try the current implementation with my fork:
>> https://github.com/divipp/agda
>>
>>
>> For Agda implementors
>> ---------------------
>>
>> The main patch is
>>
>> https://github.com/divipp/agda/commit/d172d1ade15abe26be19311300f7d640563a6a57 
>>
>>
>> It contains several hacks, I'm not sure that this is the right thing 
>> to do:
>> - metavariables of generalizable variables are solved locally during 
>> typechecking of terms and reverted later
>> - generalizable variables are stored in the signature as if they were 
>> introduced by 'postulate'
>>
>> The Generalize.agda file succeeds when I load it into emacs, but fails 
>> if I call Agda directly. Somehow I could not filter out metavariables 
>> introduced by 'generalize', so Agda tries to serialize them.
>>
>> It would great if you could help me to let this feature in.
>>
>>
>> Best Regards,
>>
>> Peter
>> _______________________________________________
>> 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