diff --git a/database/data/categories/Ab.yaml b/database/data/categories/Ab.yaml index 6ce6a016..95490952 100644 --- a/database/data/categories/Ab.yaml +++ b/database/data/categories/Ab.yaml @@ -3,8 +3,9 @@ name: category of abelian groups notation: $\Ab$ objects: abelian groups morphisms: group homomorphisms -description: This is the prototype of an abelian category. +description: This category is the prototype of an abelian category. It is the special case of $R{-}\Mod$ where $R = \IZ$. nlab_link: https://ncatlab.org/nlab/show/Ab +parent: R-Mod_non_ss tags: - algebra @@ -15,31 +16,15 @@ related: - FinAb - FreeAb - Grp - - R-Mod - TorsAb - TorsFreeAb -satisfied_properties: - - property: locally small - proof: There is a forgetful functor $\Ab \to \Set$ and $\Set$ is locally small. - - - property: abelian - proof: This is standard, see Mac Lane, Ch. VIII. - label: ab_abelian - - - property: finitary algebraic - proof: Take the algebraic theory of a commutative group. +satisfied_properties: [] unsatisfied_properties: - - property: skeletal - proof: This is trivial. - - property: split abelian proof: The short exact sequence $0 \xrightarrow{} \IZ \xrightarrow{p} \IZ \xrightarrow{} \IZ/p \xrightarrow{} 0$ does not split. - - property: CSP - proof: The canonical homomorphism $\bigoplus_{n \geq 0} \IZ \to \prod_{n \geq 0} \IZ$ is not surjective, hence no epimorphism. - special_objects: initial object: description: trivial group @@ -53,4 +38,4 @@ special_objects: special_morphisms: epimorphisms: description: surjective morphisms - proof: 'For the non-trivial direction, if $f : A \to B$ is an epimorphism, then $p \circ f = 0$ for the projection $p : B \to B/f(A)$ implies that $p = 0$, so that $B = f(A)$.' + proof: 'For the non-trivial direction, if $f : A \to B$ is an epimorphism, then $p \circ f = 0$ for the projection $p : B \to B/f(A)$ implies that $p = 0$, so that $B = f(A)$.' diff --git a/database/data/categories/Ab_fg.yaml b/database/data/categories/Ab_fg.yaml index 41588e5b..daa552fa 100644 --- a/database/data/categories/Ab_fg.yaml +++ b/database/data/categories/Ab_fg.yaml @@ -3,7 +3,7 @@ name: category of finitely generated abelian groups notation: $\Ab_{\fg}$ objects: finitely generated abelian groups morphisms: group homomorphisms -description: null +description: This is the full subcategory of $\Ab$ that consists of the finitely generated abelian groups. nlab_link: https://ncatlab.org/nlab/show/finitely+generated+module tags: diff --git a/database/data/categories/Alg(R).yaml b/database/data/categories/Alg(R).yaml index 41b81a5d..ab5ecf39 100644 --- a/database/data/categories/Alg(R).yaml +++ b/database/data/categories/Alg(R).yaml @@ -3,7 +3,7 @@ name: category of algebras notation: $\Alg(R)$ objects: algebras over a commutative ring $R \neq 0$ morphisms: maps preserving the ring and module structure -description: This is a generalization of the category of rings, which we get for $R = \IZ$. We assume our rings (and algebras) to be unital. For $R = 0$ we would get the trivial category, which is why we exclude this here. +description: This category is a generalization of the category of rings, which we get for $R = \IZ$. We assume our rings (and algebras) to be unital. For $R = 0$ we would get the trivial category, which is why we exclude this here. nlab_link: https://ncatlab.org/nlab/show/Alg tags: @@ -12,7 +12,6 @@ tags: related: - CAlg(R) - R-Mod - - Ring satisfied_properties: - property: locally small @@ -25,9 +24,7 @@ satisfied_properties: proof: 'If $f : 0 \to A$ is an algebra homomorphism, then $A$ satisfies $1=f(1)=f(0)=0$, so that $A=0$.' - property: disjoint finite products - proof: One can take the same proof as for $\Ring$. - references: - - ring_disjoint_finite_products + proof: 'Let $A,B$ be two $R$-algebras. To show that $A \sqcup_{A \times B} B$ is trivial, let $T$ be an $R$-algebra which admits homomorphisms $f : A \to T$, $g : B \to T$ with $f(p_1(a,b))=g(p_2(a,b))$ for all $(a,b) \in A \times B$, i.e. $f(a)=g(b)$. Applying this to $a=1$, $b=0$ yields $1=0$ in $T$. Hence, $T = 0$.' - property: Malcev proof: This follows in the same way as for $\Grp$, see also Example 2.2.5 in Malcev, protomodular, homological and semi-abelian categories. @@ -54,9 +51,8 @@ unsatisfied_properties: proof: 'See MO/509552: Consider the forgetful functor $U : \Alg(R) \to \Set$ and the relation $S \subseteq U^2$ defined by $S(A) \coloneqq \{(a,b) \in U(A)^2 : ab = a^2\}$. Both are representable: $U$ by $R[X]$ and $S$ by $R \langle X,Y \rangle / \langle XY-X^2 \rangle$. It is clear that $S$ is reflexive, but not symmetric.' - property: coregular - proof: 'We just need to tweak the proof for $\Ring$. Since $R \neq 0$, there is an infinite field $K$ with a homomorphism $R \to K$. Since $K$ is infinite, we may choose some $\lambda \in K \setminus \{0,1\}$. Let $B \coloneqq M_2(K)$ and $A \coloneqq K \times K$. Then $A \to B$, $(x,y) \mapsto \diag(x,y)$ is a regular monomorphism: A direct calculation shows that a matrix is diagonal iff it commutes with $M \coloneqq \bigl(\begin{smallmatrix} 1 & 0 \\ 0 & \lambda \end{smallmatrix}\bigr)$, so that $A \to B$ is the equalizer of the identity $B \to B$ and the conjugation $B \to B$, $X \mapsto M X M^{-1}$. Consider the homomorphism $A \to K$, $(a,b) \mapsto a$. We claim that $K \to K \sqcup_A B$ is not a monomorphism, because in fact, the pushout $K \sqcup_A B$ is zero: Since $A \to K$ is surjective with kernel $0 \times K$, the pushout is $B/\langle 0 \times K \rangle$, which is $0$ because $B$ is simple (proof) or via a direct calculation with elementary matrices.' - references: - - ring_not_coregular + proof: 'Since $R \neq 0$, there is an infinite field $K$ with a homomorphism $R \to K$. Since $K$ is infinite, we may choose some $\lambda \in K \setminus \{0,1\}$. Let $B \coloneqq M_2(K)$ and $A \coloneqq K \times K$. Then $A \to B$, $(x,y) \mapsto \diag(x,y)$ is a regular monomorphism: A direct calculation shows that a matrix is diagonal iff it commutes with $M \coloneqq \bigl(\begin{smallmatrix} 1 & 0 \\ 0 & \lambda \end{smallmatrix}\bigr)$, so that $A \to B$ is the equalizer of the identity $B \to B$ and the conjugation $B \to B$, $X \mapsto M X M^{-1}$. Consider the homomorphism $A \to K$, $(a,b) \mapsto a$. We claim that $K \to K \sqcup_A B$ is not a monomorphism, because in fact, the pushout $K \sqcup_A B$ is zero: Since $A \to K$ is surjective with kernel $0 \times K$, the pushout is $B/\langle 0 \times K \rangle$, which is $0$ because $B$ is simple (proof) or via a direct calculation with elementary matrices.' + label: alg_not_coregular - property: regular quotient object classifier proof: We may copy the proof for $\CAlg(R)$ (since the proof there did not use that $P$ is commutative). Alternatively, any regular quotient object classifier in $\Alg(R)$ would produce one in the reflective subcategory $\CAlg(R)$ by Lemma 1 here (dualized). @@ -65,7 +61,7 @@ unsatisfied_properties: - property: cocartesian cofiltered limits proof: >- - Consider the ring $A = R[X]$ and the sequence of rings $B_n = R[Y]/(Y^{n+1})$ with projections $B_{n+1} \to B_n$, whose limit is $R[[Y]]$. Every element in the coproduct of rings $R[X] \sqcup R[[Y]]$ has a finite "free product" length. Now consider the elements + Consider the algebra $A = R[X]$ and the sequence of algebras $B_n = R[Y]/(Y^{n+1})$ with projections $B_{n+1} \to B_n$, whose limit is $R[[Y]]$. Every element in the coproduct of algebras $R[X] \sqcup R[[Y]]$ has a finite "free product" length. Now consider the elements $$w_n = (1 + XY) (1+XY^2) \cdots (1+X Y^n) \in A \sqcup B_n.$$ Because of $w_n \equiv w_{n-1} \bmod Y^n$ these form an element $w \in \lim_n (A \sqcup B_n)$. Expanding $w_n$, the longest term is $XY XY^2 \cdots X Y^n$ of "free product" length $2n$, which is unbounded. @@ -73,15 +69,13 @@ unsatisfied_properties: proof: We already know that $\CAlg(R)$ does not have this property. Now apply the contrapositive of the dual of Lemma 2 here to the forgetful functor $\CAlg(R) \to \Alg(R)$. It preserves epimorphisms by MSE/5133488. - property: effective cocongruences - proof: 'The counterexample is similar to the one for $\Ring$: Let $X \coloneqq R[p] / (p^2-p)$ with cocongruence $E \coloneqq R \langle p, q \rangle / (p^2-p, q^2-q, pq-q, qp-p)$.' - references: - - ring_no_effective_cocongruences + proof: 'MO/510744 presents a counterexample for $\Ring$, and it can be easily generalized to $\Alg(R)$: Let $X \coloneqq R[p] / (p^2-p)$ with cocongruence $E \coloneqq R \langle p, q \rangle / (p^2-p, q^2-q, pq-q, qp-p)$.' special_objects: initial object: description: $R$ terminal object: - description: trivial algebra + description: zero algebra coproducts: description: see MSE/625874 products: diff --git a/database/data/categories/BG.yaml b/database/data/categories/BG.yaml new file mode 100644 index 00000000..e1ecdf50 --- /dev/null +++ b/database/data/categories/BG.yaml @@ -0,0 +1,51 @@ +id: BG +name: delooping of a group +notation: $BG$ +objects: a single object $*$ +morphisms: the elements of $G$ +description: Every group $G$ yields a groupoid $BG$ with a single object $*$, morphisms given by the elements of $G$, and composition given by the group operation. We assume that $G$ is non-trivial, since otherwise we get the trivial category. +nlab_link: https://ncatlab.org/nlab/show/delooping#delooping_of_a_group_to_a_groupoid + +tags: + - algebra + - category theory + +related: + - BN + +satisfied_properties: + - property: small + proof: This is trivial. + + - property: groupoid + proof: This is trivial. + + - property: core-connected + proof: The category has exactly one object. + + - property: skeletal + proof: The category has exactly one object. + +unsatisfied_properties: + - property: thin + proof: This is because $G$ is not trivial, so there are at least two morphisms $* \rightrightarrows *$. + +undecidable_properties: + - property: essentially countable + proof: This holds if and only if $G$ is countable. + + - property: countable + proof: This holds if and only if $G$ is countable. + + - property: finite + proof: This holds if and only if $G$ is finite. + + - property: locally finite + proof: This holds if and only if $G$ is finite. + + - property: essentially finite + proof: This holds if and only if $G$ is finite. + +special_objects: {} + +special_morphisms: {} diff --git a/database/data/categories/BG_c.yaml b/database/data/categories/BG_c.yaml index a5b31312..5192d70e 100644 --- a/database/data/categories/BG_c.yaml +++ b/database/data/categories/BG_c.yaml @@ -1,39 +1,26 @@ id: BG_c name: delooping of an infinite countable group notation: $BG$ -objects: a single object +objects: a single object $*$ morphisms: the elements of an infinite countable group $G$ -description: Every group $G$ yields a groupoid $BG$ with a single object $*$, morphisms given by the elements of $G$, and composition given by the group operation. In this example, we consider the case of an infinite countable group $G$ (such as $G = \IZ$). -nlab_link: https://ncatlab.org/nlab/show/delooping +description: This is the special case of $BG$ where $G$ is an infinite countable group $G$ (such as $G = \IZ$). +nlab_link: https://ncatlab.org/nlab/show/delooping#delooping_of_a_group_to_a_groupoid +parent: BG tags: - algebra - category theory related: - - BG_f - - BG_u - BN satisfied_properties: - - property: small - proof: This is trivial. - - - property: groupoid - proof: This is trivial. - - - property: core-connected - proof: The category has exactly one object. - - - property: skeletal - proof: The category has exactly one object. - - property: countable - proof: This is because $G$ is countable. + proof: This is because $G$ is countable by assumption. unsatisfied_properties: - property: locally finite - proof: This is because we choose $G$ to be infinite. + proof: This is because $G$ is infinite by assumption. special_objects: {} diff --git a/database/data/categories/BG_f.yaml b/database/data/categories/BG_f.yaml index 5bf6633e..5a1ca411 100644 --- a/database/data/categories/BG_f.yaml +++ b/database/data/categories/BG_f.yaml @@ -1,39 +1,24 @@ id: BG_f name: delooping of a non-trivial finite group notation: $BG$ -objects: a single object +objects: a single object $*$ morphisms: the elements of a non-trivial finite group $G$ -description: Every group $G$ yields a groupoid $BG$ with a single object $*$, morphisms given by the elements of $G$, and composition given by the group operation. In this example, we consider the case of a non-trivial finite group $G$ (such as $G = C_2$). -nlab_link: https://ncatlab.org/nlab/show/delooping +description: This is the special case of $BG$ where $G$ is a non-trivial finite group $G$ (such as $G = C_2$). +nlab_link: https://ncatlab.org/nlab/show/delooping#delooping_of_a_group_to_a_groupoid +parent: BG tags: - algebra - category theory related: - - BG_c - - BG_u - BN satisfied_properties: - property: finite - proof: This is trivial. + proof: This is because $G$ is finite by assumption. - - property: small - proof: This is trivial. - - - property: groupoid - proof: This is trivial. - - - property: core-connected - proof: The category has exactly one object. - - - property: skeletal - proof: The category has exactly one object. - -unsatisfied_properties: - - property: trivial - proof: This is trivial. +unsatisfied_properties: [] special_objects: {} diff --git a/database/data/categories/BG_u.yaml b/database/data/categories/BG_u.yaml index b90f5df5..a8c4ff7b 100644 --- a/database/data/categories/BG_u.yaml +++ b/database/data/categories/BG_u.yaml @@ -1,39 +1,27 @@ id: BG_u name: delooping of an infinite uncountable group notation: $BG$ -objects: a single object +objects: a single object $*$ morphisms: the elements of an infinite uncountable group $G$ -description: Every group $G$ yields a groupoid $BG$ with a single object $*$, morphisms given by the elements of $G$, and composition given by the group operation. In this example, we consider the case of an uncountable group $G$ (such as $G = \IR$). -nlab_link: https://ncatlab.org/nlab/show/delooping +description: This is the special case of $BG$ where $G$ is an infinite uncountable group $G$ (such as $G = \IR$). +nlab_link: https://ncatlab.org/nlab/show/delooping#delooping_of_a_group_to_a_groupoid +parent: BG tags: - algebra - category theory related: - - BG_f - - BG_c - BN -satisfied_properties: - - property: small - proof: This is trivial. - - - property: groupoid - proof: This is trivial. - - - property: core-connected - proof: The category has exactly one object. - - - property: skeletal - proof: The category has exactly one object. +satisfied_properties: [] unsatisfied_properties: - property: locally finite - proof: This is because we choose $G$ to be infinite. + proof: This is because $G$ is infinite by assumption. - property: essentially countable - proof: This is because we choose $G$ to be uncountable. + proof: This is because $G$ is uncountable by assumption. special_objects: {} diff --git a/database/data/categories/CAlg(R).yaml b/database/data/categories/CAlg(R).yaml index 9a4d1984..d9eecee9 100644 --- a/database/data/categories/CAlg(R).yaml +++ b/database/data/categories/CAlg(R).yaml @@ -3,7 +3,7 @@ name: category of commutative algebras notation: $\CAlg(R)$ objects: commutative algebras over a commutative ring $R \neq 0$ morphisms: maps preserving the ring and module structure -description: This is a generalization of the category of commutative rings, which we get for $R = \IZ$. In general, $\CAlg(R) \cong R \,/\, \CRing$. We assume our rings (and algebras) to be unital. For $R = 0$ we would get the trivial category, which is why we exclude this here. +description: This category is a generalization of the category of commutative rings, which we get for $R = \IZ$. In general, $\CAlg(R) \cong R \,/\, \CRing$. We assume our rings (and algebras) to be unital. For $R = 0$ we would get the trivial category, which is why we exclude this here. nlab_link: https://ncatlab.org/nlab/show/CommAlg tags: @@ -11,7 +11,6 @@ tags: related: - Alg(R) - - CRing - R-Mod satisfied_properties: @@ -19,10 +18,10 @@ satisfied_properties: proof: There is a forgetful functor $\CAlg(R) \to \Set$ and $\Set$ is locally small. - property: finitary algebraic - proof: Take the algebraic theory of a commutative ring. + proof: Take the algebraic theory of a commutative algebra. - property: strict terminal object - proof: 'If $f : 0 \to R$ is a homomorphism, then $R$ satisfies $1=f(1)=f(0)=0$, so that $R=0$.' + proof: 'If $f : 0 \to A$ is a homomorphism of $R$-algebras, then $A$ satisfies $1=f(1)=f(0)=0$, so that $A=0$.' check_redundancy: false - property: Malcev @@ -31,9 +30,23 @@ satisfied_properties: - grp_malcev - property: coextensive - proof: One can use the same proof as for $\CRing$. - references: - - cring_coextensive + proof: >- + We already know that $\CAlg(R)$ has products and pushouts, since it is finitary algebraic. Concretely, the pushout of a span $A \leftarrow S \rightarrow B$ can be constructed as the tensor product $A \otimes_S B$ with the obvious multiplication. Finite products are disjoint because the projection $p_1 : A \times B \to A$ is clearly surjective, hence an epimorphism, and the tensor product $A \otimes_{p_1,A \times B,p_2} B = 0$ is the zero ring (the terminal object), since + $$a \otimes b = a \cdot p_1(1,0) \otimes b = a \otimes p_2(1,0) \cdot b = a \otimes 0 = 0.$$ + It remains to check that finite products are stable under pushouts. Let + $$f : A \times B \to T$$ + be an algebra homomorphism, and consider the pushouts + $$\begin{align*} + T_A & := A \otimes_{p_1,A \times B,f} T \\ + T_B & := B \otimes_{p_2,A \times B,f} T. + \end{align*}$$ + We need to prove that the canonical homomorphism + $$T \to T_A \times T_B$$ + is an isomorphism. Since $p_1 : A \times B \to A$ is surjective with kernel $0 \times B = \langle (0,1) \rangle$, we have $T_A = T/\langle f(1,0)\rangle$, and likewise, $T_B = T/\langle f(0,1) \rangle$. The elements $f(1,0)$ and $f(0,1)$ are orthogonal idempotents in $T$. Therefore, the claim follows from the well-known result in commutative algebra that if $A$ is a commutative algebra and $e \in A$ is an idempotent, then the canonical homomorphism + $$A \to A/\langle e \rangle \times A/\langle 1-e \rangle$$ + is an isomorphism. One can also deduce this from the Chinese Remainder Theorem. + + An alternative proof, which we only sketch, uses the category of locally ringed spaces $\LRS_R$ over $R$, which is infinitary extensive. It follows that the category of affine $R$-schemes is extensive by Lemma 11 here, and this category is anti-equivalent to $\CAlg(R)$. This argument is not circular since our proof of extensivity of $\LRS_R$ does not use coextensivity of $\CAlg(R)$. unsatisfied_properties: - property: skeletal @@ -58,13 +71,18 @@ unsatisfied_properties: proof: 'See MO/509552: Consider the forgetful functor $U : \CAlg(R) \to \Set$ and the relation $S \subseteq U^2$ defined by $S(A) \coloneqq \{(a,b) \in U(A)^2 : ab = a^2\}$. Both are representable: $U$ by $R[X]$ and $S$ by $R[X,Y] / \langle XY-X^2 \rangle$. It is clear that $S$ is reflexive, but not symmetric.' - property: regular quotient object classifier - proof: 'The strategy is similar to the one for $\CRing$: Assume that $P \to R$ is a regular quotient object classifier. If $J$ denotes the kernel of $P \to R$, every ideal $I \subseteq A$ of any commutative $R$-algebra has the form $I = \langle \varphi(J) \rangle$ for a unique homomorphism $\varphi : P \to A$. If $\sigma : A \to A$ is an automorphism with $\sigma(I)=I$, then uniqueness gives us $\sigma \circ \varphi = \varphi$, which means that $\varphi(J)$ lies in $A^{\sigma}$, the fixed algebra of $\sigma$. But then $I$ is generated by elements in $A^{\sigma} \cap I$. If $K$ is a residue field of $R$, this fails for $A = K[X,Y]$, $I = \langle X,Y \rangle$, $\sigma(X)=Y$, $\sigma(Y)=X$. The fixed algebra is the subalgebra of symmetric polynomials, which is $K[X+Y,XY]$. So $\langle X,Y \rangle$ is generated by symmetric polynomials without constant term, which implies $\langle X,Y \rangle \subseteq \langle X+Y,XY \rangle$ in $K[X,Y]$. But reducing an equation like $X = a(X,Y) \cdot (X+Y) + b(X,Y) \cdot (XY)$ modulo $\langle X^2,Y^2,XY \rangle$ yields a contradiction.' + proof: 'Assume that $P \to R$ is a regular quotient object classifier. If $J$ denotes the kernel of $P \to R$, every ideal $I \subseteq A$ of any commutative $R$-algebra has the form $I = \langle \varphi(J) \rangle$ for a unique homomorphism $\varphi : P \to A$. If $\sigma : A \to A$ is an automorphism with $\sigma(I)=I$, then uniqueness gives us $\sigma \circ \varphi = \varphi$, which means that $\varphi(J)$ lies in $A^{\sigma}$, the fixed algebra of $\sigma$. But then $I$ is generated by elements in $A^{\sigma} \cap I$. If $K$ is a residue field of $R$, this fails for $A = K[X,Y]$, $I = \langle X,Y \rangle$, $\sigma(X)=Y$, $\sigma(Y)=X$. The fixed algebra is the subalgebra of symmetric polynomials, which is $K[X+Y,XY]$. So $\langle X,Y \rangle$ is generated by symmetric polynomials without constant term, which implies $\langle X,Y \rangle \subseteq \langle X+Y,XY \rangle$ in $K[X,Y]$. But reducing an equation like $X = a(X,Y) \cdot (X+Y) + b(X,Y) \cdot (XY)$ modulo $\langle X^2,Y^2,XY \rangle$ yields a contradiction.' label: calg_no_regular_quotient_object_classifier - references: - - cring_no_regular_quotient_object_classifier - property: cofiltered-limit-stable epimorphisms - proof: Let $K$ be a field over $R$. Consider the sequence of projections $\cdots \to K[X]/\langle X^2 \rangle \to K[X]/\langle X \rangle$ and the constant sequence $\cdots \to K[X] \to K[X]$. The surjective homomorphisms $K[X] \to K[X]/\langle X^n \rangle$ induce the inclusion $K[X] \hookrightarrow K[[X]]$ in the limit, where $K[[X]]$ is the algebra of formal power series. It is clearly not surjective, but this is not sufficient, we need to argue that it is not an epimorphism in $\CAlg(R)$, or equivalently, in $\CRing$. For a proof, see MSE/2391187. + proof: >- + Let $K$ be a field over $R$. Consider the epimorphism of sequences + $$\begin{CD} + \cdots @>>> K[X] @>>> K[X] @>>> K[X] \\ + @. @VVV @VVV @VVV \\ + \cdots @>>> K[X]/\langle X^3 \rangle @>>> K[X]/\langle X^2 \rangle @>>> K[X]/\langle X \rangle + \end{CD}$$ + In the limit, it induces the inclusion $K[X] \hookrightarrow K[[X]]$, where $K[[X]]$ is the algebra of formal power series over $K$. It is clearly not surjective, but this is not sufficient, we need to argue that it is not an epimorphism in $\CAlg(R)$, or equivalently, in $\CRing$. For a proof, see MSE/2391187. special_objects: initial object: diff --git a/database/data/categories/CMon.yaml b/database/data/categories/CMon.yaml index 5a861ffb..bd4a9a07 100644 --- a/database/data/categories/CMon.yaml +++ b/database/data/categories/CMon.yaml @@ -3,7 +3,7 @@ name: category of commutative monoids notation: $\CMon$ objects: commutative monoids morphisms: monoid homomorphisms -description: null +description: This is the full subcategory of $\Mon$ that consists of commutative monoids. It is a typical example of a finitary algebraic category and the "non-additive version" of $\CRing$. nlab_link: https://ncatlab.org/nlab/show/category+of+monoids tags: diff --git a/database/data/categories/CRing.yaml b/database/data/categories/CRing.yaml index dc2f9b31..78c1ae79 100644 --- a/database/data/categories/CRing.yaml +++ b/database/data/categories/CRing.yaml @@ -3,82 +3,33 @@ name: category of commutative rings notation: $\CRing$ objects: commutative rings morphisms: ring homomorphisms -description: null +description: This category is the special case of $\CAlg(R)$ where $R = \IZ$. nlab_link: https://ncatlab.org/nlab/show/CRing +parent: CAlg(R) tags: - algebra related: - - CAlg(R) - Ring - Rng + - CMon comments: - Regular monomorphisms are discussed in MSE/695685, but probably they cannot be classified. -satisfied_properties: - - property: locally small - proof: There is a forgetful functor $\CRing \to \Set$ and $\Set$ is locally small. - - - property: finitary algebraic - proof: Take the algebraic theory of a commutative ring. - - - property: strict terminal object - proof: 'If $f : 0 \to R$ is a homomorphism, then $R$ satisfies $1=f(1)=f(0)=0$, so that $R=0$.' - check_redundancy: false - - - property: Malcev - proof: This follows in the same way as for $\Grp$, see also Example 2.2.5 in Malcev, protomodular, homological and semi-abelian categories. - references: - - grp_malcev - - - property: coextensive - proof: >- - We already know that $\CRing$ has products and pushouts, since it is finitary algebraic. Concretely, the pushout of a span $A \leftarrow R \rightarrow B$ can be constructed as the tensor product $A \otimes_R B$ with the obvious multiplication. Finite products are disjoint because the projection $p_1 : A \times B \to A$ is clearly surjective, hence an epimorphism, and the tensor product $A \otimes_{p_1,A \times B,p_2} B = 0$ is the zero ring (the terminal object), since - $$a \otimes b = a \cdot p_1(1,0) \otimes b = a \otimes p_2(1,0) \cdot b = a \otimes 0 = 0.$$ - It remains to check that finite products are stable under pushouts. Let - $$f : A \times B \to T$$ - be a ring homomorphism, and consider the pushouts - $$\begin{align*} - T_A & := A \otimes_{p_1,A \times B,f} T \\ - T_B & := B \otimes_{p_2,A \times B,f} T. - \end{align*}$$ - We need to prove that the canonical homomorphism - $$T \to T_A \times T_B$$ - is an isomorphism. Since $p_1 : A \times B \to A$ is surjective with kernel $0 \times B = \langle (0,1) \rangle$, we have $T_A = T/\langle f(1,0)\rangle$, and likewise, $T_B = T/\langle f(0,1) \rangle$. The elements $f(1,0)$ and $f(0,1)$ are orthogonal idempotents in $T$. Therefore, the claim follows from the well-known result in commutative algebra that if $R$ is a commutative ring and $e \in R$ is an idempotent, then $R \to R/\langle e \rangle \times R/\langle 1-e \rangle$ is an isomorphism. One can also deduce this from the Chinese Remainder Theorem. - - An alternative proof, which we only sketch, uses the category of locally ringed spaces $\LRS$, which is infinitary extensive. It follows that the category of affine schemes is extensive by Lemma 11 here, and this category is anti-equivalent to $\CRing$. This argument is not circular since our proof of extensivity of $\LRS$ does not use coextensivity of $\CRing$. - label: cring_coextensive +satisfied_properties: [] unsatisfied_properties: - - property: skeletal - proof: This is trivial. - - property: semi-strongly connected + # This can be deduced from the parent CAlg(R), but we keep it because + # the proof for general R is more complicated. proof: There is no homomorphism between $\IF_2$ and $\IF_3$. label: cring_no_semi_strongly_connected - - property: balanced - proof: The inclusion $\IZ \hookrightarrow \IQ$ is a counterexample. - - - property: cogenerating set - proof: 'We apply this lemma to the collection of fields: If $F$ is a field and $R$ is a non-trivial commutative ring, any ring homomorphism $F \to R$ is injective. For every infinite cardinal $\kappa$ the field of rational functions in $\kappa$ variables has cardinality $\geq \kappa$ and a non-trivial automorphism (swap two variables).' - - - property: countably codistributive - proof: 'The canonical homomorphism $\IQ \otimes \IZ^{\IN} \to (\IQ \otimes \IZ)^{\IN} = \IQ^{\IN}$ is not an isomorphism: its image consists of those sequences of rational numbers whose denominators can be bounded.' - - - property: coregular - proof: See MSE/3745302. - - - property: co-Malcev - proof: 'See MO/509552: Consider the forgetful functor $U : \CRing \to \Set$ and the relation $R \subseteq U^2$ defined by $R(A) \coloneqq \{(a,b) \in U(A)^2 : ab = a^2\}$. Both are representable: $U$ by $\IZ[X]$ and $R$ by $\IZ[X,Y] / \langle XY-X^2 \rangle$. It is clear that $R$ is reflexive, but not symmetric.' - - - property: regular quotient object classifier - proof: 'Assume that $P \to \IZ$ is a regular quotient object classifier. If $J$ denotes its kernel, this means that every ideal $I \subseteq A$ of any commutative ring has the form $I = \langle \varphi(J) \rangle$ for a unique homomorphism $\varphi : P \to A$. If $\sigma : A \to A$ is an automorphism with $\sigma(I)=I$, then uniqueness gives us $\sigma \circ \varphi = \varphi$, which means that $\varphi(J)$ lies in $A^{\sigma}$, the fixed ring of $\sigma$. But then $I$ is generated by elements in the fixed ring. This fails for $A = \IZ[X]$, $I = \langle X \rangle$, $\sigma(X)=-X$. The fixed ring is $\IZ[X^2]$, and if $I$ was generated by elements $f \in \IZ[X^2] \cap I$, they would be multiples of $X^2$, but $X$ is not a multiple of $X^2$.' - label: cring_no_regular_quotient_object_classifier - - property: cofiltered-limit-stable epimorphisms + # This can be deduced from the parent CAlg(R), but the proof for CRing is + # instructive, so we keep it. proof: 'For a prime $p$ consider the sequence of projections $\cdots \to \IZ/p^2 \to \IZ/p$ and the constant sequence $\cdots \to \IZ \to \IZ$. The surjective homomorphisms $\IZ \to \IZ/p^n$ induce the homomorphism $\IZ \to \IZ_p$ in the limit, where $\IZ_p$ is the ring of $p$-adic integers. It is not surjective since $\IZ_p$ is uncountable, but this is not sufficient (at least, for this category): We need to use SP/04W0 to conclude that it is no epimorphism in $\CRing$.' special_objects: diff --git a/database/data/categories/FinAb.yaml b/database/data/categories/FinAb.yaml index 98ca4405..f3185a07 100644 --- a/database/data/categories/FinAb.yaml +++ b/database/data/categories/FinAb.yaml @@ -3,7 +3,7 @@ name: category of finite abelian groups notation: $\FinAb$ objects: finite abelian groups morphisms: group homomorphisms -description: null +description: This is the full subcategory of $\Ab$ that consists of the finite abelian groups. nlab_link: https://ncatlab.org/nlab/show/finite+abelian+group tags: diff --git a/database/data/categories/FinGrp.yaml b/database/data/categories/FinGrp.yaml index 2e3b8fa8..b1c0d7aa 100644 --- a/database/data/categories/FinGrp.yaml +++ b/database/data/categories/FinGrp.yaml @@ -3,7 +3,7 @@ name: category of finite groups notation: $\FinGrp$ objects: finite groups morphisms: group homomorphisms -description: null +description: This is the full subcategory of $\Grp$ that consists of the finite groups. nlab_link: https://ncatlab.org/nlab/show/finite+group tags: diff --git a/database/data/categories/FinSet.yaml b/database/data/categories/FinSet.yaml index a981bf27..3b723fef 100644 --- a/database/data/categories/FinSet.yaml +++ b/database/data/categories/FinSet.yaml @@ -3,7 +3,7 @@ name: category of finite sets notation: $\FinSet$ objects: finite sets morphisms: maps -description: null +description: This is the full subcategory of $\Set$ that consists of the finite sets. nlab_link: https://ncatlab.org/nlab/show/FinSet tags: diff --git a/database/data/categories/FinVect.yaml b/database/data/categories/FinVect.yaml new file mode 100644 index 00000000..dcf12144 --- /dev/null +++ b/database/data/categories/FinVect.yaml @@ -0,0 +1,76 @@ +id: FinVect +name: category of finite-dimensional vector spaces +notation: $\FinVect_K$ +objects: finite-dimensional vector spaces over a field $K$ +morphisms: linear maps +description: This is the full subcategory of $\Vect_K$ consisting of finite-dimensional vector spaces. Every object is isomorphic to $K^n$ for a unique $n \in \IN$. +nlab_link: https://ncatlab.org/nlab/show/FinDimVect + +tags: + - algebra + +related: + - Vect + - Ab_fg + +satisfied_properties: + - property: locally small + proof: There is a forgetful functor $\FinVect_K \to \Vect_K$, and $\Vect_K$ is locally small. + + - property: essentially small + proof: Every object is isomorphic to $K^n$ for some $n \in \IN$, and $\Hom(K^n,K^m) \cong M_{m \times n}(K)$ is a set. + + - property: extremal generator + proof: The one-dimensional vector space $K$ is an extremal generator even in $\Vect_K$. Now apply Lemma 10 here. + references: + - vect_extremal_generator + + - property: split abelian + proof: This follows directly from the corresponding fact for $\Vect_K$. + + - property: self-dual + proof: The functor $V \mapsto V^*$ defines an equivalence of categories $\FinVect_K^{\op} \simeq \FinVect_K$. In fact, the natural map $V \to V^{**}$, $v \mapsto (\omega \mapsto \omega(v))$ is an isomorphism by standard linear algebra. + + - property: ℵ₁-accessible + proof: 'The inclusion $\FinVect_K \hookrightarrow \Vect_K$ is closed under $\aleph_1$-filtered colimits by MO/400763. In particular, $\FinVect_K$ has $\aleph_1$-filtered colimits. Moreover, every object in $\FinVect_K$ is $\aleph_1$-presentable: it is isomorphic to some $K^n$, which is finitely presentable in $\Vect_K$, hence $\aleph_1$-presentable in $\Vect_K$, and therefore also $\aleph_1$-presentable in $\FinVect_K$.' + +unsatisfied_properties: + - property: skeletal + proof: This is trivial. + + - property: small + proof: This is trivial. + + - property: countable + proof: This is trivial. + + - property: thin + proof: This is clear. + +undecidable_properties: + - property: essentially countable + proof: This depends on the countability of $K$. + + - property: locally finite + proof: This depends on the finiteness of $K$. + +special_objects: + initial object: + description: the trivial vector space + terminal object: + description: the trivial vector space + coproducts: + description: '[finite case] direct sums' + products: + description: '[finite case] direct products with pointwise operations' + +special_morphisms: + isomorphisms: + description: bijective linear maps + proof: It is a full subcategory of $\Vect_K$, for which we know that isomorphisms are bijective linear maps. + monomorphisms: + description: injective linear maps + proof: For the non-trivial direction, the forgetful functor $\FinVect_K \to \Set$ is representable (by $K$), and therefore preserves monomorphisms. + epimorphisms: + description: surjective linear maps + proof: 'For the non-trivial direction, it suffices to observe that every epimorphism in $\FinVect_K$ is also an epimorphism in $\Vect_K$, where epimorphisms are already classified. Namely, let $f : V \to W$ be an epimorphism in $\FinVect_K$ and let $g : W \to T$ be a linear map with $g \circ f = 0$. Then $g$ factors as $g = i \circ h$, where $i : \im(g) \hookrightarrow T$ is the inclusion of the image and $h : W \twoheadrightarrow \im(g)$ is the corestriction of $g$. Then $h \circ f = 0$, and since $\im(g)$ is finite-dimensional, it follows that $h = 0$. Hence $g = 0$.' diff --git a/database/data/categories/FinVect_c.yaml b/database/data/categories/FinVect_c.yaml index 763d15a3..57d73dd5 100644 --- a/database/data/categories/FinVect_c.yaml +++ b/database/data/categories/FinVect_c.yaml @@ -1,72 +1,27 @@ -# TODO: fix duplication with FinVect_u and FinVect_f id: FinVect_c name: category of finite-dimensional vector spaces [countable field] notation: $\FinVect_K$ objects: finite-dimensional vector spaces over a countably infinite field $K$ morphisms: linear maps -description: This is the full subcategory of $\Vect_K$ consisting of finite-dimensional vector spaces. Every object is isomorphic to $K^n$ for a unique $n \in \IN$. In this entry, we assume that $K$ is countably infinite (e.g. $K = \IQ$) in order to determine all properties of this category. +description: This is the special case of $\FinVect_K$ where $K$ is a countably infinite field (e.g. $K = \IQ$). We use this assumption in order to determine all properties of this category. nlab_link: https://ncatlab.org/nlab/show/FinDimVect +parent: FinVect tags: - algebra related: - Vect - - FinVect_u - - FinVect_f - Ab_fg satisfied_properties: - - property: locally small - proof: There is a forgetful functor $\FinVect_K \to \Vect_K$, and $\Vect_K$ is locally small. - - property: essentially countable - proof: Every object is isomorphic to $K^n$ for some $n \in \IN$, and $\Hom(K^n,K^m) \cong M_{m \times n}(K)$ is a countable set. - - - property: extremal generator - proof: The one-dimensional vector space $K$ is an extremal generator even in $\Vect_K$. Now apply Lemma 10 here. - references: - - vect_extremal_generator - - - property: split abelian - proof: This follows directly from the corresponding fact for $\Vect_K$. - - - property: self-dual - proof: The functor $V \mapsto V^*$ defines an equivalence of categories $\FinVect_K^{\op} \simeq \FinVect_K$. In fact, the natural map $V \to V^{**}$, $v \mapsto (\omega \mapsto \omega(v))$ is an isomorphism by standard linear algebra. - - - property: ℵ₁-accessible - proof: 'The inclusion $\FinVect_K \hookrightarrow \Vect_K$ is closed under $\aleph_1$-filtered colimits by MO/400763. In particular, $\FinVect_K$ has $\aleph_1$-filtered colimits. Moreover, every object in $\FinVect_K$ is $\aleph_1$-presentable: it is isomorphic to some $K^n$, which is finitely presentable in $\Vect_K$, hence $\aleph_1$-presentable in $\Vect_K$, and therefore also $\aleph_1$-presentable in $\FinVect_K$.' + proof: Every object is isomorphic to $K^n$ for some $n \in \IN$, and $\Hom(K^n,K^m) \cong M_{m \times n}(K)$ is a countable set because $K$ is countable by assumption. unsatisfied_properties: - - property: skeletal - proof: This is trivial. - - - property: small - proof: This is trivial. - - - property: countable - proof: This is trivial. - - property: locally finite proof: The hom-set $\Hom(K,K) \cong K$ is infinite by assumption. -special_objects: - initial object: - description: the trivial vector space - terminal object: - description: the trivial vector space - coproducts: - description: '[finite case] direct sums' - products: - description: '[finite case] direct products with pointwise operations' +special_objects: {} -special_morphisms: - isomorphisms: - description: bijective linear maps - proof: It is a full subcategory of $\Vect_K$, for which we know that isomorphisms are bijective linear maps. - monomorphisms: - description: injective linear maps - proof: For the non-trivial direction, the forgetful functor $\FinVect_K \to \Set$ is representable (by $K$), and therefore preserves monomorphisms. - epimorphisms: - description: surjective linear maps - proof: 'For the non-trivial direction, it suffices to observe that every epimorphism in $\FinVect_K$ is also an epimorphism in $\Vect_K$, where epimorphisms are already classified. Namely, let $f : V \to W$ be an epimorphism in $\FinVect_K$ and let $g : W \to T$ be a linear map with $g \circ f = 0$. Then $g$ factors as $g = i \circ h$, where $i : \im(g) \hookrightarrow T$ is the inclusion of the image and $h : W \twoheadrightarrow \im(g)$ is the corestriction of $g$. Then $h \circ f = 0$, and since $\im(g)$ is finite-dimensional, it follows that $h = 0$. Hence $g = 0$.' +special_morphisms: {} diff --git a/database/data/categories/FinVect_f.yaml b/database/data/categories/FinVect_f.yaml index c994ef71..a3aef1d0 100644 --- a/database/data/categories/FinVect_f.yaml +++ b/database/data/categories/FinVect_f.yaml @@ -1,72 +1,28 @@ -# TODO: fix duplication with FinVect_u and FinVect_c id: FinVect_f name: category of finite-dimensional vector spaces [finite field] notation: $\FinVect_K$ -objects: finite-dimensional vector spaces over a countably infinite field $K$ +objects: finite-dimensional vector spaces over a finite field $K$ morphisms: linear maps -description: This is the full subcategory of $\Vect_K$ consisting of finite-dimensional vector spaces. Every object is isomorphic to $K^n$ for a unique $n \in \IN$. In this entry, we assume that $K$ is finite (e.g. $K = \IF_2$) in order to determine all properties of this category. +description: This is the special case of $\FinVect_K$ where $K$ is a finite field (e.g. $K = \IF_2$). We use this assumption in order to determine all properties of this category. nlab_link: https://ncatlab.org/nlab/show/FinDimVect +parent: FinVect tags: - algebra related: - Vect - - FinVect_u - - FinVect_c - Ab_fg satisfied_properties: - - property: locally small - proof: There is a forgetful functor $\FinVect_K \to \Vect_K$, and $\Vect_K$ is locally small. - - property: essentially countable - proof: Every object is isomorphic to $K^n$ for some $n \in \IN$, and $\Hom(K^n,K^m) \cong M_{m \times n}(K)$ is a finite, hence countable set. + proof: Every object is isomorphic to $K^n$ for some $n \in \IN$, and $\Hom(K^n,K^m) \cong M_{m \times n}(K)$ is finite by assumption, hence a countable set. - property: locally finite proof: Each hom-set $\Hom(K^n,K^m) \cong M_{m \times n}(K)$ is finite by assumption. - - property: extremal generator - proof: The one-dimensional vector space $K$ is an extremal generator even in $\Vect_K$. Now apply Lemma 10 here. - references: - - vect_extremal_generator - - - property: split abelian - proof: This follows directly from the corresponding fact for $\Vect_K$. - - - property: self-dual - proof: The functor $V \mapsto V^*$ defines an equivalence of categories $\FinVect_K^{\op} \simeq \FinVect_K$. In fact, the natural map $V \to V^{**}$, $v \mapsto (\omega \mapsto \omega(v))$ is an isomorphism by standard linear algebra. - -unsatisfied_properties: - - property: skeletal - proof: This is trivial. - - - property: small - proof: This is trivial. - - - property: countable - proof: This is trivial. - - - property: thin - proof: This is trivial. +unsatisfied_properties: [] -special_objects: - initial object: - description: the trivial vector space - terminal object: - description: the trivial vector space - coproducts: - description: '[finite case] direct sums' - products: - description: '[finite case] direct products with pointwise operations' +special_objects: {} -special_morphisms: - isomorphisms: - description: bijective linear maps - proof: It is a full subcategory of $\Vect_K$, for which we know that isomorphisms are bijective linear maps. - monomorphisms: - description: injective linear maps - proof: For the non-trivial direction, the forgetful functor $\FinVect_K \to \Set$ is representable (by $K$), and therefore preserves monomorphisms. - epimorphisms: - description: surjective linear maps - proof: 'For the non-trivial direction, it suffices to observe that every epimorphism in $\FinVect_K$ is also an epimorphism in $\Vect_K$, where epimorphisms are already classified. Namely, let $f : V \to W$ be an epimorphism in $\FinVect_K$ and let $g : W \to T$ be a linear map with $g \circ f = 0$. Then $g$ factors as $g = i \circ h$, where $i : \im(g) \hookrightarrow T$ is the inclusion of the image and $h : W \twoheadrightarrow \im(g)$ is the corestriction of $g$. Then $h \circ f = 0$, and since $\im(g)$ is finite-dimensional, it follows that $h = 0$. Hence $g = 0$.' +special_morphisms: {} diff --git a/database/data/categories/FinVect_u.yaml b/database/data/categories/FinVect_u.yaml index 0329565e..bd20868b 100644 --- a/database/data/categories/FinVect_u.yaml +++ b/database/data/categories/FinVect_u.yaml @@ -1,72 +1,28 @@ -# TODO: fix duplication with FinVect_c and FinVect_f id: FinVect_u name: category of finite-dimensional vector spaces [uncountable field] notation: $\FinVect_K$ objects: finite-dimensional vector spaces over an uncountable field $K$ morphisms: linear maps -description: This is the full subcategory of $\Vect_K$ consisting of finite-dimensional vector spaces. Every object is isomorphic to $K^n$ for a unique $n \in \IN$. In this entry, we assume that $K$ is uncountable (e.g. $K = \IR$) in order to determine all properties of this category. +description: This is the special case of $\FinVect_K$ where $K$ is an uncountable field (e.g. $K = \IR$). We use this assumption in order to determine all properties of this category. nlab_link: https://ncatlab.org/nlab/show/FinDimVect +parent: FinVect tags: - algebra related: - Vect - - FinVect_c - - FinVect_f - Ab_fg -satisfied_properties: - - property: locally small - proof: There is a forgetful functor $\FinVect_K \to \Vect_K$, and $\Vect_K$ is locally small. - - - property: essentially small - proof: Every object is isomorphic to $K^n$ for some $n \in \IN$, and $\Hom(K^n,K^m) \cong M_{m \times n}(K)$ is a set. - - - property: extremal generator - proof: The one-dimensional vector space $K$ is an extremal generator even in $\Vect_K$. Now apply Lemma 10 here. - references: - - vect_extremal_generator - - - property: split abelian - proof: This follows directly from the corresponding fact for $\Vect_K$. - - - property: self-dual - proof: The functor $V \mapsto V^*$ defines an equivalence of categories $\FinVect_K^{\op} \simeq \FinVect_K$. In fact, the natural map $V \to V^{**}$, $v \mapsto (\omega \mapsto \omega(v))$ is an isomorphism by standard linear algebra. - - - property: ℵ₁-accessible - proof: 'The inclusion $\FinVect_K \hookrightarrow \Vect_K$ is closed under $\aleph_1$-filtered colimits by MO/400763. In particular, $\FinVect_K$ has $\aleph_1$-filtered colimits. Moreover, every object in $\FinVect_K$ is $\aleph_1$-presentable: it is isomorphic to some $K^n$, which is finitely presentable in $\Vect_K$, hence $\aleph_1$-presentable in $\Vect_K$, and therefore also $\aleph_1$-presentable in $\FinVect_K$.' +satisfied_properties: [] unsatisfied_properties: - - property: skeletal - proof: This is trivial. - - - property: small - proof: This is trivial. - - property: essentially countable proof: The hom-set $\Hom(K,K) \cong K$ is uncountable by assumption. - property: locally finite proof: The hom-set $\Hom(K,K) \cong K$ is infinite by assumption. -special_objects: - initial object: - description: the trivial vector space - terminal object: - description: the trivial vector space - coproducts: - description: '[finite case] direct sums' - products: - description: '[finite case] direct products with pointwise operations' +special_objects: {} -special_morphisms: - isomorphisms: - description: bijective linear maps - proof: It is a full subcategory of $\Vect_K$, for which we know that isomorphisms are bijective linear maps. - monomorphisms: - description: injective linear maps - proof: For the non-trivial direction, the forgetful functor $\FinVect_K \to \Set$ is representable (by $K$), and therefore preserves monomorphisms. - epimorphisms: - description: surjective linear maps - proof: 'For the non-trivial direction, it suffices to observe that every epimorphism in $\FinVect_K$ is also an epimorphism in $\Vect_K$, where epimorphisms are already classified. Namely, let $f : V \to W$ be an epimorphism in $\FinVect_K$ and let $g : W \to T$ be a linear map with $g \circ f = 0$. Then $g$ factors as $g = i \circ h$, where $i : \im(g) \hookrightarrow T$ is the inclusion of the image and $h : W \twoheadrightarrow \im(g)$ is the corestriction of $g$. Then $h \circ f = 0$, and since $\im(g)$ is finite-dimensional, it follows that $h = 0$. Hence $g = 0$.' +special_morphisms: {} diff --git a/database/data/categories/Fld.yaml b/database/data/categories/Fld.yaml index 946d2732..48040e5b 100644 --- a/database/data/categories/Fld.yaml +++ b/database/data/categories/Fld.yaml @@ -3,7 +3,7 @@ name: category of fields notation: $\Fld$ objects: fields morphisms: field homomorphisms (i.e., ring homomorphisms) -description: This is a typical example of a bad category of good objects. +description: This category is a typical example of a bad category of good objects. nlab_link: https://ncatlab.org/nlab/show/Field tags: diff --git a/database/data/categories/FreeAb.yaml b/database/data/categories/FreeAb.yaml index 13dc27f8..1fbd065c 100644 --- a/database/data/categories/FreeAb.yaml +++ b/database/data/categories/FreeAb.yaml @@ -3,7 +3,7 @@ name: category of free abelian groups notation: $\FreeAb$ objects: free abelian groups morphisms: group homomorphisms -description: null +description: This is the full subcategory of $\Ab$ that consists of the free abelian groups. nlab_link: null tags: diff --git a/database/data/categories/M-Set.yaml b/database/data/categories/M-Set.yaml index f14e307e..3c8713c2 100644 --- a/database/data/categories/M-Set.yaml +++ b/database/data/categories/M-Set.yaml @@ -33,6 +33,7 @@ unsatisfied_properties: undecidable_properties: - property: semi-strongly connected + # TODO: decide if we want to add separate children entries to decide this for some cases. proof: If this category is semi-strongly connected depends on the choice of $M$. For $M = 1$ it is, for $M = \IZ$ it is not. In general, if $G$ is a group, then $G{-}\Set$ is semi-strongly connected if and only if for all subgroups $H,K \subseteq G$, $H$ is subconjugated to $K$ or $K$ is subconjugated to $H$. If $G$ is abelian, this means that the poset of subgroups is linear, in which case $G$ is either isomorphic to $\IZ/p^n$ or to $\IZ/p^{\infty}$ for a prime $p$. See also MSE/5129804. special_objects: diff --git a/database/data/categories/Mon.yaml b/database/data/categories/Mon.yaml index d6b61c38..9f58e138 100644 --- a/database/data/categories/Mon.yaml +++ b/database/data/categories/Mon.yaml @@ -3,7 +3,7 @@ name: category of monoids notation: $\Mon$ objects: monoids morphisms: monoid homomorphisms -description: null +description: This category is a typical example of a finitary algebraic category. nlab_link: https://ncatlab.org/nlab/show/category+of+monoids tags: @@ -11,6 +11,7 @@ tags: related: - CMon + - Ring - Cat - Grp - SemiGrp diff --git a/database/data/categories/N.yaml b/database/data/categories/N.yaml index 45add20b..d4ee93cb 100644 --- a/database/data/categories/N.yaml +++ b/database/data/categories/N.yaml @@ -3,7 +3,9 @@ name: partially ordered set of natural numbers notation: $(\IN,\leq)$ objects: natural numbers $0, 1, 2, \dotsc$ morphisms: 'a unique morphism $(n,m) : n \to m$ if $n \leq m$' -description: This can also be seen as the path category of the infinite linear graph $\bullet \to \bullet \to \bullet \to \cdots$. +description: >- + This category can also be seen as the path category of the infinite linear graph + $$\bullet \longrightarrow \bullet \longrightarrow \bullet \longrightarrow \cdots.$$ nlab_link: null tags: diff --git a/database/data/categories/N_oo.yaml b/database/data/categories/N_oo.yaml index ddab4eba..1f60f871 100644 --- a/database/data/categories/N_oo.yaml +++ b/database/data/categories/N_oo.yaml @@ -3,7 +3,7 @@ name: partially ordered set of extended natural numbers notation: $(\IN \cup \{\infty\}, \leq)$ objects: natural numbers and $\infty$ morphisms: 'a unique morphism $(n, m) : n \to m$ if $n \leq m$, where of course $n \leq \infty$ for all $n$' -description: null +description: This category is a completed version of the thin category of natural numbers. nlab_link: null tags: diff --git a/database/data/categories/On.yaml b/database/data/categories/On.yaml index d4323b34..45fe331b 100644 --- a/database/data/categories/On.yaml +++ b/database/data/categories/On.yaml @@ -3,7 +3,7 @@ name: partially ordered collection of ordinal numbers notation: $(\On,\leq)$ objects: ordinal numbers morphisms: 'a unique morphism $(\alpha,\beta): \alpha \to \beta$ if $\alpha \leq \beta$' -description: This is a large variant of the partially ordered set of natural numbers. +description: This category is a large variant of the thin category of natural numbers. nlab_link: null tags: diff --git a/database/data/categories/R-Mod.yaml b/database/data/categories/R-Mod.yaml index 83c27ab0..411b5a45 100644 --- a/database/data/categories/R-Mod.yaml +++ b/database/data/categories/R-Mod.yaml @@ -4,16 +4,14 @@ notation: $R{-}\Mod$ objects: left $R$-modules morphisms: $R$-linear maps description: |- - This is the prototype of an abelian category. The category of right modules is the same with the opposite ring $R^{\op}$, hence not listed here. - To settle the unsatisfied properties, we make the assumption that $R$ is not semisimple: If $R$ is semisimple, then by the Artin-Wedderburn theorem, the category is equivalent to a finite direct product of categories $D{-}\Mod$ for division rings $D$, and the case of division rings is in a separate entry. In particular, $R \neq 0$ and $R$ is not a field. + This is the prototype of an abelian category. The category of right modules is the same with the opposite ring $R^{\op}$, hence not listed here. We assume $R \neq 0$ since otherwise the category would be trivial. nlab_link: https://ncatlab.org/nlab/show/module tags: - algebra related: - - Ab - M-Set - - R-Mod_div + - Ab - Vect satisfied_properties: @@ -27,15 +25,16 @@ satisfied_properties: proof: Take the algebraic theory of an $R$-module (given by the algebraic theory of an abelian group and for each $r \in R$ a unary operation). unsatisfied_properties: - - property: split abelian - proof: By assumption, $R$ is not semisimple, so that there is a non-projective $R$-module, which yields a non-split sequence. - - property: skeletal proof: This is trivial. - property: CSP proof: The canonical homomorphism $\bigoplus_{n \geq 0} R \to \prod_{n \geq 0} R$ is not surjective, hence no epimorphism. +undecidable_properties: + - property: split abelian + proof: The category $R{-}\Mod$ is split abelian if and only if $R$ is semisimple. See Theorem 2.5 in Lam's A First Course in Noncommutative Rings. For example, $\Vect_K$ is split abelian, while $\Ab$ is not. + special_objects: initial object: description: trivial module diff --git a/database/data/categories/R-Mod_div.yaml b/database/data/categories/R-Mod_div.yaml index 39b2b779..3da1ead1 100644 --- a/database/data/categories/R-Mod_div.yaml +++ b/database/data/categories/R-Mod_div.yaml @@ -3,44 +3,22 @@ name: category of left modules over a division ring notation: $R{-}\Mod$ objects: left $R$-modules morphisms: $R$-linear maps -description: Here, we assume that $R$ is a non-commutative division ring, i.e. a skew-field which is not a field. The category of modules behaves mostly the same as in the commutative case. +description: This is the special case of $R{-}\Mod$ where $R$ is a division ring (also known as a skew-field). nlab_link: https://ncatlab.org/nlab/show/module +parent: R-Mod tags: - algebra related: - - R-Mod - - Vect + - M-Set satisfied_properties: - - property: locally small - proof: There is a forgetful functor $R{-}\Mod \to \Set$ and $\Set$ is locally small. - - property: split abelian proof: It is a standard fact that the category of $R$-modules is abelian for any ring $R$, see Mac Lane, Ch. VIII. If $R$ is a division ring, then by linear algebra every $R$-module has a basis, hence is projective, so that every short exact sequence splits. - - property: finitary algebraic - proof: Take the algebraic theory of an $R$-module (given by the algebraic theory of an abelian group and for each $r \in R$ a unary operation). - -unsatisfied_properties: - - property: skeletal - proof: This is trivial. - - - property: CSP - proof: The canonical homomorphism $\bigoplus_{n \geq 0} R \to \prod_{n \geq 0} R$ is not surjective, hence no epimorphism. +unsatisfied_properties: [] -special_objects: - initial object: - description: trivial module - terminal object: - description: zero module - coproducts: - description: direct sums - products: - description: direct products with pointwise operations +special_objects: {} -special_morphisms: - epimorphisms: - description: surjective morphisms - proof: The forgetful functor to abelian groups is faithful and preserves colimits, hence reflects and preserves epimorphisms. Alternatively, use the same proof as for abelian groups. +special_morphisms: {} diff --git a/database/data/categories/R-Mod_non_ss.yaml b/database/data/categories/R-Mod_non_ss.yaml new file mode 100644 index 00000000..0ad4bf01 --- /dev/null +++ b/database/data/categories/R-Mod_non_ss.yaml @@ -0,0 +1,24 @@ +id: R-Mod_non_ss +name: category of left modules over a non-semisimple ring +notation: $R{-}\Mod$ +objects: left $R$-modules +morphisms: $R$-linear maps +description: This is the special case of $R{-}\Mod$ where $R$ is a ring that is not semisimple. In particular, $R \neq 0$ and $R$ is not a field. If $R$ is semisimple, then by the Artin-Wedderburn theorem, the category is equivalent to a finite direct product of categories $D{-}\Mod$ for division rings $D$, and the case of division rings is in a separate entry. +nlab_link: https://ncatlab.org/nlab/show/module +parent: R-Mod + +tags: + - algebra + +related: + - M-Set + +satisfied_properties: [] + +unsatisfied_properties: + - property: split abelian + proof: By assumption, $R$ is not semisimple, which means that there is a short exact sequence that does not split; see Theorem 2.5 in Lam's A First Course in Noncommutative Rings. + +special_objects: {} + +special_morphisms: {} diff --git a/database/data/categories/Ring.yaml b/database/data/categories/Ring.yaml index 7da17e06..2bbbaefc 100644 --- a/database/data/categories/Ring.yaml +++ b/database/data/categories/Ring.yaml @@ -3,80 +3,24 @@ name: category of rings notation: $\Ring$ objects: rings morphisms: ring homomorphisms -description: Here, rings always have a unit, and homomorphisms preserve them. +description: Here, rings always have a unit, and homomorphisms preserve them. This category is the special case of $\Alg(R)$ where $R = \IZ$. nlab_link: https://ncatlab.org/nlab/show/Ring +parent: Alg(R) tags: - algebra related: - - Alg(R) - CRing - Rng + - Mon comments: - It is likely that the epimorphisms can be described as for $\CRing$. -satisfied_properties: - - property: locally small - proof: There is a forgetful functor $\Ring \to \Set$ and $\Set$ is locally small. +satisfied_properties: [] - - property: finitary algebraic - proof: Take the algebraic theory of a ring. - - - property: strict terminal object - proof: 'If $f : 0 \to R$ is a homomorphism, then $R$ satisfies $1=f(1)=f(0)=0$, so that $R=0$.' - - - property: Malcev - proof: This follows in the same way as for $\Grp$, see also Example 2.2.5 in Malcev, protomodular, homological and semi-abelian categories. - references: - - grp_malcev - - - property: disjoint finite products - proof: 'To show that $A \sqcup_{A \times B} B$ is trivial, let $R$ be a ring which admits homomorphisms $f : A \to R$, $g : B \to R$ with $f(p_1(a,b))=g(p_2(a,b))$ for all $(a,b) \in A \times B$, i.e. $f(a)=g(b)$. Applying this to $a=0$, $b=1$ yields $1=0$ in $R$.' - label: ring_disjoint_finite_products - -unsatisfied_properties: - - property: skeletal - proof: This is trivial. - - - property: balanced - proof: The inclusion $\IZ \hookrightarrow \IQ$ is a counterexample; see also here. - label: ring_not_balanced - - - property: semi-strongly connected - proof: This is because already the full subcategory $\CRing$ does not have this property. - - - property: cogenerating set - proof: 'We apply this lemma to the collection of fields: If $F$ is a field and $R$ is a non-trivial ring, any ring homomorphism $F \to R$ is injective. For every infinite cardinal $\kappa$ the field of rational functions in $\kappa$ variables has cardinality $\geq \kappa$ and a non-trivial automorphism (swap two variables).' - - - property: codistributive - proof: 'If $\sqcup$ denotes the coproduct of rings (see MSE/625874 for their description) and $R$ is a ring, the canonical morphism $R \sqcup \IZ^2 \to (R \sqcup \IZ)^2 = R^2$ is usually no isomorphism. For example, for $R = \IZ[X]$ the coproduct on the LHS is not commutative, it has the ring presentation $\langle X,E : E^2=E \rangle$.' - - - property: co-Malcev - proof: 'See MO/509552: Consider the forgetful functor $U : \Ring \to \Set$ and the relation $R \subseteq U^2$ defined by $R(A) \coloneqq \{(a,b) \in U(A)^2 : ab = a^2\}$. Both are representable: $U$ by $\IZ[X]$ and $S$ by $\IZ \langle X,Y \rangle / \langle XY-X^2 \rangle$. It is clear that $R$ is reflexive, but not symmetric.' - - - property: coregular - proof: 'Let $B \coloneqq M_2(\IQ)$ and $A \coloneqq \IQ^2$. Then $A \to B$, $(x,y) \mapsto \diag(x,y)$ is a regular monomorphism: A direct calculation shows that a matrix is diagonal iff it commutes with $M \coloneqq \bigl(\begin{smallmatrix} 1 & 0 \\ 0 & 2 \end{smallmatrix}\bigr)$, so that $A \to B$ is the equalizer of the identity $B \to B$ and the conjugation $B \to B$, $X \mapsto M X M^{-1}$. Consider the homomorphism $A \to K$, $(a,b) \mapsto a$. We claim that $K \to K \sqcup_A B$ is not a monomorphism, because in fact, the pushout $K \sqcup_A B$ is zero: Since $A \to K$ is surjective with kernel $0 \times K$, the pushout is $B/\langle 0 \times K \rangle$, which is $0$ because $B$ is simple (proof) or via a direct calculation with elementary matrices.' - label: ring_not_coregular - - - property: regular quotient object classifier - proof: We may copy the proof for $\CRing$ (since the proof there did not use that $P$ is commutative). Alternatively, any regular quotient object classifier in $\Ring$ would produce one in $\CRing$ by Lemma 1 here (dualized). - references: - - cring_no_regular_quotient_object_classifier - - - property: cocartesian cofiltered limits - proof: >- - Consider the ring $A = \IZ[X]$ and the sequence of rings $B_n = \IZ[Y]/(Y^{n+1})$ with projections $B_{n+1} \to B_n$, whose limit is $\IZ[[Y]]$. Every element in the coproduct of rings $\IZ[X] \sqcup \IZ[[Y]]$ has a finite "free product" length. Now consider the elements - $$w_n = (1 + XY) (1+XY^2) \cdots (1+X Y^n) \in A \sqcup B_n.$$ - Because of $w_n \equiv w_{n-1} \bmod Y^n$ these form an element $w \in \lim_n (A \sqcup B_n)$. Expanding $w_n$, the longest term is $XY XY^2 \cdots X Y^n$ of "free product" length $2n$, which is unbounded. - - - property: cofiltered-limit-stable epimorphisms - proof: We know that $\CRing$ does not have this property. Now use the contrapositive of the dual of Lemma 2 here applied to the forgetful functor $\CRing \to \Ring$. It preserves epimorphisms by MSE/5133488. - - - property: effective cocongruences - proof: See MO/510744. - label: ring_no_effective_cocongruences +unsatisfied_properties: [] special_objects: initial object: diff --git a/database/data/categories/Rng.yaml b/database/data/categories/Rng.yaml index f27986ca..37744cd0 100644 --- a/database/data/categories/Rng.yaml +++ b/database/data/categories/Rng.yaml @@ -3,7 +3,7 @@ name: category of rngs notation: $\Rng$ objects: rngs, that is, non-unital rings morphisms: maps that preserve addition and multiplication -description: null +description: This category is a typical example of a finitary algebraic category. It is an "additive version" of the category of semigroups $\SemiGrp$. nlab_link: https://ncatlab.org/nlab/show/Rng tags: @@ -13,6 +13,7 @@ related: - CRing - Ring - Ab + - SemiGrp comments: - It is likely that the epimorphisms can be described as for $\CRing$. @@ -37,9 +38,7 @@ unsatisfied_properties: proof: This is trivial. - property: balanced - proof: The inclusion $\IZ \hookrightarrow \IQ$ is a counterexample; the proof can be reduced to the unital case. - references: - - ring_not_balanced + proof: The inclusion $\IZ \hookrightarrow \IQ$ is a counterexample; the proof can be reduced to the unital case. - property: cogenerator proof: 'We apply this lemma to the collection of fields: Any non-zero rng homomorphism from a field to a rng must be injective, and for every infinite cardinal $\kappa$ the field of rational functions in $\kappa$ variables has cardinality $\geq \kappa$.' @@ -61,9 +60,9 @@ unsatisfied_properties: proof: Assume that $\coprod_n \IZ \to \prod_n \IZ$ is an epimorphism in $\Rng$. Then $((\coprod_n \IZ)^+)^{\ab} \to \prod_n \IZ$ would be an epimorphism in $\CRing$, where $(-)^+$ denotes the unitalization and $(-)^{\ab}$ the abelianization. But if $R \to S$ is an epimorphism of commutative rings, then $\card(S) \leq \card(R)$ by SP/04W0. Since $((\coprod_n \IZ)^+)^{\ab}$ is countable and $\prod_n \IZ$ is not, we get a contradiction. - property: coregular - proof: 'We can copy the proof for $\Ring$. In short, the inclusion of diagonal matrices $\IQ^2 \hookrightarrow M_2(\IQ)$ is a regular monomorphism, but becomes zero after taking the pushout with $p_1 : \IQ^2 \twoheadrightarrow \IQ$ because $M_2(\IQ)$ is simple.' + proof: 'We can copy the proof for $\Ring$, i.e. the proof for $\Alg(R)$. In short, the inclusion of diagonal matrices $\IQ^2 \hookrightarrow M_2(\IQ)$ is a regular monomorphism, but becomes zero after taking the pushout with $p_1 : \IQ^2 \twoheadrightarrow \IQ$ because $M_2(\IQ)$ is simple.' references: - - ring_not_coregular + - alg_not_coregular - property: regular quotient object classifier proof: 'Assume that $\Rng$ has a regular quotient object classifier $P$. Consider the functor $N : \Ab \to \Rng$ that equips an abelian group with zero multiplication. It is fully faithful and has a left adjoint mapping a rng $R$ to the abelian group $R/R^2$. If $R$ is a rng with zero multiplication and $R \to S$ is a surjective homomorphism, then $S$ has zero multiplication. Therefore, the assumptions of Lemma 1 here (dualized) apply and we conclude that $P/P^2$ is a regular quotient object classifier of $\Ab$. But we already know that $\Ab$ has no such object (in fact, the only additive categories with such an object are trivial by MSE/4086192).' @@ -86,8 +85,6 @@ unsatisfied_properties: via $$p \mapsto \begin{pmatrix} 1 & 0 \\ 0 & 0 \end{pmatrix}, \quad q \mapsto \begin{pmatrix} 1 & 1 \\ 0 & 0 \end{pmatrix}.$$ From here, the rest of the proof is similar to the one for $\Ring$. - references: - - ring_no_effective_cocongruences special_objects: initial object: diff --git a/database/data/categories/SemiGrp.yaml b/database/data/categories/SemiGrp.yaml index 022420ac..5719dfee 100644 --- a/database/data/categories/SemiGrp.yaml +++ b/database/data/categories/SemiGrp.yaml @@ -12,6 +12,7 @@ tags: related: - Grp - Mon + - Rng satisfied_properties: - property: locally small diff --git a/database/data/categories/SetxSet.yaml b/database/data/categories/SetxSet.yaml index fc1170fd..59151c09 100644 --- a/database/data/categories/SetxSet.yaml +++ b/database/data/categories/SetxSet.yaml @@ -3,7 +3,7 @@ name: category of pairs of sets notation: $\Set \times \Set$ objects: pairs $(A,B)$ of sets $A$ and $B$ morphisms: A morphism $(A,B) \to (C,D)$ consists of a map $A \to C$ and a map $B \to D$. -description: This is an example of the product of categories. It inherits most (but not all) properties from $\Set$. It can also be seen as the category $\Sh(1+1)$ of sheaves on a discrete space with two points, and also as the slice category $\Set/(1+1)$. +description: This category is an example of the product of categories. It inherits most (but not all) properties from $\Set$. It can also be seen as the category $\Sh(1+1)$ of sheaves on a discrete space with two points, and also as the slice category $\Set/(1+1)$. nlab_link: null tags: diff --git a/database/data/categories/Sh(X).yaml b/database/data/categories/Sh(X).yaml index 6aac48ba..c69c870b 100644 --- a/database/data/categories/Sh(X).yaml +++ b/database/data/categories/Sh(X).yaml @@ -17,6 +17,7 @@ related: - Sh(X,Ab) comments: + # TODO: maybe create separate entries for specific spaces X - It is likely that none of the currently remaining unknown properties (locally finitely presentable, ℵ₁-accessible, etc.) are satisfied for a generic space $X$, but we need to make this precise by adding additional requirements to $X$. Maybe we need to create separate entries for specific spaces $X$. - See MSE/5140378 in particular for conditions when $\Sh(X)$ is locally finitely presentable. diff --git a/database/data/categories/Sh(X,Ab).yaml b/database/data/categories/Sh(X,Ab).yaml index 5fc15918..868f7ff3 100644 --- a/database/data/categories/Sh(X,Ab).yaml +++ b/database/data/categories/Sh(X,Ab).yaml @@ -15,6 +15,7 @@ related: - Sh(X) comments: + # TODO: maybe create separate entries for specific spaces X - It is likely that neither of the currently remaining unknown properties (finitary algebraic, locally finitely presentable, CSP, etc.) are satisfied for a generic space $X$, but we need to make this precise by adding additional requirements to $X$. Maybe we need to create separate entries for specific spaces $X$. satisfied_properties: diff --git a/database/data/categories/TorsAb.yaml b/database/data/categories/TorsAb.yaml index f65fcd95..a80fee06 100644 --- a/database/data/categories/TorsAb.yaml +++ b/database/data/categories/TorsAb.yaml @@ -3,7 +3,7 @@ name: category of torsion abelian groups notation: $\TorsAb$ objects: torsion abelian groups morphisms: group homomorphisms -description: This is a Grothendieck abelian category containing all finite abelian groups. +description: This category is a Grothendieck abelian category containing all finite abelian groups. nlab_link: https://ncatlab.org/nlab/show/torsion+subgroup tags: @@ -31,13 +31,9 @@ satisfied_properties: - property: normal proof: 'If $f : A \to B$ is a monomorphism, it is injective (see below). In $\Ab$ it is then the kernel of $B \to B/f(A)$. Since $B/f(A)$ is torsion, it is also the kernel in $\TorsAb$.' - references: - - ab_abelian - property: conormal proof: 'If $f : A \to B$ is an epimorphism, it is surjective (see below). In $\Ab$ it is then the cokernel of its kernel $K \hookrightarrow A$. Since $K$ is torsion, it is also the cokernel in $\TorsAb$.' - references: - - ab_abelian - property: finitely accessible proof: We already know that (filtered) colimits exist and are preserved by the forgetful functor to $\Ab$. Every torsion abelian group is the filtered colimit of its finitely generated subgroups (which are finite). These are finitely presentable in $\Ab$, hence also in $\TorsAb$. diff --git a/database/data/categories/TorsFreeAb.yaml b/database/data/categories/TorsFreeAb.yaml index 56130f69..dc820eb3 100644 --- a/database/data/categories/TorsFreeAb.yaml +++ b/database/data/categories/TorsFreeAb.yaml @@ -3,7 +3,7 @@ name: category of torsion-free abelian groups notation: $\TorsFreeAb$ objects: torsion-free abelian groups morphisms: group homomorphisms -description: This is a typical example of a well-behaved additive category which is not abelian. It contains the category of free abelian groups. +description: This category is a typical example of a well-behaved additive category which is not abelian. It contains the category of free abelian groups. nlab_link: https://ncatlab.org/nlab/show/torsion-free+module tags: diff --git a/database/data/categories/Vect.yaml b/database/data/categories/Vect.yaml index ff2e0869..d7045dca 100644 --- a/database/data/categories/Vect.yaml +++ b/database/data/categories/Vect.yaml @@ -3,31 +3,22 @@ name: category of vector spaces notation: $\Vect_K$ objects: vector spaces over a field $K$ morphisms: linear maps -description: This is a special case of the category of modules over a ring, where the ring is a field. It is the prototype of a split abelian category. +description: This is the special case of $R{-}\Mod$ where $R$ is a field $K$. It is the prototype of a split abelian category. nlab_link: https://ncatlab.org/nlab/show/Vect +parent: R-Mod_div tags: - algebra related: - - R-Mod - - R-Mod_div - - FinVect_f - - FinVect_c - - FinVect_u + - FinVect - FiltVect - FreeAb satisfied_properties: - - property: locally small - proof: There is a forgetful functor $\Vect \to \Set$ and $\Set$ is locally small. - - property: split abelian proof: That $\Vect$ is abelian is a standard fact, see Mac Lane, Ch. VIII. Furthermore, it is a fact from linear algebra that every subspace has a complement, which is why every short exact sequence splits. - - property: finitary algebraic - proof: Take the algebraic theory of a vector space. - - property: extremal generator proof: The one-dimensional vector space $K$ is an extremal generator since it represents the forgetful functor $\Vect_K \to \Set$ which is faithful and conservative. check_redundancy: false @@ -37,12 +28,7 @@ satisfied_properties: proof: 'The one-dimensional vector space $K$ is an extremal cogenerator. To show this, using this result, since $\Vect_K$ is balanced, it suffices to show that $K$ is a cogenerator. For this, suppose we have two unequal vectors $x, y \in V$. Then $x - y \ne 0$, so there exists a functional $\varphi : V \to K$ such that $\varphi(x - y) \ne 0$. It follows that $\varphi(x) \ne \varphi(y)$.' check_redundancy: false -unsatisfied_properties: - - property: skeletal - proof: This is trivial. - - - property: CSP - proof: The canonical homomorphism $\bigoplus_{n \geq 0} K \to \prod_{n \geq 0} K$ is not surjective, hence no epimorphism. +unsatisfied_properties: [] special_objects: initial object: @@ -54,7 +40,4 @@ special_objects: products: description: direct products with pointwise operations -special_morphisms: - epimorphisms: - description: surjective morphisms - proof: The forgetful functor to abelian groups is faithful and preserves colimits, hence reflects and preserves epimorphisms. Alternatively, just use the same proof as for abelian groups. +special_morphisms: {} diff --git a/database/data/categories/Z_div.yaml b/database/data/categories/Z_div.yaml index f3c24246..2697f6ca 100644 --- a/database/data/categories/Z_div.yaml +++ b/database/data/categories/Z_div.yaml @@ -3,7 +3,7 @@ name: preordered set of integers w.r.t. divisibility notation: $(\IZ,\mid)$ objects: integers morphisms: 'a unique morphism $(a,b) : a \to b$ if $a$ divides $b$' -description: This is a preordered set, not a partially ordered set, because $a$ and $-a$ divide each other, but are not equal for $a \neq 0$. Notice that this category is equivalent (but not isomorphic) to $(\IN,\mid)$. +description: This category corresponds to a preordered set, not a partially ordered set, because $a$ and $-a$ divide each other, but are not equal for $a \neq 0$. Notice that this category is equivalent (but not isomorphic) to $(\IN,\mid)$. nlab_link: null tags: diff --git a/database/data/categories/sSet.yaml b/database/data/categories/sSet.yaml index 8412ce1d..7d7339d3 100644 --- a/database/data/categories/sSet.yaml +++ b/database/data/categories/sSet.yaml @@ -3,7 +3,7 @@ name: category of simplicial sets notation: $\sSet$ objects: simplicial sets, i.e. functors $\Delta^{\op} \to \Set$ where $\Delta$ denotes the simplex category. morphisms: natural transformations -description: null +description: The category of simplicial sets provides a fundamental combinatorial framework for representing spaces and $\infty$-categories, with applications throughout algebraic topology, higher category theory, and homological algebra. nlab_link: https://ncatlab.org/nlab/show/SimpSet tags: diff --git a/database/data/functors/trivial_BG.yaml b/database/data/functors/trivial_BG.yaml index de3af686..20503576 100644 --- a/database/data/functors/trivial_BG.yaml +++ b/database/data/functors/trivial_BG.yaml @@ -1,9 +1,9 @@ id: trivial_BG name: trivial functor from the delooping notation: $!_{BG}$ -domain: BG_f +domain: BG codomain: '1' -description: 'Every category $\C$ has a unique functor $!_{\C} : \C \to 1$ into the trivial category. Here, we specify that $\C$ is the delooping of a non-trivial finite group $G$. It is a basic example of a conservative functor which is not faithful.' +description: 'Every category $\C$ has a unique functor $!_{\C} : \C \to 1$ into the trivial category. Here, we specify that $\C$ is the delooping of a non-trivial group $G$. It is a basic example of a conservative functor which is not faithful.' nlab_link: null left_adjoint: null diff --git a/database/schema/001_structures.sql b/database/schema/001_structures.sql index 4de505dc..68f5d92f 100644 --- a/database/schema/001_structures.sql +++ b/database/schema/001_structures.sql @@ -15,9 +15,11 @@ CREATE TABLE structures ( description TEXT, nlab_link TEXT CHECK (nlab_link IS NULL OR nlab_link like 'https://%'), dual_structure_id TEXT, + parent TEXT, UNIQUE (id, type), FOREIGN KEY (type) REFERENCES structure_types (type) ON DELETE RESTRICT, FOREIGN KEY (dual_structure_id, type) REFERENCES structures (id, type) ON DELETE RESTRICT + FOREIGN KEY (parent, type) REFERENCES structures (id, type) ON DELETE RESTRICT ); CREATE UNIQUE INDEX structures_lower_id_unique ON structures (lower(id)); diff --git a/database/scripts/deduce-special-morphisms.ts b/database/scripts/deduce-special-morphisms.ts index 9a73adcf..4b9cbf52 100644 --- a/database/scripts/deduce-special-morphisms.ts +++ b/database/scripts/deduce-special-morphisms.ts @@ -1,11 +1,13 @@ import { get_client } from '$shared/db' import { devlog } from '$shared/utils' +import { get_structure_parent_map } from './utils/structures' const db = get_client({ readonly: false }) export function deduce_special_morphisms() { console.info('\n--- Deduce special morphisms ---') clear_deduced_special_morphisms() + inherit_special_morphisms_from_parents() deduce_special_morphisms_by_rules() deduce_special_morphisms_of_dual_categories() } @@ -17,6 +19,58 @@ function clear_deduced_special_morphisms() { db.prepare(`DELETE FROM special_morphisms WHERE is_deduced = TRUE`).run() } +/** + * Inherit special morphism assignments from parent categories + */ +function inherit_special_morphisms_from_parents() { + type SpecialMorphism = { type: string; description: string; proof: string } + + const parent_map = get_structure_parent_map(db, 'category') + + const get_parent_special_morphisms = db.prepare<[string], SpecialMorphism>( + `SELECT type, description, proof FROM special_morphisms + WHERE category_id = ? AND is_deduced = FALSE` + ) + + const insert_special_morphism = db.prepare( + `INSERT INTO special_morphisms (category_id, type, description, proof, is_deduced) + VALUES (?, ?, ?, ?, TRUE) + ON CONFLICT (category_id, type) DO NOTHING` + ) + + let inherited_count = 0 + + for (const [category_id, parent_id] of parent_map) { + const inherited_morphisms = new Map() + let current_id = parent_id + + while (current_id) { + const parent_entries = get_parent_special_morphisms.all(current_id) + + for (const entry of parent_entries) { + if (!inherited_morphisms.has(entry.type)) { + inherited_morphisms.set(entry.type, entry) + } + } + + current_id = parent_map.get(current_id) ?? null + } + + for (const [type, entry] of inherited_morphisms) { + const proof = `This follows from the parent.` + const res = insert_special_morphism.run( + category_id, + type, + entry.description, + proof + ) + inherited_count += res.changes + } + } + + devlog(`Inherited ${inherited_count} special morphisms from parents`) +} + /** * Deduces special morphisms from the rules from the special_morphism_rules * table. We ignore duplicate assignments here because of overlaps diff --git a/database/scripts/deduce-special-objects.ts b/database/scripts/deduce-special-objects.ts index c65c5791..c99843c0 100644 --- a/database/scripts/deduce-special-objects.ts +++ b/database/scripts/deduce-special-objects.ts @@ -1,11 +1,13 @@ import { get_client } from '$shared/db' import { devlog } from '$shared/utils' +import { get_structure_parent_map } from './utils/structures' const db = get_client({ readonly: false }) export function deduce_special_objects() { console.info('\n--- Deduce special objects ---') clear_deduced_special_objects() + inherit_special_objects_from_parents() deduce_special_objects_of_dual_categories() } @@ -16,6 +18,52 @@ function clear_deduced_special_objects() { db.prepare(`DELETE FROM special_objects WHERE is_deduced = TRUE`).run() } +/** + * Inherit special object assignments from parent categories + */ +function inherit_special_objects_from_parents() { + type SpecialObject = { type: string; description: string } + + const parent_map = get_structure_parent_map(db, 'category') + + const get_parent_special_objects = db.prepare<[string], SpecialObject>( + `SELECT type, description FROM special_objects + WHERE category_id = ? AND is_deduced = FALSE` + ) + + const insert_special_object = db.prepare( + `INSERT INTO special_objects (category_id, type, description, is_deduced) + VALUES (?, ?, ?, TRUE) + ON CONFLICT (category_id, type) DO NOTHING` + ) + + let inherited_count = 0 + + for (const [category_id, parent_id] of parent_map) { + const inherited_objects = new Map() + let current_id = parent_id + + while (current_id) { + const parent_entries = get_parent_special_objects.all(current_id) + + for (const entry of parent_entries) { + if (!inherited_objects.has(entry.type)) { + inherited_objects.set(entry.type, entry) + } + } + + current_id = parent_map.get(current_id) ?? null + } + + for (const [type, entry] of inherited_objects) { + const res = insert_special_object.run(category_id, type, entry.description) + inherited_count += res.changes + } + } + + devlog(`Inherited ${inherited_count} special objects from parents`) +} + /** * Deduce special objects in dual categories. * For example, initial objects in C describe the terminal objects in C^op. diff --git a/database/scripts/deduce-structure-properties.ts b/database/scripts/deduce-structure-properties.ts index a17f331b..478a94cc 100644 --- a/database/scripts/deduce-structure-properties.ts +++ b/database/scripts/deduce-structure-properties.ts @@ -13,7 +13,12 @@ import { } from './utils/properties' import { get_contradiction_string, get_proof_string } from './utils/implications' import { type StructureType, STRUCTURE_TYPES_WITH_DUALS } from '$shared/config' -import { get_structures, is_dual_structure, type StructureMeta } from './utils/structures' +import { + get_structure_parent_map, + get_structures, + is_dual_structure, + type StructureMeta +} from './utils/structures' import { get_normalized_implications, NormalizedImplication } from '$shared/implications' import { devlog } from '$shared/utils' @@ -230,6 +235,62 @@ function delete_deduced_properties(db: Database, type: StructureType) { ).run(type) } +/** + * Inherits satisfied/unsatisfied properties from parent structures. + */ +function inherit_properties_from_parents(db: Database, type: StructureType) { + type PropertyAssignment = { property_id: string; is_satisfied: 0 | 1 } + + const parent_map = get_structure_parent_map(db, type) + + const get_assignments = db.prepare<[string], PropertyAssignment>( + `SELECT property_id, is_satisfied + FROM property_assignments + WHERE structure_id = ? AND is_satisfied IS NOT NULL + ORDER BY id` + ) + + const property_insert = db.prepare( + `INSERT INTO property_assignments + (structure_id, property_id, type, is_satisfied, proof, is_deduced) + VALUES (?, ?, ?, ?, ?, TRUE) + ON CONFLICT (structure_id, property_id) DO NOTHING` + ) + + let inherited_count = 0 + + for (const [structure_id, parent_id] of parent_map) { + const inherited_properties = new Map() + let current_id = parent_id + + while (current_id) { + const parent_assignments = get_assignments.all(current_id) + + for (const assignment of parent_assignments) { + if (!inherited_properties.has(assignment.property_id)) { + inherited_properties.set(assignment.property_id, assignment) + } + } + + current_id = parent_map.get(current_id) ?? null + } + + for (const [property_id, assignment] of inherited_properties) { + const proof = `This follows from the parent.` + const res = property_insert.run( + structure_id, + property_id, + type, + assignment.is_satisfied, + proof + ) + inherited_count += res.changes + } + } + + devlog(`Inherited ${inherited_count} properties from parents`) +} + /** * Main function: Deduce properties of structures from given ones * by using the stored implications. @@ -240,6 +301,7 @@ export function deduce_properties_for_structures(type: StructureType) { const db = get_client({ readonly: false }) delete_deduced_properties(db, type) + inherit_properties_from_parents(db, type) const implications = get_normalized_implications(db, type) const structures = get_structures(db, type) diff --git a/database/scripts/expected-data/decided-categories.json b/database/scripts/expected-data/decided-categories.json index ff088f53..f20e5e19 100644 --- a/database/scripts/expected-data/decided-categories.json +++ b/database/scripts/expected-data/decided-categories.json @@ -5,7 +5,13 @@ "Ab", "Grp", "N", + "BG", + "BG_c", + "BG_f", + "BG_u", "R-Mod", + "R-Mod_div", + "R-Mod_non_ss", "CRing", "Ring", "FinSet", @@ -16,6 +22,7 @@ "Top_op", "Top_*", "Vect", + "FinVect", "FinVect_f", "FinVect_c", "FinVect_u", diff --git a/database/scripts/seed.ts b/database/scripts/seed.ts index bba87c08..fb05670b 100644 --- a/database/scripts/seed.ts +++ b/database/scripts/seed.ts @@ -1,12 +1,11 @@ import path from 'node:path' -import { seed_file, seed_files } from './utils/seed.helpers' +import { get_property_assignments, seed_file, seed_files } from './utils/seed.helpers' import { get_client } from '$shared/db' import type { CategoryYaml, ConfigYaml, ImplicationYaml, FunctorYaml, - PropertyEntry, SpecialMorphismRuleYaml, StructureYaml, PropertyYaml, @@ -199,9 +198,9 @@ function seed_structures({ const structure_insert = db.prepare( `INSERT INTO structures ( id, type, name, notation, description, nlab_link, - dual_structure_id + dual_structure_id, parent ) - VALUES (?, ?, ?, ?, ?, ?, ?)` + VALUES (?, ?, ?, ?, ?, ?, ?, ?)` ) const tag_insert = db.prepare( @@ -232,28 +231,6 @@ function seed_structures({ ) VALUES (?, ?, ?, ?)` ) - function insert_property_assignments( - structure_id: string, - entries: PropertyEntry[], - is_satisfied: 0 | 1 | null - ) { - for (const entry of entries) { - property_assignment_insert.run( - structure_id, - entry.property, - type, - is_satisfied, - entry.proof, - entry.check_redundancy === false ? 0 : 1, - entry.label || null - ) - - for (const ref of entry.references ?? []) { - proof_reference_insert.run(structure_id, entry.property, type, ref) - } - } - } - function insert_structure(structure: T) { const properties_are_disjoint = are_disjoint( [ @@ -276,7 +253,8 @@ function seed_structures({ structure.notation, structure.description, structure.nlab_link, - structure.dual || null + structure.dual || null, + structure.parent || null ) if (!structure.tags.length) { @@ -296,13 +274,23 @@ function seed_structures({ related_insert.run(structure.id, related, type) } - insert_property_assignments(structure.id, structure.satisfied_properties, 1) - insert_property_assignments(structure.id, structure.unsatisfied_properties, 0) - insert_property_assignments( - structure.id, - structure.undecidable_properties ?? [], - null - ) + const property_assignments = get_property_assignments(structure) + + for (const entry of property_assignments) { + property_assignment_insert.run( + structure.id, + entry.property, + type, + entry.is_satisfied, + entry.proof, + entry.check_redundancy === false ? 0 : 1, + entry.label || null + ) + + for (const ref of entry.references ?? []) { + proof_reference_insert.run(structure.id, entry.property, type, ref) + } + } if (extra) extra(structure) } @@ -332,12 +320,10 @@ function insert_category(category: CategoryYaml) { category_insert.run(category.id, category.objects, category.morphisms) for (const [type, entry] of Object.entries(category.special_objects)) { - if (!entry) continue special_object_insert.run(category.id, type, entry.description) } for (const [type, entry] of Object.entries(category.special_morphisms)) { - if (!entry) continue special_morphism_insert.run(category.id, type, entry.description, entry.proof) } } diff --git a/database/scripts/utils/seed.helpers.ts b/database/scripts/utils/seed.helpers.ts index 93367516..70bf9cd2 100644 --- a/database/scripts/utils/seed.helpers.ts +++ b/database/scripts/utils/seed.helpers.ts @@ -3,6 +3,7 @@ import path from 'node:path' import fs from 'node:fs' import YAML from 'yaml' import { devlog } from '$shared/utils' +import { StructureYaml } from './seed.types' function read_yaml_file(...parts: string[]): T { const content = fs.readFileSync(path.join(...parts), 'utf8') @@ -66,3 +67,20 @@ export function seed_files( process.exit(1) } } + +export function get_property_assignments(structure: StructureYaml) { + return [ + ...structure.satisfied_properties.map((entry) => ({ + ...entry, + is_satisfied: 1 as const + })), + ...structure.unsatisfied_properties.map((entry) => ({ + ...entry, + is_satisfied: 0 as const + })), + ...(structure.undecidable_properties ?? []).map((entry) => ({ + ...entry, + is_satisfied: null + })) + ] +} diff --git a/database/scripts/utils/seed.types.ts b/database/scripts/utils/seed.types.ts index 1bf2830e..173af4f6 100644 --- a/database/scripts/utils/seed.types.ts +++ b/database/scripts/utils/seed.types.ts @@ -28,7 +28,7 @@ export type SpecialMorphismRuleYaml = { proof: string } -export type PropertyEntry = { +type PropertyEntry = { property: string proof: string check_redundancy?: boolean @@ -54,6 +54,7 @@ export type StructureYaml = { tags: string[] related: string[] dual?: string + parent?: string satisfied_properties: PropertyEntry[] unsatisfied_properties: PropertyEntry[] undecidable_properties?: PropertyEntry[] @@ -63,8 +64,8 @@ export type StructureYaml = { export type CategoryYaml = StructureYaml & { objects: string morphisms: string - special_objects: Record - special_morphisms: Record + special_objects: Record + special_morphisms: Record } export type FunctorYaml = StructureYaml & { diff --git a/database/scripts/utils/structures.ts b/database/scripts/utils/structures.ts index 17c6848e..b6b91f6f 100644 --- a/database/scripts/utils/structures.ts +++ b/database/scripts/utils/structures.ts @@ -83,3 +83,17 @@ export function is_dual_structure( ): structure is StructureMeta & { dual: string } { return Boolean(structure.dual) && structure.name.toLowerCase().startsWith('dual') } + +/** + * Returns a map that assigns to each structure its parent, if present. + */ +export function get_structure_parent_map(db: Database, type: StructureType) { + const structures = db + .prepare< + [StructureType], + { id: string; parent: string | null } + >(`SELECT id, parent FROM structures WHERE type = ?`) + .all(type) + + return new Map(structures.map((structure) => [structure.id, structure.parent])) +} diff --git a/src/lib/commons/types.ts b/src/lib/commons/types.ts index 21266777..8fac8bf2 100644 --- a/src/lib/commons/types.ts +++ b/src/lib/commons/types.ts @@ -20,6 +20,9 @@ export type StructureDisplay = { dual_structure_id: string | null dual_structure_name: string | null dual_structure_notation: string | null + parent: string | null + parent_name: string | null + parent_notation: string | null } export type MappedTypes = Record @@ -120,6 +123,7 @@ export type StructureDetails = { type: StructureType structure: StructureDisplay related_structures: RelatedStructure[] + children: RelatedStructure[] tags: string[] satisfied_properties: PropertyAssignmentDisplay[] unsatisfied_properties: PropertyAssignmentDisplay[] diff --git a/src/lib/server/fetchers/structure.ts b/src/lib/server/fetchers/structure.ts index 0aab7b5b..b4727cb3 100644 --- a/src/lib/server/fetchers/structure.ts +++ b/src/lib/server/fetchers/structure.ts @@ -23,9 +23,13 @@ export function fetch_structure(type: StructureType, id: string): StructureDetai s.nlab_link, s.dual_structure_id, ds.name AS dual_structure_name, - ds.notation AS dual_structure_notation + ds.notation AS dual_structure_notation, + s.parent, + ps.name AS parent_name, + ps.notation AS parent_notation FROM structures s LEFT JOIN structures ds ON ds.id = s.dual_structure_id + LEFT JOIN structures ps ON ps.id = s.parent WHERE s.id = ?` ) .get(id) @@ -37,13 +41,20 @@ export function fetch_structure(type: StructureType, id: string): StructureDetai const related_structures = db .prepare<[string], RelatedStructure>( `SELECT - c.id, - c.name, - c.notation + s.id, + s.name, + s.notation FROM related_structures r - INNER JOIN structures c ON c.id = r.related_structure_id + INNER JOIN structures s ON s.id = r.related_structure_id WHERE r.structure_id = ? - ORDER BY lower(c.name)` + ORDER BY lower(s.name)` + ) + .all(id) + + const children = db + .prepare<[string], RelatedStructure>( + `SELECT s.id, s.name, s.notation + FROM structures s WHERE s.parent = ?` ) .all(id) @@ -134,6 +145,7 @@ export function fetch_structure(type: StructureType, id: string): StructureDetai return { type, structure, + children, related_structures, tags, satisfied_properties, diff --git a/src/pages/StructureDetailPage.svelte b/src/pages/StructureDetailPage.svelte index 4b92293d..b117af77 100644 --- a/src/pages/StructureDetailPage.svelte +++ b/src/pages/StructureDetailPage.svelte @@ -21,6 +21,7 @@ type: StructureType structure: StructureDisplay related_structures: RelatedStructure[] + children: RelatedStructure[] tags: string[] satisfied_properties: PropertyAssignmentDisplay[] unsatisfied_properties: PropertyAssignmentDisplay[] @@ -37,6 +38,7 @@ type, structure, related_structures, + children, tags, satisfied_properties, unsatisfied_properties, @@ -65,6 +67,28 @@ {@render definition?.()} + {#if structure.parent} +
  • + Parent: + + {@html structure.parent_notation} + +
  • + {/if} + + {#if children.length} +
  • + Children: + {#each children as { id, name, notation }, i} + + {@html notation} + {#if i < children.length - 1} + ,  + {/if} + {/each} +
  • + {/if} + {#if related_structures.length}
  • Related {PLURALS[type]}: diff --git a/tests/categories.spec.ts b/tests/categories.spec.ts index b3717bb9..e2886367 100644 --- a/tests/categories.spec.ts +++ b/tests/categories.spec.ts @@ -172,6 +172,32 @@ test('user may see undecidable properties', async ({ page }) => { await expect(link).toBeVisible() }) +test('user may see properties that cannot be determined in a family of categories', async ({ + page +}) => { + await page.goto('/category/BG') + + await expect( + page.getByRole('heading', { + name: 'delooping of a group', + exact: true + }) + ).toBeVisible() + + const undecidable_properties_section = page + .locator('section', { + hasText: 'Undecidable properties' + }) + .first() + + const link = undecidable_properties_section.getByRole('link', { + name: 'finite', + exact: true + }) + + await expect(link).toBeVisible() +}) + test('user can navigate to a related category', async ({ page }) => { await page.goto('/category/FinSet', { waitUntil: 'networkidle' }) @@ -225,6 +251,47 @@ test('user can navigate to the dual category if it exists in the database', asyn await expect(page).toHaveURL('/category/Set_op') }) +test('user can navigate to a child category', async ({ page }) => { + await page.goto('/category/BG', { waitUntil: 'networkidle' }) + + await page + .getByRole('link', { + name: 'delooping of a non-trivial finite group', + exact: true + }) + .click() + + await expect( + page.getByRole('heading', { + name: 'delooping of a non-trivial finite group', + exact: true + }) + ).toBeVisible() + + await expect(page).toHaveURL('/category/BG_f') +}) + +test('user can navigate to a parent category', async ({ page }) => { + await page.goto('/category/Ring', { waitUntil: 'networkidle' }) + + await page + .getByRole('link', { + name: 'category of algebras', + exact: true + }) + .first() + .click() + + await expect( + page.getByRole('heading', { + name: 'category of algebras', + exact: true + }) + ).toBeVisible() + + await expect(page).toHaveURL('/category/Alg(R)') +}) + test('user can open and close a proof for a property of a category', async ({ page }) => { await page.goto('/category/Grp', { waitUntil: 'networkidle' }) @@ -295,6 +362,38 @@ test('user can open a proof for a deduced unsatisfied property of a category', a ).toBeVisible() }) +test('user can open a proof for an inherited satisfied property of a category', async ({ + page +}) => { + await page.goto('/category/Ab', { waitUntil: 'networkidle' }) + + const claim = page.locator('li', { has: page.getByText('is abelian') }) + + await expect(claim).toBeVisible() + + await claim.locator('button').click() + + const popup = page.locator('.popup').filter({ hasText: 'Proof' }) + + await expect(popup.getByText('This follows from the parent.')).toBeVisible() +}) + +test('user can open a proof for an inherited unsatisfied property of a category', async ({ + page +}) => { + await page.goto('/category/BG_f', { waitUntil: 'networkidle' }) + + const claim = page.locator('li', { has: page.getByText('is not thin') }) + + await expect(claim).toBeVisible() + + await claim.locator('button').click() + + const popup = page.locator('.popup').filter({ hasText: 'Proof' }) + + await expect(popup.getByText('This follows from the parent.')).toBeVisible() +}) + test('user sees functors associated with the given category', async ({ page }) => { await page.goto('/category/Ab', { waitUntil: 'networkidle' })