123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- Pattern matching
- ----------------
- - equations instead of case
- - completeness:
- IsZero 0 = One
- IsZero (S n) = Zero
- f : (n : Nat) -> IsZero n -> X
- What is a complete set of equations?
- IsZero 0 = One
- IsZero (S 0) = Zero
- IsZero (S (S n)) = Zero
- Pattern matching on inductive families
- --------------------------------------
- - We know how to do it (and recover alf-style pattern matching)
- - We don't know how to translate to core.
- - Conclusion: no pattern matching on inductive families (yet).
- El and different kinds of arrows
- --------------------------------
- We can infer El. We also know how to infer app and lam.
- Problem: we don't have eta equality on the small pi
- lam (app f) != f
- Conclusion: stick with what's in core.
- -- Not allowed
- Rel : Set -> Set1
- Rel A = A -> A -> Prop
- -- Allowed
- data Rel (A : Set) : Set1
- relI : (A -> A -> Prop) -> Rel A
- relE : (A : Set) -> Rel A -> (A -> A -> Prop)
- relE A (relI R) = R
- Universe hierarchy:
- Prop <= Set1
- Set <= Set1 <= Set2, ..
- Note that we DON'T have
- Set : Set1
- Mutually (inductive) recursive definitions
- ------------------------------------------
- Definitions only visible in later defs. For types definition =
- constructors.
- Modules
- -------
- Principle: modules should be simple, static entities.
- - Each file is a module with the same name as the file
- - Modules can be parameterised
- - Modules can be nested
- - Example:
-
- --- [ example/A/Foo.agda ] ---
- module Foo (A:Set)(op : A -> A -> A) where
- f : A -> A
- f x = op x x
- module Bar (e : A) where
- ...
- ------------------------------
- - You can (only) import files
- --- [ example/A/Foo.agda ] ---
- module Foo where
- import .Baz -- look for 'example/A/Baz.agda'
- import B.Baz -- look for '${include_dirs}/B/Baz.agda'
- ------------------------------
- - Modules vs. name spaces
- You can refer to things in a name space using the dot notation:
- X.f -- f from the name space X
- X.Y.g -- g from the name space X.Y
- f -- f from the current name space
- A module is not a name space, but for each non-parameterised module
- there is a corresponing name space.
- Not ok: (Foo Nat (+)).f
- Creating name spaces:
- open H as X -- H is something containing names
- -- (module/name space/struct)
- -- X is the name of a new name space.
- open H as X (f,g) -- only import the names f and g from H
- -- into X
- open H (f,g) -- importing into the current name space
- open H -- import everything into the current name space
- Open is a definition.
- Example:
- let open Foo Nat (+) as FooNat
- open FooNat.Bar 0
- in FooNat.f 3
- Clashes? Complain at use site rather than import site.
- Abstract and private
- private: you can't say the name
- abstract: you don't know the definition
- abstract is a block thing:
- abstract
- Stack : Set
- Stack = List
- empty : Stack
- empty = []
- ...
- Meta variables
- --------------
- Two kinds of meta variables: ? and _
- ? is used for interaction
- _ is used for hidden arguments
- Requirement: _ should be solvable locally
- (block of mutually recursive defs)
- Syntax for hidden arguments
- ---------------------------
- {x:A} -> B
- {x,y : A} -> B
- {A} -> B
- \{x:A} -> t
- \{x} y -> t
- e {e}
- Telescopes in definitions
- -------------------------
- Open question. Suggestion: don't allow.
- Issue: what's the scope.
- Error messages
- --------------
- Idea: Have type checker return proof objects.
- Vision: Interactive/navigatable error messages.
- Issue: How to represent a failed derivation.
- The Plan
- --------
- Jeff leaves AIST beginning of November.
- By then we plan to have a running system (minus emacs interface).
- Notes from the presentation
- ---------------------------
- Opening modules:
- Don't allow opening (into the current name space) and instantiation at
- the same time. Because: how would you print private/non-imported names
- from that module.
- It might be a good idea to separate instantiation and opening. Issue:
- you might want to give explicit import lists when instantiating. This
- is also true for imports (which acts as instantiation for
- non-parameterised modules).
- Top level modules (corresponding to files) should have fully qualified
- names:
- module A.Foo where
- module B where
- The reason for this is that there is no context that explains where the
- module is in the hierarchy, so we should write it down explicitly. For
- the local module it's clear that its full name is A.Foo.B.
- The principle is to make a module hierarchy independant of the actual
- file system (the only place we need to know about the file system is
- when we do import chasing, and then only for technical reasons).
- vim: sts=2 sw=2 tw=75
|