Zulip Chat Archive
Stream: general
Topic: lean 3 unification magic
Kevin Buzzard (May 11 2023 at 11:14):
I'm porting a file and a proof is_sheaf_for.is_amalgamation _ _
which works in Lean 3, is giving me errors on the underscores in lean 4. So I figured that if Lean 3 is solving the underscores with unification then they can't be too hard to solve! But assumption
, library_search
, and apply_instance
don't solve them. What am I missing? Here's a mwe:
import category_theory.sites.cover_lifting
-- set-up
universes w v v₁ v₂ v₃ u u₁ u₂ u₃
noncomputable theory
open category_theory
open opposite
open category_theory.presieve.family_of_elements
open category_theory.presieve
open category_theory.limits
namespace category_theory
variables {C D : Type u} [category.{v} C] [category.{v} D]
variables {A : Type w} [category.{max u v} A] [has_limits A]
variables {J : grothendieck_topology C} {K : grothendieck_topology D}
namespace Ran_is_sheaf_of_cover_lifting
variables {G : C ⥤ D} (hu : cover_lifting J K G) (ℱ : Sheaf J A)
variables {X : A} {U : D} {S : sieve U} (hS : S ∈ K U)
variables {x : S.arrows.family_of_elements ((Ran G.op).obj ℱ.val ⋙ coyoneda.obj (op X))}
variables (hx : x.compatible)
-- the declaration
lemma get_section_is_amalgamation' (Y : structured_arrow (op U) G.op) :
(pulledback_family ℱ S x Y).is_amalgamation (get_section hu ℱ hS hx Y) :=
is_sheaf_for.is_amalgamation _ _
end Ran_is_sheaf_of_cover_lifting
end category_theory
The challenge is to explicitly fill in the two underscores. If it helps, their types are
is_sheaf_for ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj (op X)) (functor_pullback G ⇑(sieve.pullback Y.hom.unop S))
and
⊢ (pulledback_family ℱ S x Y).compatible
Yaël Dillies (May 11 2023 at 11:26):
I assume you've already tried using (_)
to force Lean 4 to find the instances via unification?
Scott Morrison (May 11 2023 at 11:28):
#print get_section_is_amalgamation'
Scott Morrison (May 11 2023 at 11:28):
It gives you a usable term, but with auto-generated names that won't be the same in Lean 4.
Scott Morrison (May 11 2023 at 11:29):
But possibly you can just find their names using whatsnew in
on the definition of getSection
.
Kevin Buzzard (May 11 2023 at 11:31):
Yaël Dillies said:
I assume you've already tried using
(_)
to force Lean 4 to find the instances via unification?
nice idea, but doesn't work.
Kevin Buzzard (May 11 2023 at 11:49):
Hmm. In Lean 3, #print prefix category_theory.Ran_is_sheaf_of_cover_lifting.get_section
just after the def of get_section
gives me category_theory.Ran_is_sheaf_of_cover_lifting.get_section._proof_n
for 1<=n<=6, and in Lean 4 whatsnew in
just before the def of getSection
gives me CategoryTheory.RanIsSheafOfCoverLifting.getSection.proof_n
for a meagre 1 <= n <= 2, so we're being short changed by Lean 4 here. The declaration in Lean 3 is
def get_section (Y : structured_arrow (op U) G.op) : X ⟶ ℱ.val.obj Y.right :=
begin
let hom_sh := whisker_right ((Ran.adjunction A G.op).counit.app ℱ.val) (coyoneda.obj (op X)),
have S' := (K.pullback_stable Y.hom.unop hS),
have hs' := ((hx.pullback Y.3.unop).functor_pullback G).comp_presheaf_map hom_sh,
exact (ℱ.2 X _ (hu.cover_lift S')).amalgamate _ hs'
end
and it seems to me that the lets and haves are being turned into hidden proofs in the namespace in lean 3 but not lean 4. I've filled in one of the holes by pasting the definition of hs'
and hom_sh
into the hole.
Kevin Buzzard (May 11 2023 at 11:55):
ha ha no it seems like Lean 3 is in fact just over-excited:
example : @category_theory.Ran_is_sheaf_of_cover_lifting.get_section._proof_1 =
@category_theory.Ran_is_sheaf_of_cover_lifting.get_section._proof_2 := rfl
example : @category_theory.Ran_is_sheaf_of_cover_lifting.get_section._proof_1 =
@category_theory.Ran_is_sheaf_of_cover_lifting.get_section._proof_3 := rfl
example : @category_theory.Ran_is_sheaf_of_cover_lifting.get_section._proof_1 =
@category_theory.Ran_is_sheaf_of_cover_lifting.get_section._proof_4 := rfl
Mauricio Collares (May 11 2023 at 12:08):
Indeed, the two holes can be filled with ℱ.2 X _ (hu.cover_lift S')
and hs'
if the appropriate definitions are in context (i.e. copy and pasting the contents of def get_section
and replacing amalgamate
by is_amalgamation
in the last line is a valid proof of get_section_is_amalgamation
)
Kevin Buzzard (May 11 2023 at 12:18):
Thanks! We've got it working locally now. The remaining question is why lean 4 can't solve the goals via unification.
Mauricio Collares (May 11 2023 at 14:47):
It can solve them, it you replace the let
and have
s in amalgamate
by letI
and haveI
s
Mauricio Collares (May 11 2023 at 14:50):
Curiously, if you print the Lean 3 term for amalgamate
, you can see the have
s are inlined but the let
is not, and yet unification does not care.
Kevin Buzzard (May 11 2023 at 15:12):
Should I inline the let and haves in the declaration in Lean 4 then? I have no idea about this kind of internal representation stuff.
Eric Wieser (May 11 2023 at 15:29):
This is partly a mathport translation issue; tactichave
in Lean3 is Lean4's haveI
, but mathport translates it to lean4's have
which is Lean3's term have
.
Last updated: Dec 20 2023 at 11:08 UTC