This commit is contained in:
Boris Marinov 2021-08-23 21:49:05 +03:00
parent 593b095612
commit 9efd065cb1
5 changed files with 679 additions and 21 deletions

View File

@ -31,4 +31,10 @@ In this book, we will visit those formalisms and along the way, we would see all
Acknowledgements
===
I like to thank
Thanks to my wife Dimitrina, who has no issue with taking after our daughter while I sit here and write my book.
Thanks to my high-school arts teacher, Mrs Georgieva who told me that I have some tallent, but I have to work.
Thanks to Prathyush Pramod who encouraged me to finish the book and is also helping me out with it.
And also to everyone else who submitted feedback and helped me fix some of the numerous errors that I made - knowing myself, I know that there are more.

View File

@ -1,67 +1,119 @@
---
layout: default
title: Functors
---
Functors
===
With this chapter, we will change the tactic a bit, (as I am sure you are a bit tired of jumping through different subjects) and we will examine some purely categorical concepts, using the structures that we saw so far as context. We will also generalize some of the concepts that we saw in these structures so they are valid for all categories.
This chapter we will change the tactic a bit (as I am sure you are a bit tired of jumping through different subjects) and we will examine some purely categorical concepts, using the structures that we saw so far as context. We will also generalize some of the concepts that we saw in these structures so they are valid for all categories.
Categories we saw so far
===
We already saw a many different types of categories, like categories that have just one *object* (monoids, groups) and categories that have only one *morphism* between any two objects (preorders, partial orders).
We already learned about many different types of categories: categories that have just one *object* (monoids, groups)
![Types of categories](category_types.svg)
![Types of categories](category_types_monoid.svg)
We also defined a lot of categories, most notably the ones based on logics/programming languages, but also less serious categories, as for example the color-mixing one
Categories that have only one *morphism* between any two objects (preorders, partial orders).
![Types of categories](category_types.svg)
![Types of categories](category_types_order.svg)
We saw that we can make a category out of everything, as for example our city's road system, or a soccer ranglist starring me and my grandmother.
We also defined a lot of categories of different things most notably the ones based on logics/programming languages.
While examining all of this, we also saw the mother of all categories - the category of sets, as well as various *subcategories* to that category, as for example the set inclusion orders. We saw that many other categories are similar to subcategories of the category of sets.
![Category of programming languages](category_programming.svg)
But also less serious categories, as for example the color-mixing one
![Category of colors](color_mixing_category.svg)
And most importantly, we learned that we can make a category out of everything, from our city's road system, to soccer ranklist starring me and my grandmother. All these fall in the big hm... category of finite categories.
![Category of colors](finite_categories.svg)
And we saw one category that is neither a type, nor a domain, but it deserves to be mentioned - the category of sets and functions.
![Set category](category_set.svg)
But how can we utilize the insights that we get from the fact that so many different things are actually one and the same thing in disquise? To do so we must specify ways to connect categories to one another. This is the topic of this chapter.
As various *subcategories* to that category, as for example the set inclusion orders. We saw that many other categories are similar to subcategories of the category of sets.
![Set category](category_set.svg)
Now, to utilize the insights that we get from recognizing all of these structures as categories, we will specify ways to connect categories to one another.
Categorical Isomorphisms
===
In chapter 1 we talked about set isomorphisms, which establish the equivalence between two sets. If you remember a set isomorphism consisted of two functions between the sets that when composed are equivalent to the identity function. Or more simply put, of one invertible function.
In chapter 1 we talked about set isomorphisms, which establish an equivalence between two sets. If you remember a set isomorphism is a two-way function between two sets. Or alternatively, you can think of an isomorphism as consisting of two "twin" functions each of which equals identity when composed with the other.
![Set isomorphism](set_isomorphism.svg)
![Set isomorphism](set_isomorphism_invertable.svg)
Then in chapter 4 we mentioned order isomorphisms, which were just set isomorphisms, with the extra condition that not only the objects, but the arrows should be the same, so for any two elements **a** and **b**, *a ≤ b** iff **F(a) ≤ F(b)**.
Then, in chapter 4 we mentioned order isomorphisms, which were like set isomorphisms, but with one extra condition - aside from being there, the function(s) that defines the isomorphism has to be *order-preserving*, so for any two objects **a** and **b**, *a ≤ b** iff **F(a) ≤ F(b)**.
![Order isomorphism](order_isomorphism.svg)
It's a little (but not a lot) more complex to extend this definition to work for categories as well. Given two categories, an isomorphism between them is an invertible function between the underlying sets of objects, plus an isomorphism between the morphisms that connect them.
We can extend this definition to work for categories as well. Unlike orders, categories can have more than one morphism between two objects, so the definition would be a little (but not a lot) more complex: Given two categories, an isomorphism between them is an invertible function between the underlying sets of objects, *and* an invertible function between the morphisms that connect them, which maps each morphism to a morphism with the same signature.
![Category isomorphism](category_isomorphism.svg)
Although longer, this definition is the same that we have for orders - it is just that orders can have at most one morphism between two objects, so it's obvious from the signature which corresponds to which - all we have to do is to verify that the morphisms exist, which is taken care of by the additional condition.
Although longer, this definition is the same as the one we have for orders - it is just that with orders we don't have to specify which isomorphism corresponds to which (as there can be only one morphism) and so all we have to do is to verify that the corresponding morphisms actually exist (which is taken care of by the added condition).
So those are categorical isomorphisms. But isomorphisms are actually almost useless - honestly, if two categories are isomorphic, then they are so similar that you can hardly see the difference between one and the other. It will be non-essential.
So those are categorical isomorphisms. But isomorphisms are actually very rare (the only categorical isomorphism that comes to mind is the Curry-Howard-Lambek isomorphism from the last chapter). If two categories are isomorphic, then they are so similar that it would be more accurately counted as different representations of the same category.
[Category isomorphism squares](category_isomorphism_squares.svg)
More useful than isomorphisms, which are two-way connections between categories, are one-way connections between them, which we will examine next.
Functors
===
Unlike two-way relations between two categories may be established only in a very limited set of cases, the one-way relations are very common.
Having seen isomorphisms, which are the equivalent of two-way functions between categories, we can imagine how the equivalent one-way functions would look like, they are called *functors*. And a functor between two categories (let's call them **A** and **B**) consists of one function that maps the *objects* of **A** to the objects of **B** and one function that maps all morphisms of **A** to morphisms of **B**.
![Functor](functor.svg)
Also functors should *preserve identities* i.e. all identity morphisms should be mapped to identity morphisms.
![Functor](functor_identity.svg)
And they should also *preserve composition* i.e. for any two morphisms **f** and **g**, the morphism that corresponds to their composition **F(g f)** in the source category should be the same as the morphism that corresponds to the composition of their counterparts in the target directory **F(g) F(f)**.
![Functor](functor_composition.svg)
And this is all there is to it about functors - simple but powerful idea.
Endofunctors
---
Functors in programming
===
---
Functors as selections
---
Functors as maps
===
---
If we take the
Diagrams
===
---
Hom functors
---
Natural transformations
===
Limits
===
Representable functors
===
Representable functors are set-valued functors that are isomorphic to the Hom functor
A Hom-functor can always be converted to any set-valued functor (Yoneda lemma). But not the other way around
So a functor is representable when we can convert its values to values of the Hom functor
Yoneda Lemma
===

View File

@ -0,0 +1,274 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="595.3"
height="200"
version="1.1"
id="svg9949"
sodipodi:docname="category_types.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata9955">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs9953" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1016"
id="namedview9951"
showgrid="false"
inkscape:zoom="1.6724448"
inkscape:cx="170.29153"
inkscape:cy="100"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg9949"
inkscape:document-rotation="0" />
<g
transform="matrix(.47127 0 0 .46783 157.85 -68.789)"
id="g9947">
<ellipse
cy="361.31604"
cx="12.163363"
stroke-miterlimit="10"
rx="61.663685"
ry="58.56144"
id="ellipse9933"
style="opacity:0.13999999;stroke:#000000;stroke-width:6.16305017;stroke-miterlimit:10" />
<ellipse
cy="353.23264"
cx="1.5766022"
stroke-miterlimit="10"
rx="61.663685"
ry="58.56144"
id="ellipse9941"
style="fill:#e1e1e1;stroke:#6b6c6f;stroke-width:10.93830013;stroke-miterlimit:10;stroke-opacity:1" />
<g
id="g11563"
transform="translate(-309.48657,-30.262883)">
<g
stroke-miterlimit="10"
id="g9939"
transform="matrix(0.47831212,0,0,0.48430201,139.77588,155.01519)"
style="fill:none;stroke:#6d6d6d;stroke-width:6.38899994;stroke-miterlimit:10">
<path
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z"
transform="matrix(0.06166,0.69487,-0.648,0.06164,394.029,56.19)"
id="path9935"
inkscape:connector-curvature="0"
style="stroke-width:35.52600098" />
<path
d="M 382.5,152.612 C 331.334,225.435 280.133,213.588 257.986,179.516 241.51,154.168 246.13,86.543 317.498,86.173"
transform="matrix(0.03241,1.30729,-1.23778,0.02809,454.669,-133.846)"
id="path9937"
inkscape:connector-curvature="0"
style="stroke-width:10.64900017;paint-order:markers fill stroke" />
</g>
</g>
<g
id="g11563-1"
transform="matrix(0.42716001,0.91082455,-0.89757608,0.42716001,209.64087,-94.070466)">
<g
stroke-miterlimit="10"
id="g9939-3"
transform="matrix(0.47831212,0,0,0.48430201,139.77588,155.01519)"
style="fill:none;stroke:#6d6d6d;stroke-width:6.38899994;stroke-miterlimit:10">
<path
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z"
transform="matrix(0.06166,0.69487,-0.648,0.06164,394.029,56.19)"
id="path9935-3"
inkscape:connector-curvature="0"
style="stroke-width:35.52600098" />
<path
d="M 382.5,152.612 C 331.334,225.435 280.133,213.588 257.986,179.516 241.51,154.168 246.13,86.543 317.498,86.173"
transform="matrix(0.03241,1.30729,-1.23778,0.02809,454.669,-133.846)"
id="path9937-9"
inkscape:connector-curvature="0"
style="stroke-width:10.64900017;paint-order:markers fill stroke" />
</g>
</g>
<g
id="g11563-4"
transform="matrix(-0.60003475,0.80585624,-0.79413459,-0.60003473,497.19481,324.25398)">
<g
stroke-miterlimit="10"
id="g9939-4"
transform="matrix(0.47831212,0,0,0.48430201,139.77588,155.01519)"
style="fill:none;stroke:#6d6d6d;stroke-width:6.38899994;stroke-miterlimit:10">
<path
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z"
transform="matrix(0.06166,0.69487,-0.648,0.06164,394.029,56.19)"
id="path9935-9"
inkscape:connector-curvature="0"
style="stroke-width:35.52600098" />
<path
d="M 382.5,152.612 C 331.334,225.435 280.133,213.588 257.986,179.516 241.51,154.168 246.13,86.543 317.498,86.173"
transform="matrix(0.03241,1.30729,-1.23778,0.02809,454.669,-133.846)"
id="path9937-6"
inkscape:connector-curvature="0"
style="stroke-width:10.64900017;paint-order:markers fill stroke" />
</g>
</g>
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-7-0-1"
transform="matrix(-0.41967127,-0.42175024,-0.54569912,0.62730911,786.82849,261.58585)"
inkscape:transform-center-x="2.3401273"
inkscape:transform-center-y="-1.617872">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-4-2-0"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-3-4-6"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)"
d="m 197.036,89.49 c 39.237,-9.724 89.303,-9.828 120.462,-3.317" />
</g>
<g
id="g2760-3"
transform="matrix(1.4096789,1.4097117,-1.4096789,1.4097117,526.67539,31.899995)">
<g
id="g2749-2"
style="fill:#cccccc;stroke:#666666"
transform="rotate(-44.545114,52.727379,84.306425)">
<circle
cx="55.440796"
cy="90.58149"
r="24.6"
id="circle3369-33-0"
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="51.507595"
cy="84.367409"
r="24.6"
id="circle3383-85-6"
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10" />
</g>
</g>
<g
id="g2760-9-8-7"
transform="matrix(1.4096789,1.4097117,-1.4096789,1.4097117,577.6525,-64.844755)">
<g
id="g2749-4-6"
style="fill:#cccccc;stroke:#666666"
transform="rotate(-37.328029,183.17645,-58.627543)">
<circle
cx="55.440796"
cy="90.58149"
r="24.6"
id="circle3369-5-5"
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="51.507595"
cy="84.367409"
r="24.6"
id="circle3383-6-6"
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10" />
</g>
</g>
<g
id="g2760-0-7"
transform="matrix(1.4096789,1.4097117,-1.4096789,1.4097117,514.31099,287.57691)">
<g
id="g2749-6-8"
style="fill:#cccccc;stroke:#666666"
transform="rotate(-44.545114,52.727379,84.306425)">
<circle
cx="55.440796"
cy="90.58149"
r="24.6"
id="circle3369-33-3-6"
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="51.507595"
cy="84.367409"
r="24.6"
id="circle3383-85-2-8"
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10" />
</g>
</g>
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-7-0-3"
transform="matrix(-0.41967127,-0.42175024,-0.54569912,0.62730911,925.28483,394.25577)"
inkscape:transform-center-x="2.3401319"
inkscape:transform-center-y="-1.6178754">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-4-2-6"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-3-4-7"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)"
d="m 197.036,89.49 c 39.237,-9.724 89.303,-9.828 120.462,-3.317" />
</g>
<g
id="g2749-7-7"
style="fill:#cccccc;stroke:#666666"
transform="matrix(1.9929885,0.04884499,-0.04884385,1.9930351,652.96818,318.11802)">
<circle
cx="55.440796"
cy="90.58149"
r="24.6"
id="circle3369-7-4"
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="51.507595"
cy="84.367409"
r="24.6"
id="circle3383-4-5"
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-25-1-3-3"
transform="matrix(0.46858775,-0.39216479,0.44583894,0.71332162,317.24599,360.97454)"
inkscape:transform-center-x="7.9981321"
inkscape:transform-center-y="-0.64809202">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-8-5-1-6"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-9-5-4-7"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)"
d="m 197.036,89.49 c 39.237,-9.724 89.303,-9.828 120.462,-3.317" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="595.3"
height="200"
version="1.1"
id="svg9949"
sodipodi:docname="category_types_monoid.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata9955">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs9953" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1016"
id="namedview9951"
showgrid="false"
inkscape:zoom="0.83622239"
inkscape:cx="174.94231"
inkscape:cy="96.194815"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg9949"
inkscape:document-rotation="0" />
<g
transform="matrix(0.47127,0,0,0.46783,155.50075,-75.77176)"
id="g11563">
<g
style="fill:none;stroke:#6d6d6d;stroke-width:6.38899994;stroke-miterlimit:10"
transform="matrix(0.47831212,0,0,0.48430201,139.77588,155.01519)"
id="g9939"
stroke-miterlimit="10">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path9935"
transform="matrix(0.06166,0.69487,-0.648,0.06164,394.029,56.19)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path9937"
transform="matrix(0.03241,1.30729,-1.23778,0.02809,454.669,-133.846)"
d="M 382.5,152.612 C 331.334,225.435 280.133,213.588 257.986,179.516 241.51,154.168 246.13,86.543 317.498,86.173" />
</g>
</g>
<g
transform="matrix(0.2013077,0.42611105,-0.42300068,0.19983827,400.14994,-105.62287)"
id="g11563-1">
<g
style="fill:none;stroke:#6d6d6d;stroke-width:6.38899994;stroke-miterlimit:10"
transform="matrix(0.47831212,0,0,0.48430201,139.77588,155.01519)"
id="g9939-3"
stroke-miterlimit="10">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path9935-3"
transform="matrix(0.06166,0.69487,-0.648,0.06164,394.029,56.19)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path9937-9"
transform="matrix(0.03241,1.30729,-1.23778,0.02809,454.669,-133.846)"
d="M 382.5,152.612 C 331.334,225.435 280.133,213.588 257.986,179.516 241.51,154.168 246.13,86.543 317.498,86.173" />
</g>
</g>
<g
transform="matrix(-0.28277838,0.37700372,-0.37425181,-0.28071425,535.66549,90.081864)"
id="g11563-4">
<g
style="fill:none;stroke:#6d6d6d;stroke-width:6.38899994;stroke-miterlimit:10"
transform="matrix(0.47831212,0,0,0.48430201,139.77588,155.01519)"
id="g9939-4"
stroke-miterlimit="10">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path9935-9"
transform="matrix(0.06166,0.69487,-0.648,0.06164,394.029,56.19)"
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z" />
<path
style="stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path9937-6"
transform="matrix(0.03241,1.30729,-1.23778,0.02809,454.669,-133.846)"
d="M 382.5,152.612 C 331.334,225.435 280.133,213.588 257.986,179.516 241.51,154.168 246.13,86.543 317.498,86.173" />
</g>
</g>
<g
transform="matrix(0.90654831,0.91316304,-0.90654831,0.91316304,328.909,-20.569814)"
id="g2760-3-7">
<g
transform="rotate(-44.545114,52.727379,84.306425)"
style="fill:#cccccc;stroke:#666666"
id="g2749-2-2">
<circle
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3369-33-0-7"
r="24.6"
cy="90.58149"
cx="55.440796" />
<circle
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3383-85-6-2"
r="24.6"
cy="84.367409"
cx="51.507595" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -0,0 +1,188 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="595.3"
height="200"
version="1.1"
id="svg9949"
sodipodi:docname="category_types_order.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata9955">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs9953" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1016"
id="namedview9951"
showgrid="false"
inkscape:zoom="0.83622239"
inkscape:cx="174.94231"
inkscape:cy="96.194815"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg9949"
inkscape:document-rotation="0" />
<g
inkscape:transform-center-y="-1.617872"
inkscape:transform-center-x="2.3401273"
transform="matrix(-0.19777848,-0.19730741,-0.25717162,0.29347402,376.00626,54.369368)"
id="g1482-7-0-7-0-1"
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10">
<path
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
id="path1478-7-9-4-2-0"
inkscape:connector-curvature="0"
style="stroke-width:35.52600098" />
<path
d="m 197.036,89.49 c 39.237,-9.724 89.303,-9.828 120.462,-3.317"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)"
id="path1480-1-3-3-4-6"
inkscape:connector-curvature="0"
style="stroke-width:10.64900017;paint-order:markers fill stroke" />
</g>
<g
transform="matrix(0.66433938,0.65950542,-0.66433938,0.65950542,253.40392,-53.084562)"
id="g2760-3">
<g
transform="rotate(-44.545114,52.727379,84.306425)"
style="fill:#cccccc;stroke:#666666"
id="g2749-2">
<circle
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3369-33-0"
r="24.6"
cy="90.58149"
cx="55.440796" />
<circle
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3383-85-6"
r="24.6"
cy="84.367409"
cx="51.507595" />
</g>
</g>
<g
transform="matrix(0.66433938,0.65950542,-0.66433938,0.65950542,277.4279,-98.344662)"
id="g2760-9-8-7">
<g
transform="rotate(-37.328029,183.17645,-58.627543)"
style="fill:#cccccc;stroke:#666666"
id="g2749-4-6">
<circle
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3369-5-5"
r="24.6"
cy="90.58149"
cx="55.440796" />
<circle
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3383-6-6"
r="24.6"
cy="84.367409"
cx="51.507595" />
</g>
</g>
<g
transform="matrix(0.66433938,0.65950542,-0.66433938,0.65950542,247.57695,66.528768)"
id="g2760-0-7">
<g
transform="rotate(-44.545114,52.727379,84.306425)"
style="fill:#cccccc;stroke:#666666"
id="g2749-6-8">
<circle
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3369-33-3-6"
r="24.6"
cy="90.58149"
cx="55.440796" />
<circle
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3383-85-2-8"
r="24.6"
cy="84.367409"
cx="51.507595" />
</g>
</g>
<g
inkscape:transform-center-y="-1.6178754"
inkscape:transform-center-x="2.3401319"
transform="matrix(-0.19777848,-0.19730741,-0.25717162,0.29347402,441.25658,116.43635)"
id="g1482-7-0-7-0-3"
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10">
<path
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
id="path1478-7-9-4-2-6"
inkscape:connector-curvature="0"
style="stroke-width:35.52600098" />
<path
d="m 197.036,89.49 c 39.237,-9.724 89.303,-9.828 120.462,-3.317"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)"
id="path1480-1-3-3-4-7"
inkscape:connector-curvature="0"
style="stroke-width:10.64900017;paint-order:markers fill stroke" />
</g>
<g
transform="matrix(0.93923569,0.02285115,-0.02301864,0.93240161,312.92191,80.816808)"
style="fill:#cccccc;stroke:#666666"
id="g2749-7-7">
<circle
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3369-7-4"
r="24.6"
cy="90.58149"
cx="55.440796" />
<circle
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
id="circle3383-4-5"
r="24.6"
cy="84.367409"
cx="51.507595" />
</g>
<g
inkscape:transform-center-y="-0.64809202"
inkscape:transform-center-x="7.9981321"
transform="matrix(0.22083135,-0.18346645,0.21011052,0.33371325,154.70613,100.86638)"
id="g1482-7-0-25-1-3-3"
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10">
<path
d="m 315.1,101.79 c 10.682,-4.135 21.77,-7.738 33.127,-11.074 -8.518,-8.139 -17.577,-16.01 -27.178,-23.616 -2.04,12.119 -3.103,21.663 -5.949,34.69 z"
transform="matrix(0.4768,-0.02932,0.03214,0.42867,147.58,197.367)"
id="path1478-7-9-8-5-1-6"
inkscape:connector-curvature="0"
style="stroke-width:35.52600098" />
<path
d="m 197.036,89.49 c 39.237,-9.724 89.303,-9.828 120.462,-3.317"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)"
id="path1480-1-3-9-5-4-7"
inkscape:connector-curvature="0"
style="stroke-width:10.64900017;paint-order:markers fill stroke" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB