Given expressions es := #[e_1, e_2, ..., e_n], execute k with the
free variables (x_1 : A_1) (x_2 : A_2 [x_1]) ... (x_n : A_n [x_1, ... x_{n-1}]).
Moreover,
- type of
e_1is definitionally equal toA_1, - type of
e_2is definitionally equal toA_2[e_1]. - ...
- type of
e_nis definitionally equal toA_n[e_1, ..., e_{n-1}].
This method tries to avoid the creation of new free variables. For example, if e_i is a
free variable x_i and it is not a let-declaration variable, and its type does not depend on
previous e_js, the method will just use x_i.
The telescope x_1 ... x_n can be used to create lambda and forall abstractions.
Moreover, for any type correct lambda abstraction f constructed using mkForall #[x_1, ..., x_n] ...,
The application f e_1 ... e_n is also type correct.
The kabstract method is used to "locate" and abstract forward dependencies.
That is, an occurrence of e_i in the of e_j for j > i.
The method checks whether the abstract types A_i are type correct. Here is an example
where generalizeTelescope fails to create the telescope x_1 ... x_n.
Assume the local context contains (n : Nat := 10) (xs : Vec Nat n) (ys : Vec Nat 10) (h : xs = ys).
Then, assume we invoke generalizeTelescope with es := #[10, xs, ys, h]
A type error is detected when processing h's type. At this point, the method had successfully produced
(x_1 : Nat) (xs : Vec Nat n) (x_2 : Vec Nat x_1)
and the type for the new variable abstracting h is xs = x_2 which is not type correct.
Equations
- One or more equations did not get rendered due to their size.