lean4-htt/tests/lean/run/DVec.lean
Kyle Miller cd909b0a98
fix: when pretty printing constant names, do not use aliases from "non-API exports" (#5689)
This PR adjusts the way the pretty printer unresolves names. It used to
make use of all `export`s when pretty printing, but now it only uses
`export`s that put names into parent namespaces (heuristic: these are
"API exports" that are intended by the library author), rather than
"horizontal exports" that put the names into an unrelated namespace,
which the dot notation feature in #6189 now incentivizes.

Closes the already closed #2524
2024-12-10 17:50:50 +00:00

54 lines
1.2 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-- 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
@DVec.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