[Agda] new generalize feature, first version

Martin Escardo m.escardo at cs.bham.ac.uk
Thu Mar 29 18:47:20 CEST 2018


I like this, Peter! It should simplify a lot of my code. M.

On 29/03/18 13:13, divipp at gmail.com 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

-- 
Martin Escardo
http://www.cs.bham.ac.uk/~mhe


More information about the Agda mailing list