This PR changes how generalized field notation ("dot notation") resolves
the function. The new resolution rule is that if `x : S`, then `x.f`
resolves the name `S.f` relative to the root namespace (hence it now
affected by `export` and `open`). Breaking change: aliases now resolve
differently. Before, if `x : S`, and if `S.f` is an alias for `S'.f`,
then `x.f` would use `S'.f` and look for an argument of type `S'`. Now,
it looks for an argument of type `S`, which is more generally useful
behavior. Code making use of the old behavior should consider defining
`S` or `S'` in terms of the other, since dot notation can unfold
definitions during resolution.
This also fixes a bug in explicit-mode generalized field notation
(`@x.f`) where `x` could be passed as the wrong argument. This was not a
bug for explicit-mode structure projections.
Closes #3031. Addresses the `Function` namespace issue in #1629.
54 lines
1.2 KiB
Text
54 lines
1.2 KiB
Text
/-- A `Vec` is just a `List α` of statically known size -/
|
||
def Vec (α : Type _) (n : Nat) : Type _
|
||
:= Fin n → α
|
||
|
||
abbrev TypeVec : Nat → Type _
|
||
:= Vec (Type _)
|
||
|
||
/-- A dependent vector is a heterogeneous list of statically known size -/
|
||
def DVec {n : Nat} (αs : TypeVec n) : Type _
|
||
:= (i : Fin n) → (αs i)
|
||
|
||
/-- A vector that repeats a single element `a` -/
|
||
def Vec.const {α : Type _} (a : α) (n : Nat) : Vec α n
|
||
:= fun _ => a
|
||
|
||
/- `Vec` is defeq to a `DVec` with constant type -/
|
||
unif_hint (α : Type _) (n : Nat) where
|
||
|- Vec α n =?= DVec (Vec.const α n)
|
||
|
||
namespace DVec
|
||
def hd {n : Nat} {αs : TypeVec (n+1)} (v : DVec αs) : (αs 0)
|
||
:= v 0
|
||
end DVec
|
||
|
||
namespace Vec
|
||
export DVec (hd)
|
||
end Vec
|
||
|
||
def ts : TypeVec 1 := Vec.const Nat 1
|
||
|
||
-- works
|
||
example (v : DVec ts) : Nat :=
|
||
v.hd
|
||
|
||
-- works
|
||
example (v : Vec Nat 1) : Nat :=
|
||
DVec.hd v
|
||
|
||
#check @Vec.hd
|
||
|
||
-- Does not work: Aliases find that `v` could be the `TypeVec` argument since `TypeVec` is an abbrev for `Vec`.
|
||
/--
|
||
error: application type mismatch
|
||
@Vec.hd ?_ v
|
||
argument
|
||
v
|
||
has type
|
||
Vec Nat 1 : Type
|
||
but is expected to have type
|
||
TypeVec (?_ + 1) : Type (_ + 1)
|
||
-/
|
||
#guard_msgs in set_option pp.mvars false in
|
||
example (v : Vec Nat 1) : Nat :=
|
||
v.hd
|