Zulip Chat Archive
Stream: new members
Topic: failed to synthesize CategoryStruct
Shanghe Chen (Jun 16 2024 at 16:07):
Hi in an exercise related to bundle category and bicategory I reach the following error:
import Mathlib.CategoryTheory.Functor.Basic
import Mathlib.CategoryTheory.ConcreteCategory.Bundled
noncomputable section
set_option autoImplicit false
universe w v u
open CategoryTheory Functor
instance (H: Bundled Category.{w, v}): Category.{w, v} H := H.str
structure BBC1 (B : Type u) where
Hom : B → B → Type v
homCategory : ∀ a b : B, Category.{w} (Hom a b)
testInst {a b: B} (f: Hom a b) : f ⟶ f
def test1 {B: Type u} (bc: ∀ X Y: B, Bundled Category.{w, v}) : BBC1 B where
Hom X Y := bc X Y
homCategory X Y := by infer_instance
testInst f := 𝟙 f
structure BBC2 (B : Type u) extends Quiver.{v+1} B where
homCategory : ∀ a b : B, Category.{w} (Hom a b)
testInst (a b: B) (f: Hom a b) : f ⟶ f
def test2 {B: Type u} (bc: ∀ X Y: B, Bundled Category.{w, v}) : BBC2 B where
Hom X Y := bc X Y
-- here cannot infer_instance
homCategory X Y := (bc X Y).str
/-
failed to synthesize
CategoryStruct.{w, v} (X ⟶ Y)
use `set_option diagnostics true` to get diagnostic information
-/
testInst X Y f := 𝟙 f
def test3 {B: Type u} (b : ∀ X Y : B, Type v) (bc: ∀ X Y: B, Category.{w, v} (b X Y)) : BBC2 B where
Hom X Y := b X Y
-- here cannot infer_instance
homCategory X Y := (bc X Y)
testInst X Y f := 𝟙 f
Shanghe Chen (Jun 16 2024 at 16:09):
both test1 and test3 work in the above code, whereas test2 failed with error
failed to synthesize
CategoryStruct.{w, v} (X ⟶ Y)
use `set_option diagnostics true` to get diagnostic information
I am not getting why test2 failed to synthesize the instance, which I think it should be from homCategory as test3
Shanghe Chen (Jun 16 2024 at 16:12):
In the same time both test2 and test3 fail to use infer_instance like test1. I cannot get why infer_instance failed in these two def too
Shanghe Chen (Jun 16 2024 at 16:15):
The only difference between BBC1 and BBC2 seems to be BBC2 defines Hom via extending Quiver while BBC1 defines it directly as a field.
Shanghe Chen (Jun 16 2024 at 16:28):
Setting set_option diagnostics true as the error suggests gives
[reduction] unfolded declarations (max: 29, num: 1): ▼
Quiver.Hom ↦ 29
[reduction] unfolded instances (max: 29, num: 2): ▼
Category.toCategoryStruct ↦ 29
CategoryStruct.toQuiver ↦ 21
use `set_option diagnostics.threshold <num>` to control threshold for reporting counters
and I still have no clue on it
Shanghe Chen (Jun 17 2024 at 02:51):
I found that the following workaround using test3 for test2
def test4 {B: Type u} (bc: ∀ X Y: B, Bundled Category.{w, v}) : BBC2 B :=
test3 (fun X Y => (bc X Y).α)
(fun X Y => (bc X Y).str)
Shanghe Chen (Jun 17 2024 at 05:36):
Also it can be done with
def test2 {B: Type u} (bc: ∀ X Y: B, Bundled Category.{w, v}) : BBC2 B where
Hom X Y := (bc X Y).α
-- here cannot infer_instance
homCategory X Y := (bc X Y).str
testInst X Y f := @CategoryStruct.id (bc X Y) (bc X Y).str.toCategoryStruct f
the .toCategoryStruct part cannot be omitted. Being unable to synthesize it as typeclass still kind of weird to me
Last updated: May 02 2025 at 03:31 UTC