Zulip Chat Archive
Stream: new members
Topic: failed to use `unit`
Alex Zhang (Jul 24 2021 at 16:16):
What does using unit
fail in this case?
universe u
example : ∃ (I : Type u), true :=
begin
use unit,
end
error failed to instantiate goal with unit
Alex Zhang (Jul 24 2021 at 16:17):
universe u
example : ∃ (I : Type u), true :=
begin
refine ⟨ unit, _⟩,
end
error :
type mismatch at application
Exists.intro unit
term
unit
has type
Type : Type 1
but is expected to have type
Type u : Type (u+1)
Eric Rodriguez (Jul 24 2021 at 16:19):
punit
is the universe polymorphic version of unit
Alex Zhang (Jul 24 2021 at 16:20):
I found
example : ∃ (I : Type*), true :=
begin
refine ⟨ (unit : Type 0), _⟩,
end
is fine.
Alex Zhang (Jul 24 2021 at 16:21):
The thing I don't understand is, in the second error message, I thought Type : Type 1
should be able to match Type u : Type (u+1)
. Can't u
be 0
?
Eric Rodriguez (Jul 24 2021 at 16:22):
the previous version is kind of ∀ u, ∃ I : Type u, true
, whilst the second is more like ∃ u, ∃ I : Type u, true
; the universe is a "metavariable" in the Type*
example and is allowed to be filled in to what's needed later
Eric Rodriguez (Jul 24 2021 at 16:24):
okay, but actually it gets more interesting; do it as a lemma/theorem
and it fails again, whilst as a def
it's fine. I'm not too sure why that is.
Alex Zhang (Jul 24 2021 at 16:24):
Eric Rodriguez said:
okay, but actually it gets more interesting; do it as a
lemma/theorem
and it fails again, whilst as adef
it's fine. I'm not too sure why that is.
Yeah, I also found this! That is confusing.
Alex Zhang (Jul 24 2021 at 16:27):
I guess punit
does not have enough APIs, lean even doesn't know matrix punit punit ℚ
has one..
Eric Wieser (Jul 24 2021 at 16:39):
example
behaves like a def
Eric Wieser (Jul 24 2021 at 16:39):
In that it's type is affected by the implementation
Eric Wieser (Jul 24 2021 at 16:40):
Whereas lemmas the type is known before looking at the proof
Eric Wieser (Jul 24 2021 at 16:40):
Which is why def trivial' := trivial
works fine, but lemma trivial' := trivial
fails
Eric Rodriguez (Jul 24 2021 at 16:44):
so in a lemma
Type*
gets instantly evaluated to Type u
for some u
, whilst in a def
it becomes Type ?u_1
, and gets filled in by the proof?
Eric Wieser (Jul 24 2021 at 16:54):
Type *
means "guess the universe level based on how I use it"
Eric Wieser (Jul 24 2021 at 16:56):
So essentially your description is correct, but lemma fills in the universe metavariables when it reaches the :=
Last updated: Dec 20 2023 at 11:08 UTC