Zulip Chat Archive

Stream: general

Topic: category theory universe issue?


Kevin Buzzard (Apr 14 2019 at 18:15):

question in progress -- ignore for now unless you're Scott

I am using a slightly modified mathlib but I am hoping this isn't the issue [update: it is]. The following innocuous-looking code:

import topology.opens
import category_theory.functor
import category_theory.instances.Top

open category_theory.instances

universes v u

variables {α : Type*} {β : Type*} [topological_space α] [topological_space β]
{f : α  β}

open topological_space

theorem is_open_map_of_open {α : Type*} [topological_space α] {s : set α} (hs : _root_.is_open s) :
  is_open_map (subtype.val : {x // x  s}  α) := begin
  rintros _ t, ht, rfl, convert is_open_inter _ _ _ ht hs,
  rw set.image_preimage_eq_inter_range,
  convert rfl,
  exact (set.range_coe_subtype s).symm
end

def is_open_map.map (h : is_open_map f) : opens α  opens β :=
λ U, f '' U.1, h U.1 U.2

def functor.is_open_map.map (h : is_open_map f) : opens α  opens β :=
{ obj := is_open_map.map h,
  map := λ X Y hXY x a, ha, ha', begin rw ha', use a, exact hXY ha, rfl end,
  map_id' := λ _, rfl,
  map_comp' := λ _ _ _ _ _, rfl }

def inclusion (X : Top.{v}) (U : opens.{v} X) : opens.{v} ({x // x  U.val})  opens.{v} X :=
functor.is_open_map.map.{v v} (is_open_map_of_open U.2)

doesn't work. First I show that the inclusion of an open set is an open map. Then I define a function opens alpha -> opens beta from an open map alpha -> beta. Then I beef it up into a functor. Then I try and apply it in the situation of an open map. I get an error in the def of inclusion, a type mismatch hundreds of lines long because pp.all has been switched on by Lean.

The two terms look identical other than in one small place: diff output is

<     (@topological_space.opens.opens_category X)
---
>     (@category_theory.preorder_category
>        (@topological_space.opens
>           (@coe_sort category_theory.instances.Top (@category_theory.bundled.has_coe_to_sort topological_space) X)
>           (category_theory.instances.topological_space_unbundled X))
>        (@partial_order.to_preorder
>           (@topological_space.opens
>              (@coe_sort category_theory.instances.Top (@category_theory.bundled.has_coe_to_sort topological_space) X)
>              (category_theory.instances.topological_space_unbundled X))
>           (@topological_space.opens.partial_order
>              (@coe_sort category_theory.instances.Top (@category_theory.bundled.has_coe_to_sort topological_space) X)
>              (category_theory.instances.topological_space_unbundled X))))

I then attempt to verify that these terms are the same:

def inclusion (X : Top.{v}) (U : opens X) : opens ({x // x  U.val})  opens X :=
--functor.is_open_map.map (is_open_map_of_open U.2)
begin
have H :     (@topological_space.opens.opens_category X) =
     (@category_theory.preorder_category
        (@topological_space.opens
           (@coe_sort category_theory.instances.Top (@category_theory.bundled.has_coe_to_sort topological_space) X)
           (category_theory.instances.topological_space_unbundled X))
        (@partial_order.to_preorder
           (@topological_space.opens
              (@coe_sort category_theory.instances.Top (@category_theory.bundled.has_coe_to_sort topological_space) X)
              (category_theory.instances.topological_space_unbundled X))
           (@topological_space.opens.partial_order
              (@coe_sort category_theory.instances.Top (@category_theory.bundled.has_coe_to_sort topological_space) X)
              (category_theory.instances.topological_space_unbundled X)))),

exact functor.is_open_map.map (is_open_map_of_open U.2),
end

and this time the error (in the definition of H) is:

type mismatch at application
  opens.opens_category = category_theory.preorder_category (opens ↥X)
term
  category_theory.preorder_category (opens ↥X)
has type
  category_theory.category.{0 v+1}
    (@topological_space.opens.{v}
       (@coe_sort.{v+2 v+2} category_theory.instances.Top.{v}
          (@category_theory.bundled.has_coe_to_sort.{v+1 v+1} topological_space.{v})
          X)
       (category_theory.instances.topological_space_unbundled.{v} X)) : Type v
but is expected to have type
  category_theory.category.{v+1 (max (v+1) 1)}
    (@topological_space.opens.{v}
       (@coe_sort.{v+2 v+2} category_theory.instances.Top.{v}
          (@category_theory.bundled.has_coe_to_sort.{v+1 v+1} topological_space.{v})
          X)
       (category_theory.instances.topological_space_unbundled.{v} X)) : Type (v+1)

This time Lean seems to have switched universes on! The two terms are equal except for universes.

Is this the sort of thing I just have to deal with in category theory? @Reid Barton ?

Kevin Buzzard (Apr 14 2019 at 18:21):

Oh boggle I just checked with a vanilla mathlib and category_theory.instances.Top isn't there. That'll teach me to listen to Scott.

Kevin Buzzard (Apr 14 2019 at 18:26):

@Scott Morrison is this something to do with your modification category_theory.instances.Top of category_theory.instances.topological_spaces in your branch? I switched back to topological_spaces and now I see ulifts and plifts when I try to define the functor.

Kevin Buzzard (Apr 14 2019 at 18:31):

This is all something to do with turning hom sets from Type v into Prop.

Kevin Buzzard (Apr 14 2019 at 18:34):

Sorry, this is an issue with some of Scott's work in progress; I'll take it to github. I can get this to with in regular mathlib.

Scott Morrison (Apr 14 2019 at 22:46):

Sorry! :-) There is a big queue of PRs in category theory at the moment, making things a bit confusing.


Last updated: Dec 20 2023 at 11:08 UTC