Zulip Chat Archive

Stream: general

Topic: failing to instantiate, type mismatch


Bruno Bandeira Monteiro (Dec 07 2021 at 15:23):

Hi,
use is giving me a weird error in a particular situation. I'm trying to formalize a proof that a set of axioms is satisfiable. Satisfiability is an existential, so Im starting the proof with use \N. I believe this should type check with my definition of satisfiability:

def satisfiable (A : set Ax) :=  (N : Type*) (S : N  N) (z : N), φ : Ax, φ  A  φ N S z

the goal is satisfiable {Zer, Sur, Dni}. Am I misusing Type* or the existential quantifier?

existsi tells me the expected type is Type, but even though nat has type Type, it tells me there is a type mismatch.

Kevin Buzzard (Dec 07 2021 at 15:24):

Can you post a #mwe? If I cut and paste your code as it stands I get errors (different to the errors you're seeing)

Kevin Buzzard (Dec 07 2021 at 15:25):

i.e. can you post enough so that I can see the error you want me to see, and not random unrelated errors about not knowing what Ax is.

Bruno Bandeira Monteiro (Dec 07 2021 at 15:27):

ok,

import data.set.basic
import data.nat.basic
open nat

def Ax := Π (N : Type*), (N  N)  N  Prop
def satisfiable (A : set Ax) :=  (N : Type*) (S : N  N) (z : N), φ : Ax, φ  A  φ N S z
def Zer := λ (N : Type*) (S : N  N) (z : N),  (x : N), S x  z

lemma ex1 : satisfiable {Zer} :=
begin
  use ,
end

edit : fixed the mwe

Bruno Bandeira Monteiro (Dec 07 2021 at 15:28):

ah sorry, 1 moment

Bruno Bandeira Monteiro (Dec 07 2021 at 15:35):

there

Reid Barton (Dec 07 2021 at 15:56):

use generally provides poor error messages. If you get an error from use, better try:

  refine , _⟩,

and now we get a better error message:

type mismatch at application
  Exists.intro 
term
  
has type
  Type : Type 1
but is expected to have type
  Type u_1 : Type (u_1+1)
state:
 satisfiable {Zer}

Reid Barton (Dec 07 2021 at 15:56):

I suggest not using Type* in situations like this, under an existential, unless you really know what you're doing (and probably even not then).

Reid Barton (Dec 07 2021 at 15:59):

In short the error is because Lean determines the type of a lemma before looking at its definition, and here it thinks the type should be universe-polymorphic because there is nothing to determine the universe variable in satisfiable. But then the proof beginning with only works for a specific universe.

Reid Barton (Dec 07 2021 at 16:05):

Bruno Bandeira Monteiro said:

existsi tells me the expected type is Type, but even though nat has type Type, it tells me there is a type mismatch.

Oh yes, and existsi is also known to give poor errors...

Bruno Bandeira Monteiro (Dec 07 2021 at 16:06):

Ok,
I'm not sure I understood what lean is doing there. But I changed Type* to Type and it worked. I guess using Type* would be unnecessarily general, and maybe I misunderstood what Type* actually is.

Bruno Bandeira Monteiro (Dec 07 2021 at 16:06):

Thanks for the help!

Reid Barton (Dec 07 2021 at 16:06):

def satisfiable (A : set Ax) := ∃ (N : Type*) ... doesn't mean
"A is satisfiable if there is a type N in some universe such that ..."

Reid Barton (Dec 07 2021 at 16:07):

instead, it means
def {u} satisfiable (A : set Ax) := ∃ (N : Type u) ... which is
"for each universe u, A is satisfiable with respect to universe u if there is a type N in universe u such that ..."

Bruno Bandeira Monteiro (Dec 07 2021 at 16:07):

Really? What does it mean then?

Bruno Bandeira Monteiro (Dec 07 2021 at 16:08):

ahh

Bruno Bandeira Monteiro (Dec 07 2021 at 16:09):

Ok, I think I see

Reid Barton (Dec 07 2021 at 16:09):

and then
lemma ex1 : satisfiable {Zer} := ...
was inferred as lemma {u} ex1 : satisfiable.{u} {Zer} := ..., i.e., {Zer} is satisfiable with respect to any universe u, so you had better come up with a type in an arbitrary universe u (which is possible to do, but probably not what you are interested in)

Reid Barton (Dec 07 2021 at 16:11):

In fact Type* is just another way to write Type _, meaning "Lean please figure out what univese goes here". The name Type* can be misleading.

Bruno Bandeira Monteiro (Dec 07 2021 at 16:13):

ah ok,
I thought it was the 'union' of Type n for all n \in \N

Bruno Bandeira Monteiro (Dec 07 2021 at 16:15):

Thanks a lot for the explanations.


Last updated: Dec 20 2023 at 11:08 UTC