This commit is contained in:
Boris Marinov 2021-12-25 18:31:58 +02:00
parent 8461582886
commit 5fbf53e882
21 changed files with 2603 additions and 540 deletions

View File

@ -14,25 +14,83 @@ title: About
{: style="text-align: right" }
Tom Lehrer
The story behind this book
===
I was interested at math as a kid, but I was always messing up the calculations so I decided it was not my thing and and started pursuing other interests (among which writing and visual art.)
A little later I got into programming and I found that this was similar to the part of mathematics that I enjoyed. I started using functional programming in an effort to explore the similarity and to improve myself as a developer. I discovered category theory a little later.
Some 5 years ago I found myself jobless for a few months and decided to publish some of the diagrams that I drew as part of my the notes I kept when was reading "Category theory for scientists" by David Spivak. The effort resulted in a rough version of the first two chaptes of this book, which I published online.
A few years after that some people found my notes and encouraged me write more. They were so nice that I forgot my imposter syndrome and got to work on the next several chapters.
Who is this book for AKA The value of category theory
===
Ever since Newton's Principia, the discipline of mathematics was viewed in the somewhat demeaning position of "science and engineering's workhorse". According to this view, mathematics is only "useful" as a means for making it easier for scientists and engineers for making technological and and scientific advancements i.e. it is viewed as just a tool for solving "practical" problems. Which puts mathematicians in a weird and I'd say unique position of always having to defend what they do with respect to it's value for *other disciplines*. I again stress that this is something that would be considered absurd when it comes to any other discipline. Imagine for example, what would it look like if people were bashing *philosophical theories* for being too impractical in the way they are bashing mathematics, like, for example someone attacking Wittgenstein's picture theory of language by, saying:
"All too well, but what can you do with that theory?"
And at the other end of the line, some philosopher sweating:
"Well, I am told it does have its applications is programming language theory..."
Or someone bashing David Hume's extreme scepticism:
"That's all fine and dandy, but your theory leaves us at square one in terms of our knowledge. What the hell are we expected to do from there?"
So, who is this book for? If we rephrase this question as "Who *should* read this book", then the answer is nobody. Indeed, if you think in terms of "should" mathematics (or at least the type of mathematics that is reviewed here) won't help you much, although it is falsely advertised as solution to many problems.
Let's take an example - many people claim that, Einstein's theories of relativity are essential for GPS to work properly because due to relativistic effects the clocks on GPS satellites should tick faster than identical clocks on the ground.
They seem to think that if the theory didn't exist the engineers that developed the GPS would have faced this phenomena in the following way:
> Engineer 1: Whoa, the clocks on the satellites are off by X nanoseconds!
>
> Engineer 2: But that's impossible! Our mathematical model predicts that they should be correct.
>
> Engineer 1: OK, so what do we do now?
>
> Engineer 2: I guess we need to drop this project until we have a viable mathematical model that describes time in the universe.
Although I am not an expert in special relativity, I suspect that the way this conversation would have developed would be closer to the following:
> Engineer 1: Whoa, the clocks on the satellites are off by X nanoseconds!
>
> Engineer 2: This is normal, there are many unknowns.
>
> Engineer 1: OK, so what do we do now?
>
> Engineer 2: Just adjust it by X and see if it works. Oh, and tell that to some physicist, they might find it interesting.
With that I am not claiming that math is so insignificant, that it is not even good enough to serve as a tool for building stuff. Quite the contrary, I think that math is much more than just a simple tool. Thinking itself is mathematical. So going through any math texbook (and of course especially this one) would help you in ways that are much more vital than finding solutions to "complex" problems.
And so "Who is this book for" is not to be read as who should, but who *can* read it. Then the answer is "anyone with some time and dedication to learn category theory".
About this book
===
The discipline of mathematics has always suffered from the fact that it is viewed as "science's workhorse". According to this view, mathematics is only "useful" as a means for making it easier for scientists and engineers to do their job making technological and and scientific advancements i.e. it is viewed as a tool for solving problems.
Although many people don't subscribe to this view of mathematics specifically, we can see it encoded inside the structure of most mathematics textbooks - each chapter starts with an explanation of a concept, followed by some examples and then ends with a list of problems that this concept solves.
And although many people don't subsribe to this view specifically, we can see it encoded inside the structure of most mathematics text books - each chapter starts with an explanation of a concept, followed by some examples and then ends with a list of problems that this concept solves.
There is nothing wrong with this approach, but mathematics is so much more than solving problems. It was a the basis of a religious cult in ancient Greece (the Pythagoreans), it was seen by philosophers as means to understanding the laws which govern the universe. It was (and still is) a language, which can allow for people with different cultural backgrounds understand each other. And it is also art and a means of entertainment.
There is nothing wrong with this approach, but mathematics is so much more than solving problems. It was a the basis of a religious cult in ancient Grece (the Pythagoreans), it was seen by philosophers as means to understanding the laws which govern the universe. It was (and still is) a language, which can allow for people with different cultural backgrounds understand each other. And it was also art and a means of entertainment.
Category theory embodies all these aspects of mathematics. It's visual language is, I think a very good grounds to writing a book where all of them shine - a book that is based not on solving of problems, but on exploration of concepts and on seeking connections between them.
Category theory embodies all these aspects of mathematics, so I think a very good grounds to writing a book where all of them shine - a book that is based not on solving of problems, but on exploration of concepts and on seeking connections between them. A book, that is, overall, pretty.
About category theory
===
The main reason I am interested in category theory is that it allows us to formalise some common concepts that we use in our daily (intellectual) lives. Much of our language is based on intuition as intuition is a very easy way to get your point across. However, that is part of the problem: sometimes intuition makes it *too easy* to communicate with someone, so easy that he might, in fact, understand things that you haven't actually said. For example, when I say that two things are equal, it would seem obvious to you what I mean, although it isn't obvious at all (how are they equal, at what context etc).
Like we said, the fundaments of mathematics are the fundaments of thought. Category theory allows us to formalize those fundaments that we use in our daily (intellectual) lives.
In such occasions we strive to use a more rigorous definition of what we are saying. This is a way to make it clearer and more understandable not only for our audience, but for ourselves. But providing such definition in natural language, which is designed to use intuition as a means of communication, is no easy task.
The way we think and talk is based on intuition that develops naturally and is very easy way to get our point across. However, that is part of the problem: sometimes intuition makes it *too easy* for us, to say something that can be interpreted in many ways, some of which are wrong. For example, when I say that two things are equal, it would seem obvious to you what I mean, although it isn't obvious at all (how are they equal, at what context etc).
It is in these situations that people often resort to diagrams to explain their thoughts. Diagrams are ubiquitous in science and mathematics because they are an understandable way to communicate a formal concept clearly. Category theory formalises the concept of a diagram and their components - arrows and objects and creates a language for presenting all kinds of ideas. In this sense, category theory is a way to unify knowledge, both mathematical and scientific, and to bring various modes of thinking in common therms.
It is in these situations that people often resort to *diagrams* to refine their thoughts. Diagrams (even more than formulas) are ubiquitous in science and mathematics their
Category theory formalizes the concept of a diagram and their components - arrows and objects and creates a language for presenting all kinds of ideas. In this sense, category theory is a way to unify knowledge, both mathematical and scientific, and to bring various modes of thinking in common terms.
As a consequence of that, category theory and diagrams are also a very understandable way to communicate a formal concept clearly. Something I hope to demonstrate in the following pages.
Summary
===
@ -51,22 +109,14 @@ The connecting between all these different disciplines is examined in chapter 6,
In chapter 7 we review another more interesting and more advanced categorical concept the concept of a *natural transformation*.
<!--
Who is this book for
===
It is aimed at programmers, as well as anyone else who is interested in this stuff.
How is the book organized
===
-->
Acknowledgements
Acknowledgments
===
Thanks to my wife Dimitrina, who is 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.
My daughter Daria, my "anti-author" who stayed seated on my knees when I was writing the second and third chapters and mercilessly deleted many sentences, most of them bad.
Thanks to my high-school arts teacher, Mrs Georgieva who told me that I have some talent, but I have to work.
Thanks to Prathyush Pramod who encouraged me to finish the book and is also helping me out with it.

View File

@ -366,7 +366,7 @@ If we have a one-one-function that connects sets that are of the same size (as i
![Opposite colors](isomorphism_one_one.svg)
Invertible functions are called *isomorphisms*. When there exists an invertible function between two sets we say that the sets are *isomorphic*. For example, because we have an invertible function that converts the temperature measured in *Celsius* to temperature measured in *Fahrenheit* and vise versa, we can say that the temperatures measured in Celsius and Fahrenheit are isomorphic.
Invertible functions are called *isomorphisms*. When there exists an invertible function between two sets we say that the sets are *isomorphic*. For example, because we have an invertable function that converts the temperature measured in *Celsius* to temperature measured in *Fahrenheit* and vise versa, we can say that the temperatures measured in Celsius and Fahrenheit are isomorphic.
Isomorphism means "same form" in Greek (although actually their form is the only thing which is different between two isomorphic sets.)
@ -498,7 +498,7 @@ To understand how, let's think about how do you teach a person what a number is
![Two balls](number_two.svg)
When you do that, it would be important to highlight that you are not referring to only the left object, or only about the right one, but that we should consider both things as at once (i.e. both things as one), so if the person whom you are explaining happens to know what a set is, this piece of knowledge might come in handy. And also, being good teachers we might provide them with some more examples of sets of 2 things.
When you do that, it would be important to highlight that you are not refering to only the left object, or only about the right one, but that we should consider both things as at once (i.e. both things as one), so if the person whom you are explaining happens to know what a set is, this piece of knowledge might come in handy. And also, being good teachers we might provide them with some more examples of sets of 2 things.
![A set of two balls](number_two_sets.svg)

View File

@ -127,13 +127,13 @@ In category theory, this type of property that a given object might possess (par
Sums
===
We will now study a construct that is pretty similar to the product but at the same time is very different. Similar because, like the product, it is a relation between two sets which allows you to unite them into one, without erasing their structure. But different as it encodes a quite different type of relation - a product encodes an **AND** relation between two sets, while the sum encodes an **OR** relation.
We will now study a construct that is pretty similar to the product but at the same time is very different. Similar because, like the product, it is a relation between two sets which allows you to unite them into one, without erasing their structure. But different as it encodes a quite different type of relation - a product encodes an *and* relation between two sets, while the sum encodes an *or* relation.
A sum of two sets $B$ and $Y$, denoted $B + Y$ is a set that contains *all elements from the first set combined with all elements from the second one*.
![Sum or coproduct](coproduct.svg)
We can immediately see the connection with the **OR** logical structure: For example, because a parent is either a mother or a father of a child, the set of all parents is the sum of the set of mothers and the set of fathers, or $P = M + F$.
We can immediately see the connection with the *or* logical structure: For example, because a parent is either a mother or a father of a child, the set of all parents is the sum of the set of mothers and the set of fathers, or $P = M + F$.
Defining Sums in Terms of Sets
@ -152,9 +152,9 @@ But again, this distinction is only relevant only when the two sets have common
Defining sums in terms of functions
---
As you might already suspect, the interesting part is expressing the sum of two sets using functions. To do that we have to go back to the conceptual part of the definition. We said that sums express an **OR** relation between two things.
As you might already suspect, the interesting part is expressing the sum of two sets using functions. To do that we have to go back to the conceptual part of the definition. We said that sums express an *or* relation between two things.
A property of every **OR** relation is that if something is an $A$ that something is also an $A \vee B$ , and same for $B$ (The $\vee$ symbol means **OR**, by the way). For example, if my hair is *brown*, then my hair is also *either blond or brown*. This is what **OR** means, right? This property can be expressed as a function, two functions actually - one for each set that takes part in the sum relation (for example, if parents are either mothers or fathers, then there surely exist functions $mothers → parents$ and $fathers → parents$.)
A property of every *or* relation is that if something is an $A$ that something is also an $A \vee B$ , and same for $B$ (The $\vee$ symbol means *or* by the way). For example, if my hair is *brown*, then my hair is also *either blond or brown*. This is what *or* means, right? This property can be expressed as a function, two functions actually - one for each set that takes part in the sum relation (for example, if parents are either mothers or fathers, then there surely exist functions $mothers → parents$ and $fathers → parents$.)
![Coproduct, external diagram](coproduct_external.svg)
@ -191,16 +191,16 @@ Interlude - De Morgan duality
Now let's look at how the concepts of product and sum from the viewpoint of *logic*. We mentioned that:
- The *product* of two sets contains an element of the first one **AND** one element of the second one.
- A *sum* of two sets contains an element of the first one **OR** one element of the second one.
- The *product* of two sets contains an element of the first one *and* one element of the second one.
- A *sum* of two sets contains an element of the first one *or* one element of the second one.
When we view those sets as propositions, we discover the concept of the *product* ($\times$) corresponds exactly to the **AND** relation in logic (denoted $\land$.) From this viewpoint, the function $Y \times B \to Y$ can be viewed as instance of a logical rule of inference called *conjunction elimination* (also called *simplification*) stating that, $Y \land B \to Y$, for example, if your hair is partly blond and partly brown, then it is partly blond.
When we view those sets as propositions, we discover the concept of the *product* ($\times$) corresponds exactly to the *and* relation in logic (denoted $\land$.) From this viewpoint, the function $Y \times B \to Y$ can be viewed as instance of a logical rule of inference called *conjunction elimination* (also called *simplification*) stating that, $Y \land B \to Y$, for example, if your hair is partly blond and partly brown, then it is partly blond.
By the same token, the concept of a *sum* ($+$) corresponds the **OR** relation in logic (denoted $\lor$.) From this viewpoint, the function $Y \to Y + B$ can be viewed as instance of a logical rule of inference called *disjunction introduction*, stating that, $Y \to Y \lor B$ for example, if your hair is blond, it is either blond or brown.
By the same token, the concept of a *sum* ($+$) corresponds the *or* relation in logic (denoted $\lor$.) From this viewpoint, the function $Y \to Y + B$ can be viewed as instance of a logical rule of inference called *disjunction introduction*, stating that, $Y \to Y \lor B$ for example, if your hair is blond, it is either blond or brown.
This means, among other things, that the concepts of **AND** and **OR** are also dual - an idea which was put forward in the 19th century by the mathematician Augustus De Morgan and is henceforth known as *De Morgan duality*, and which is a predecessor to the modern idea of duality in category theory, that we examined before.
This means, among other things, that the concepts of *and* and *or* are also dual - an idea which was put forward in the 19th century by the mathematician Augustus De Morgan and is henceforth known as *De Morgan duality*, and which is a predecessor to the modern idea of duality in category theory, that we examined before.
This duality is subtly encoded in the logical symbols for **AND** and **OR** ($\land$ and $\lor$) - they are nothing but stylized-versions of the diagrams of products and coproducts.
This duality is subtly encoded in the logical symbols for *and* and *or* ($\land$ and $\lor$) - they are nothing but stylized-versions of the diagrams of products and coproducts.
![Coproduct and product](demorgan_duality.svg)
@ -212,7 +212,7 @@ $\neg(A \vee B) = \neg{A} \wedge \neg{B}$
You can read the second formula as, for example, if my hair is not blond *or* brown, this means that my hair is not blond *and* my hair is not brown, and vice versa (the connection work both ways)
Now we will go through the formulas and we would try to show that they are actually a simple corollary of the duality between **AND** and **OR**.
Now we will go through the formulas and we would try to show that they are actually a simple corollary of the duality between *and* and *or*
Let's say we want to find the statement that is opposite of "blond *or* brown".
@ -224,7 +224,7 @@ $\neg{A} \vee \neg{B}$
However, this statement is clearly not the opposite of "blond *or* brown"(saying that my hair is not blond *or* not brown does in fact allow it to be blond and also allows for it to be brown, it just doesn't allow it to be both of these things.)
So what have we missed? Simple - although we replaced the propositions that constitute our proposition with their opposites, we didn't replace the operator that connects them - it is still **OR** for both propositions. So we must replace it with **OR**'s converse. As we said earlier, and as you can see by analyzing this example, this operator is **AND**. So the formula becomes "not blond *and* not brown".
So what have we missed? Simple - although we replaced the propositions that constitute our proposition with their opposites, we didn't replace the operator that connects them - it is still *or* for both propositions. So we must replace it with *or* converse. As we said earlier, and as you can see by analyzing this example, this operator is *and* So the formula becomes "not blond *and* not brown".
$\neg{A} \wedge \neg{B}$
@ -361,7 +361,7 @@ It's important to mark this morphism, because there can be (let's add the very i
Isomorphism
---
Why do we need to define a morphism that does nothing? It's because morphisms are the basic building blocks of our language, and we need this one to be able to speak properly. For example, once we have the concept of identity morphism defined, we can have a category-theoretic definition of an *isomorphism* (which is important, because the concept of an isomorphism is very important for category theory). Like we said in the previous chapter, an isomorphism between two objects ($A$ and $B$) consists of two morphisms - ($A → B$. and $B → A$) such that their compositions are equivalent to the identity functions of the respective objects. Formally, objects $A$ and $B$ are isomorphic if there exist morphisms $f: A → B$ and $g: B → A$ such that $f \bullet g = id B$ and $g \bullet f = id A$.
Why do we need to define a morphism that does nothing? It's because morphisms are the basic building blocks of our language, and we need this one to be able to speak properly. For example, once we have the concept of identity morphism defined, we can have a category-theoretic definition of an *isomorphism* (which is important, because the concept of an isomorphism is very important for category theory). Like we said in the previous chapter, an isomorphism between two objects ($A$ and $B$) consists of two morphisms - ($A → B$. and $B → A$) such that their compositions are equivalent to the identity functions of the respective objects. Formally, objects $A$ and $B$ are isomorphic if there exist morphisms $f: A → B$ and $g: B → A$ such that $f \bullet g = id_{B}$ and $g \bullet f = id_{A}$.
And here is the same thing expressed with a commuting diagram.

View File

@ -11,15 +11,15 @@ Since we are done with categories, let's look at some other structures that are
What are monoids
===
Monoids are simpler than categories. A monoid is defined by a collection/set of elements, together with an *monoid operation* - a rule for combining two elements that and produces a third element one of the same kind.
Monoids are simpler than categories. A monoid is defined by a collection/set of elements (called the monoid's *underlying set*, together with an *monoid operation* - a rule for combining two elements that produces a third element one of the same kind.
Let's take our familiar colorful balls.
![Balls](balls.svg)
We can define a monoid based on this set by defining a operation for "combining" two balls into one. An example of such operation would be blending the colors of the balls, as if we are mixing paint.
We can define a monoid based on this set by defining an operation for "combining" two balls into one. An example of such operation would be blending the colors of the balls, as if we are mixing paint.
![A operation for combining balls](balls_operation.svg)
![An operation for combining balls](balls_operation.svg)
You can probably think of other ways to define such an operation. This will help you realize that there can be many ways to create a monoid from a given set of set elements i.e. the monoid is not the set itself, it is the set *together with the operation*.
@ -30,7 +30,7 @@ The monoid operation should, like functional composition, be *associative* i.e.
![Associativity in the color mixing operation](balls_associativity.svg)
When a operation is associative, this means we can use all kinds of algebraic operations to any sequence of terms (or in other words to apply equation reasoning), like for example we can replace any element with a set of elements from which it is composed of, or add a term that is present at both sides of an equation and retaining the equality of the existing terms.
When an operation is associative, this means we can use all kinds of algebraic operations to any sequence of terms (or in other words to apply equation reasoning), like for example we can replace any element with a set of elements from which it is composed of, or add a term that is present at both sides of an equation and retaining the equality of the existing terms.
![Associativity in the color mixing operation](balls_arithmetic.svg)
@ -70,11 +70,11 @@ Anyways, the natural numbers also form a monoid under multiplication as well.
Monoids from boolean algebra
---
Thinking about operations that we covered, we may remember the boolean operations *AND* and *OR*. Both of them form monoids, which operate on the set, consisting of just two values $\{ True, False \}$.
Thinking about operations that we covered, we may remember the boolean operations *and* and *or*. Both of them form monoids, which operate on the set, consisting of just two values $\{ True, False \}$.
**Task:** Prove that $\land$ is associative by expanding the formula $(A \land B) \land C = A \land (B \land C)$ with all all possible values. Do the same for *OR*.
**Task:** Prove that $\land$ is associative by expanding the formula $(A \land B) \land C = A \land (B \land C)$ with all possible values. Do the same for *or*.
**Question:** Which are the identity elements of the *AND* and *OR* operations?
**Question:** Which are the identity elements of the *and* and *or* operations?
Monoid operations in terms of set theory
===
@ -116,7 +116,7 @@ All monoids that we examined so far are also *commutative*. We will see some non
Groups
---
A group is a monoid such that for each of it's elements, there is another element which is the so called "inverse" of the first one where the element and its inverse cancel each other out when applied one after the other. Plain-english definitions like this make you appreciate mathematical formulas more - formally we say that for all elements $x$, there must exist $x'$ such that $x • x' = i$ ( where $i$ is the identity element).
A group is a monoid such that for each of it's elements, there is another element which is the so called "inverse" of the first one where the element and its inverse cancel each other out when applied one after the other. Plain-English definitions like this make you appreciate mathematical formulas more - formally we say that for all elements $x$, there must exist $x'$ such that $x • x' = i$ ( where $i$ is the identity element).
If we view *monoids* as a means of modeling the effect of applying a set of (associative) actions, we use *groups* to model the effects of actions are also *reversible*.
@ -264,7 +264,7 @@ Product groups are still abelian, provided that the groups that form them are ab
Fundamental theorem of Finite Abelian groups
---
Products provide one way to to create non-cyclic abelian groups - by creating a product of two or more cyclic groups. The fundamental theory of finite abelian groups is a result that tells us that *this is the only way* to produce non-cyclic abelian groups i.e.
Products provide one way to create non-cyclic abelian groups - by creating a product of two or more cyclic groups. The fundamental theory of finite abelian groups is a result that tells us that *this is the only way* to produce non-cyclic abelian groups i.e.
> All abelian groups are either cyclic or products of cyclic groups.
@ -325,9 +325,9 @@ We began by defining a monoid as a set of composable *elements*. Then we saw tha
Currying
---
When we defined monoids, we saw that their operations are two-argument functions. And we introduced a way for representing such functions using set theory - by uniting the two arguments into one using products. i.e. we showed that a function that accepts two arguments (say $A$ and $B$) and maps them into some result ($C$), can be thought as a mapping from the product of the sets of two arguments to the resutlt. So $A\times B\to C$.
When we defined monoids, we saw that their operations are two-argument functions. And we introduced a way for representing such functions using set theory - by uniting the two arguments into one using products. i.e. we showed that a function that accepts two arguments (say $A$ and $B$) and maps them into some result ($C$), can be thought as a mapping from the product of the sets of two arguments to the result. So $A\times B\to C$.
However, this is not the only way to represent multi-argument function set-theoretically - there is another, equally interesting way, that doesn't rely on any datastructures, but only on functions: that way is to have a function that maps the first of the two arguments (i.e. from $A$) to *another function* that maps the second argument to the final result (i.e. $B \to C$.) So $A\to B \to C$.
However, this is not the only way to represent multi-argument function set-theoretically - there is another, equally interesting way, that doesn't rely on any data structures, but only on functions: that way is to have a function that maps the first of the two arguments (i.e. from $A$) to *another function* that maps the second argument to the final result (i.e. $B \to C$.) So $A\to B \to C$.
The practice of transforming a function that takes a pair of objects to a function that takes just one object and returns a function that takes another one is called *currying*. It is achieved by a higher-order function. Here is how such a function might be implemented.
@ -340,7 +340,7 @@ And equally important is the opposite function, which maps a curried function to
const uncurry = <A, B, C> (f:(a:A) => (b:B) => C) => (a:A, b:B ) => f(a)(b)
```
There is a lot to say about these two functions, starting from the fact that its existence gives rise to an interesting relationship between the concept of a *product* and the concept of a *morphism* in category theory, called the *adjunction*. But we will cover this later. For now we are interested in the fact the the two function representations are isomorphic, formally $A\times B\to C\cong A\to B \to C$.
There is a lot to say about these two functions, starting from the fact that its existence gives rise to an interesting relationship between the concept of a *product* and the concept of a *morphism* in category theory, called the *adjunction*. But we will cover this later. For now we are interested in the fact the two function representations are isomorphic, formally $A\times B\to C\cong A\to B \to C$.
By the way, this isomorphism can be represented in terms of programming as well. It is equivalent to the statement that the following function always returns `true` for any arguments,
@ -354,7 +354,7 @@ This is one part of the isomorphism, the other part is the equivalent function f
Monoid elements as functions/permutations
---
Let's take a step back and examine the groups/monoids that we covered so far in the light of what we learned. We started off by representing group operation as a function from pairs. For example, the operation of a symmetric group,(let's take $Z_3$ as an example) are actions that converts two rotations to another another rotation.
Let's take a step back and examine the groups/monoids that we covered so far in the light of what we learned. We started off by representing group operation as a function from pairs. For example, the operation of a symmetric group,(let's take $Z_3$ as an example) are actions that converts two rotations to another rotation.
![The group of rotations in a triangle - group notation](symmetry_rotation_actions.svg)
@ -402,7 +402,7 @@ So, basically the functions that represent the elements of a monoid also form a
Cayley's theorem
---
We saw how using currying we can represent the elements of any group as permutions that, also form a monoid. Cayley's theorem tells us that those two groups are isomorphic:
We saw how using currying we can represent the elements of any group as permutations that, also form a monoid. Cayley's theorem tells us that those two groups are isomorphic:
> Any group is isomorphic to a permutation group.
@ -412,24 +412,24 @@ Formally, if we use $Perm$ to denote the permutation group then $Perm(A) \cong A
Or in other words, representing the elements of a group as permutations actually yields a representation of the monoid itself (sometimes called it's standard representation.)
Cayley's theorem may not seem very impressibe, but that only shows how influental it has been as a result.
Cayley's theorem may not seem very impressive, but that only shows how influential it has been as a result.
{% if site.distribution == 'print' %}
Interlude: Symmetric groups
---
The most important thing that you have to know about the symmetric groups is that they are *not the same thing as symmetry groups*. Once we have that out of the way, we can understand what they actually are: given a natural number $n$, the symmetric group of $n$, denoted $\mathrm{S}_n$ (symmetric group of degree $n$) is the group of all possible permutations of a set with $n$ elements. The number of the elements of such groups is equal to are $1\times2\times3...\times n$ or $n!$ (n-factorial.)
The most important thing that you have to know about the symmetric groups is that they are *not the same thing as symmetry groups*. Once we have that out of the way, we can understand what they actually are: given a natural number $n$, the symmetric group of $n$, denoted $\mathrm{S}_n$ (symmetric group of degree $n$) is the group of all possible permutations of a set with $n$ elements. The number of the elements of such groups is equal to are $1\times 2\times 3...\times n$ or $n!$ (n-factorial.)
So, for example the group $\mathrm{S}_1$ of permutations of the one-element set has just 1 element (because a 1-element set has no other functions to itself other than the identity function.
![The S1 symmetric group](s1.svg)
The group $\mathrm{S}_2$, has $1\times2=2$ elements (by the way, the colors are there to give you some intuition as to why the number of permutations of a $n$-element set is $n!$.)
The group $\mathrm{S}_2$, has $1 \times 2 = 2$ elements (by the way, the colors are there to give you some intuition as to why the number of permutations of a $n$-element set is $n!$.)
![The S2 symmetric group](s2.svg)
And with $\mathrm{S}_3$ we are already feeling the power of exponential (and even faster than exponential!) growth of the factorial function - it has $1\times2\times3=6$ elements.
And with $\mathrm{S}_3$ we are already feeling the power of exponential (and even faster than exponential!) growth of the factorial function - it has $1\times 2\times 3=6$ elements.
![The S3 symmetric group](s3.svg)
@ -463,7 +463,7 @@ But wait, if the monoids' underlying *sets* correspond to *objects* in category
![The group of rotations in a triangle - categorical notation](symmetry_rotation_category.svg)
The only difference between differend kind of monoids would be the number of morphisms that they have and the relationship between them.
The only difference between different monoids would be the number of morphisms that they have and the relationship between them.
The intuition behind this representation from a category-theoretic standpoint is encompassed by the law of $closure$ that monoid and group operations have and that categories lack - it is the law stating that applying the operation (functional composition) on any two objects always yields the same object, e.g. no matter how do you flip a triangle, you'd still get a triangle.
@ -490,8 +490,6 @@ Categories provide a way to compose two morphisms with an appropriate type signa
Philosophically, defining a monoid as a one-object category means corresponds to the view of monoids as a model of how a set of (associative) actions that are performed on a given object alter it's state. Provided that the object's state is determined solely by the actions that are performed on it, we can leave it out of the equation and concentrate on how the actions are combined. And as per usual, the actions (and elements) can be anything, from mixing colors in paint, or adding a quantities to a given set of things etc.
{% if site.distribution == 'print' %}
Group/monoid presentations
---
@ -505,7 +503,7 @@ This is so, because applying the generator again and again yields all elements o
Finite cyclic groups/monoids are the same, except that their definition contains an additional law, stating that that once you compose the generator with itself $n$ number of times, you get identity morphism. For the cyclic group $Z_3$ (which can be visualized as the group of triangle rotations) this law states that composing the generator with itself $3$ times yields the identity morphism.
![Presentation of an finite cyclic monoid](finite_cyclic_presentation.svg)
![Presentation of a finite cyclic monoid](finite_cyclic_presentation.svg)
Composing the group generator with itself, and then applying the law, yields the three morphisms of $Z_3$.
@ -521,7 +519,7 @@ To make the representation complete, we add the law for combining the two genera
And then, if we start applying the two generators and follow the laws, we get the four elements.
![The elements of of Klein four](klein_four_presentation_elements.svg)
![The elements of Klein four](klein_four_presentation_elements.svg)
The set of generators and laws that defines a given group is called the *presentation of a group*. Every group has a presentation.
@ -534,16 +532,22 @@ If you revisit the previous section you will notice that we already saw one such
![The free monoid with one generator](infinite_cyclic_presentation_elements.svg)
We can make a free monoid from the set of colorful balls - the monoid's elements would be all possible combinations of the balls.
We can make a free monoid from the set of colorful balls - the monoid's elements would be sequences of all possible combinations of the balls.
![The free monoid with the set of balls as a generators](balls_free.svg)
The free monoid is a special one - each element of the free monoid over a given set, can be converted to a corresponding element in any other other monoid that uses the same set by just applying the monoid's laws. For example, here is how the elements above would look like if we apply the laws of the color-mixing monoid.
The free monoid is a special one - each element of the free monoid over a given set, can be converted to a corresponding element in any any other monoid that uses the same set of generators by just applying the monoid's laws. For example, here is how the elements above would look like if we apply the laws of the color-mixing monoid.
![Converting the elements of the free monoid to the elements of the color-mixing monoid](balls_free_color_mixing.svg)
**Task:** Write up the laws of the color-mixing monoid.
If we put out programmers' hat, we will see that the type of the free monoid under the set T (which we can denote as `FreeMonoid<T>`) is isomorphic to the type `List<T>` (or `Array<T>`, if you prefer) and that the intuition behind the special property that we described above is actually very simple: keeping objects in a list allows you to convert them to any other structure i.e. when we want to perform some manipulation on a bunch of objects, but we don't know exactly what this manipulation is, we just keep a list of those objects until it's time to do it.
If we put out programmers' hat, we will see that the type of the free monoid under the set of generators T (which we can denote as `FreeMonoid<T>`) is isomorphic to the type `List<T>` (or `Array<T>`, if you prefer) and that the intuition behind the special property that we described above is actually very simple: keeping objects in a list allows you to convert them to any other structure i.e. when we want to perform some manipulation on a bunch of objects, but we don't know exactly what this manipulation is, we just keep a list of those objects until it's time to do it.
{% endif %}
While the intuition behind free monoids seems simple enough, the formal definition is not our cup of tea... yet, simply because we have to cover more stuff.
We understand that, being the most general of all monoids for a given set of generators, a free monoid can be converted to all of them. i.e. there exist a function from it to all of them. But what kind of function would that be?
Plus, what about other monoids that also can have this property (that they are connected to any other monoids) Simple - they are the free monoid with some extra structure, so we can filter them out by using an universal property.
But, what would this property be, (and what the hell are universal properties anyways?), tune in after a few chapters to find out.

View File

@ -6,22 +6,34 @@ title: Orders
Orders
===
Now let's talk about order. Given a set of objects, there can be numerous criteria, based on which to order them, and which depend on the objects themselves - size, weight, age, alphabetical order etc.
Given a set of objects, there can be numerous criteria, based on which to order them (depending on the objects themselves) - size, weight, age, alphabetical order etc.
However, currently we are not interested in the *criteria* that we can use to order objects, but in the *nature of the relationships* that define order. Of which there can be several types as well.
Mathematically, the order as a construct is represented (much like a monoid) by two two components.
One is a *set of things* (e.g. colorful balls) which we sometimes call the order's *underlying set*.
![Balls](balls.svg)
However, as mathematicians we are not interested in the *criteria* that we can use to order objects, but in the *nature of the relationship* that defines the order. Of which there can be several types as well.
And the other is a *binary relation* between these things, which are often represented as arrows.
Mathematically we can represent order as a *set of things* (e.g. colorful balls) and *a binary relation* between these things (which we often represent as a bunch of arrows). Not all binary relationships are orders - only ones that fit certain criteria that we are going to examine as we review the different types of order.
![Binary relation](binary_relation.svg)
Not all binary relationships are orders - only ones that fit certain criteria that we are going to examine as we review the different types of order.
Linear order
===
The most straightforward type of order that you think about is linear order i.e. one in which every object has its place depending on every other object. In this case the ordering criteria is completely deterministic and leaves no room for ambiguity in terms of which element comes before which. For example, ordering the colors by the length of their waves (or by how they appear in the rainbow).
Let's start with an example - the most straightforward type of order that you think og is *linear order* i.e. one in which every object has its place depending on every other object. In this case the ordering criteria is completely deterministic and leaves no room for ambiguity in terms of which element comes before which. For example, order of colors, sorted by the length of their light-waves (or by how they appear in the rainbow).
![Linear order](linear_order.svg)
In most programming languages, we can order objects linearly by providing a function which, given two objects, tells us which one of them is "bigger" (comes first) and which one is "smaller".
Using set theory, we can represent this order, as well as any other order, as a cartesian products of the order's underlying set with itself.
![Binary relation as a product](binary_relation_product.svg)
And in programming, orders are defined by providing a function which, given two objects, tells us which one of them is "bigger" (comes first) and which one is "smaller". It isn't hard to see that this function is actually a definition of a cartesian product.
```
[1, 3, 2].sort((a, b) => {
@ -33,25 +45,25 @@ In most programming languages, we can order objects linearly by providing a func
})
```
But in order for such a function to really define an order (e.g. give the same output every time, independent of how the objects were shuffled initially), it has to obey several rules.
However (this is where it gets interesting) not all such functions (and not all cartesian products) define orders. To really define an order (e.g. give the same output every time, independent of how the objects were shuffled initially), functions have to obey several rules.
Incidentally, (or rather not incidentally at all), these rules are nearly equivalent to the mathematical laws that define the criteria of the relationship between elements in an order i.e. those are the rules that define which element can point to which. Let's review them.
Incidentally, (or rather not incidentally at all), these rules are nearly equivalent to the mathematical laws that define the criteria of the order relationship i.e. those are the rules that define which element can point to which. Let's review them.
Reflexivity
---
Let's get the most boring law out of the way - each object has to be bigger or equal to itself, or **a ≤ a** (the relationship between elements in an order is commonly denoted as **≤** in formulas, but it can also be represented with a simple arrow from first object to the second).
Let's get the most boring law out of the way - each object has to be bigger or equal to itself, or $a ≤ a$ for all $a$ (the relationship between elements in an order is commonly denoted as $≤$ in formulas, but it can also be represented with an arrow from first object to the second.)
![Reflexivity](reflexivity.svg)
No special reason for this law to be so, except that the "base case" should be covered somehow.
Thre is no special reason for this law to exist, except that the "base case" should be covered somehow.
We can formulate it the opposite way too and say that each object should *not* have the relationship to itself, in which case we would have a relation than resembles *bigger than*, as opposed to *bigger or equal to* and a slightly different type of order, sometimes called a *strict* order.
Transitivity
---
The second law is maybe the least obvious, (but probably the most essential) - it states that if object **a** is bigger than object **b**, it is automatically bigger than all objects that are smaller than object **b** or **a ≤ b and b ≤ c ➞ a ≤ c**.
The second law is maybe the least obvious, (but probably the most essential) - it states that if object $a$ is bigger than object $b$, it is automatically bigger than all objects that are smaller than $b$ or $a ≤ b \land b ≤ c \to a ≤ c$.
![Transitivity](transitivity.svg)
@ -60,7 +72,7 @@ This is the law that to a large extend defines what an order is: if I am better
Antisymmetry
---
The third law is called antisymmetry and it states that the function that defines the order should not give contradictory results (or in other words you have **x ≤ y** and **y ≤ x** only if **x = y**).
The third law is called antisymmetry. It states that the function that defines the order should not give contradictory results (or in other words you have $x ≤ y$ and $y ≤ x$ only if $x = y$).
![antisymmetry](antisymmetry.svg)
@ -69,53 +81,57 @@ It also means that no ties are permitted - either I am better than my grandmothe
Totality
---
The last law is called *totality* (or *connexity*) and it mandates that all elements that belong to the order should be comparable - **a ≤ b or b ≤ a**. That is, for any two elements, one would always be "bigger" than the other.
The last law is called *totality* (or *connexity*) and it mandates that all elements that belong to the order should be comparable - $a ≤ b \lor b ≤ a$. That is, for any two elements, one would always be "bigger" than the other.
By the way, this law makes the reflexivity law redundant, as reflexivity is just a special case of totality when **a** and **b** are one and the same object, but I still want to present it for reasons that will become apparent soon.
By the way, this law makes the reflexivity law redundant, as reflexivity is just a special case of totality when $a$ and $b$ are one and the same object, but I still want to present it for reasons that will become apparent soon.
![connexity](connexity.svg)
You might say that this law is not as self-evident as the rest of them - if you think about different types of real-life objects that we typically order, you would probably think of some situations in which it does not apply. For example, if we aim to order all people based on soccer skills there are many ways in which we can rank a person compared to their friends their friend's friends etc. but there isn't a way to order groups of people who never played with one another.
Actually, here are the reasons: this law does not look so "set in stone" as the rest of them i.e. we can probably think of some situations in which it does not apply. For example, if we aim to order all people based on soccer skills there are many ways in which we can rank a person compared to their friends their friend's friends etc. but there isn't a way to order groups of people who never played with one another.
Orders that resemble the order of people based on their soccer skills in that they don't follow the totality law are called **partial orders** and they are actually much more interesting than linear orders (which are also called **total orders**, by the way).
Orders, like the order people based on their soccer skills, that don't follow the totality law are called *partial orders*, (and linear orders are also called *total orders*.)
**Question:** Previously, we covered a relation that is pretty similar to this. Do you remember it? What is the difference?
**Task:** Think about some orders that you know about and figure out whether they are partial or total.
But before we dive into the world of partial orders, let's say a few things about the numbers.
Partial orders are actually much more interesting than linear/total orders. But before we dive into them, let's say a few things about numbers.
The order of natural numbers
---
Natural numbers form a linear order under the operation **bigger or equal to** (the symbol of which we have been using in our formulas).
Natural numbers form a linear order under the operation *bigger or equal to* (the symbol of which we have been using in our formulas.)
![numbers](numbers.svg)
In many ways, numbers are the quintessential order - every finite order of objects is isomorphic to a subset of the order of numbers, as we can map the first element of any order to the number **1**, the second one to the number **2** etc (and we can do the opposite operation as well).
In many ways, numbers are the quintessential order - every finite order of objects is isomorphic to a subset of the order of numbers, as we can map the first element of any order to the number $1$, the second one to the number $2$ etc (and we can do the opposite operation as well).
If we think about it, this isomorphism is actually closer to the everyday notion of order, than the proper definition (the one defined by the laws) - when most people think of order, they aren't thinking of a *transitive, antisymmetric* and *total* relation, but are rather thinking about criteria based on which they can decide which object comes first, which comes second etc.
If we think about it, this isomorphism is actually closer to the everyday notion of a linear order, than the one defined by the laws - when most people think of order, they aren't thinking of a *transitive, antisymmetric* and *total* relation, but are rather thinking about criteria based on which they can decide which object comes first, which comes second etc. So it's important to notice that the two are equivalent.
![Linear order isomorphisms](linear_order_isomorphism.svg)
From the fact that any finite order of objects is isomorphic to the natural numbers it also follows that all linear orders of the same magnitude are isomorphic to one another.
From the fact that any finite order of objects is isomorphic to the natural numbers, it also follows that all linear orders of the same magnitude are isomorphic to one another.
**Question:** If all orders are isomorphic with one another, why do we say that numbers are the quintessential order?
So the linear order is a perfect order, but it is also (and I think that these theorems prove it) the most *boring* order ever, especially when looked from a category-theoretic viewpoint - all finite linear orders are just isomorphic to the natural numbers (by the way, most infinite orders are isomorphic to the natural numbers as well, with the exception of the ones for which Cantor's diagonal argument applies) and so all of their diagrams look the same way.
So, the linear order is simple, but it is also (and I think that this isomorphism proves it) the most *boring* order ever, especially when looked from a category-theoretic viewpoint - all finite linear orders (and most infinite ones) are just isomorphic to the natural numbers and so all of their diagrams look the same way.
![Linear order (general)](general_linear_order.svg)
However, this is not the case with partial orders that we will look into next.
<!--TODO Cantor's theorem -->
Partial order
===
Like linear orders, a partial orders consists of a set plus a relation, with the only difference that, although it still obeys the *reflexive, transitive* and the *antisymmetric* laws, the relation does not obey the law of *totality*, that is not all of the sets elements are necessarily ordered. I say "necessarily" because even if all elements are ordered, the partial order is still a partial order (just as a group is still a monoid) - all linear orders are also partial orders, but not the other way around (we can even create an *order of orders*, based on which is more general).
Like a linear order, a partial order consists of a set plus a relation, with the only difference that, although it still obeys the *reflexive, transitive* and the *antisymmetric* laws, the relation does not obey the law of *totality*, that is, not all of the sets elements are necessarily ordered. I say "necessarily" because even if all elements are ordered, it is still a partial order (just as a group is still a monoid) - all linear orders are also partial orders, but not the other way around. We can even create an *order of orders*, based on which is more general.
Partial orders are also related to the concept of an *equivalence relations* that we covered in chapter 1, except that *symmetry* law is replaced with *antisymmetry*.
If we revisit the example of the soccer players rank list, we can see that the first version that includes just **m**yself, my **g**randmother and her **f**riend is a linear order.
![Linear soccer player order](player_order_linear.svg)
However, including this **o**ther person whom none of us played yet, makes the hierarchy non-linear.
However, including this **o**ther person whom none of us played yet, makes the hierarchy non-linear i.e. a partial order.
![Soccer player order - leftover element](player_order_leftover.svg)
@ -124,25 +140,24 @@ This is the main difference between partial and total orders - partial orders ca
Chains
---
Before, we said that all linear orders can be represented by the same chain-like diagram, we can reverse this statement and say that all diagrams that look something different than the said diagram represent partial orders (or preorders). An example of this is a partial order that contains a bunch of linearly-ordered subsets, e.g. in our soccer example, we can have separate groups of friends who play together and are ranked with each other, but not with anyone from other groups.
Before, we said that all linear orders can be represented by the same chain-like diagram, we can reverse this statement and say that all diagrams that look something different than the said diagram represent partial orders. An example of this is a partial order that contains a bunch of linearly-ordered subsets, e.g. in our soccer example we can have separate groups of friends who play together and are ranked with each other, but not with anyone from other groups.
![Soccer order - two hierarchies](player_order_two.svg)
The different linear orders that make up the partial order are called *chains*. There are two chains in this diagram **M ➞ G ➞ F** and **D ➞ O**.
The different linear orders that make up the partial order are called *chains*. There are two chains in this diagram $m \to g \to f$ and $d \to o$.
The chains in an order don't have to be completely disconnected from each other in order for it to be partial, they can be connected as long as the connections are not all *one-to-one* i.e. when the last element from one chain should not be connected to the first element of the other one (as this would effectively unite them into one chain). But there are other types of connections, like *one-to-many* and *many-to-one*.
The chains in an order don't have to be completely disconnected from each other in order for it to be partial. They can be connected as long as the connections are not all *one-to-one* i.e. ones when the last element from one chain is connected to the first element of the other one (this would effectively unite them into one chain.)
![Soccer order - two hierarchies and a join](player_order_two_join.svg)
The above set is not linearly-ordered - although the connection establishes the relationship between **D** and **G** (**D ≤ G**) and although the relationship between **F** and **G** is known as well (**F ≤ G**), the relationship between **D** and **F** is *not* known. Any element can be bigger than the other one.
The above set is not linearly-ordered. This is because, although we know that $d ≤ g$ and that $f ≤ g$, the relationship between $d$ and $f$ is *not* known - any element can be bigger than the other one.
Greatest and least
Greatest and least objects
---
Although partial orders don't give us definitive answer to who is better than who, some of them still can give us an answer to the more important question (in sports, as well as in other domains), namely *who is number one*, who is the champion, the player who is better than anyone else, or more generally the element that is bigger than any other element.
Although partial orders don't give us a definitive answer to "Who is better than who?", some of them still can give us an answer to the more important question (in sports, as well as in other domains), namely "Who is number one?" i.e. who is the champion, the player who is better than anyone else. Or, more generally, the element that is bigger than all other elements.
We call such elements the *greatest element* and some (not all) partial orders do have such element - in our last diagram **M** is the greatest element, in this diagram, the green element is the biggest one.
We call such element the *greatest element*. Some (not all) partial orders do have such element - in our last diagram $m$ is the greatest element, in this diagram, the green element is the biggest one.
![Join diagram with one more element](join_additional_element.svg)
@ -159,13 +174,13 @@ The *least upper bound* of two elements that are connected as part of an order i
![Join](join.svg)
There can be multiple elements bigger than **A** and **B** (all elements that are bigger than **C** are also bigger than **A** and **B**), but only one of them is a join. Formally, the join of **A** and **B** is defined as the smallest element **C** that is bigger than both **A** and **B** (i.e. for which **A ≤ C**, and **B ≤ C**.
There can be multiple elements bigger than $a$ and $b$ (all elements that are bigger than $c$ are also bigger than $a$ and $b$), but only one of them is a join. Formally, the join of $a$ and $b$ is defined as the smallest element that is bigger than both $a$ and $b$ (i.e. smallest $c$ for which $a ≤ c$, and $b ≤ c$.)
![Join with other elements](join_other_elements.svg)
Given any two elements in which one is bigger than the other (e.g. **A ≤ B**), the join is the bigger element (in this case **B**).
Given any two elements in which one is bigger than the other (e.g. $a ≤ b$), the join is the bigger element (in this case $b$).
In a totally ordered set, the *join* of any subset of elements is just their the *greatest* element.
In a linear orders, the *join* of any two elements is just the bigger element.
Like with the greatest element, if two elements have several upper bounds that are equally big, then none of them is a *join* (a join must be unique).
@ -186,35 +201,35 @@ Given two elements, the biggest element that is smaller than both of them is cal
The same rules as for the joins apply.
Interlude: Hasse diagrams
Hasse diagrams
---
In this section, we use what are called "Hasse diagrams" - they are much like our usual diagrams, however they have an additional rule that is followed - "bigger" elements are always positioned above smaller ones.
The diagrams that we use in this section are called "Hasse diagrams" and they work much like our usual diagrams, however they have an additional rule that is followed - "bigger" elements are always positioned above smaller ones.
In terms of arrows, the rule means that if you add an arrow to a point, the point *to* which the arrow points must always be above the one *from* which it points.
![A join diagram](hasse.svg)
This arrangement allows us to compare any two points by just seeing which one is above the other e.g. to spot the *join* of two elements, you just have to identify the ones they connect to and see which one is lowest.
This arrangement allows us to compare any two points by just seeing which one is above the other e.g. we can determine the *join* of two elements, by just identifying the elements that they connect to and see which one is lowest.
Color order
---
We all know many examples of total orders (any form of chart or ranking is a total order), but there are probably not so many obvious examples of partial orders that we can think of off the top of our head. So let's see some. In addition to providing a little context, this will help us understand joins and see why are they significant.
We all know many examples of total orders (any form of chart or ranking is a total order), but there are probably not so many obvious examples of partial orders that we can think of off the top of our head. So let's see some. This will gives us some context, and will help us understand what joins are.
To stay true to our form, let's revisit our color-mixing monoid and create a color-mixing partial order in which all colors point to colors that contain them.
To stay true to our form, let's revisit our color-mixing monoid and create a *color-mixing partial order* in which all colors point to colors that contain them.
![A color mixing poset](color_mixing_poset.svg)
If you go through it, you will notice that the join of any two colors is the color that they make up. Nice, right?
If you go through it, you will notice that the join of any two colors is the color that they make up when mixed. Nice, right?
![Join in a color mixing poset](color_mixing_poset_join.svg)
Numbers by division
---
When we order numbers by "bigger or equal to", they form a total order (*the* total order even). But numbers can also form a partial order, for example if we order them by the relationship of which divides which, like if **A** divides **B**, then **A** is before **B** e.g. because **2 * 5 = 10**, **2** and **5** come before **10** (but **3**, for example does not).
We saw that when we order numbers by "bigger or equal to", they form a linear order (*the* linear order even.) But numbers can also form a partial order, for example they form a partial order if we order them by which divides which, i.e. if $a$ divides $b$, then $a$ is before $b$ e.g. because $2 \times 5 = 10$, $2$ and $5$ come before $10$ (but $3$, for example, does not come before $10$.)
![Divides poset](divides_poset.svg)
@ -227,60 +242,61 @@ And the *meet* (the opposite of join) of two numbers is their *greatest common d
Inclusion order
---
Given a collection of all possible sets containing a combination of a given set of elements (like for example our colorful balls)...
Given a collection of all possible sets containing a combination of a given set of elements...
![A color mixing poset, ordered by inclusion](color_mixing_poset_inclusion_subsets.svg)
We can define what is called the *inclusion order* of those sets, in which **A** comes before **B** if **A** *includes* **B**, or (to use the proper term), if **B** is a *subset* of **A**.
...we can define what is called the *inclusion order* of those sets, in which $a$ comes before $b$ if $a$ *includes* $b$, or in other words if $b$ is a *subset* of $a$.
![A color mixing poset, ordered by inclusion](color_mixing_poset_inclusion.svg)
Note that the *join* operation in an inclusion order is the set union, and the *meet* operation as set intersection.
In this case the *join* operation of two sets is their *union*, and the *meet* operation is their set *intersection*.
This diagram might remind you of something, because if we take the colors that are in each of its set and mix it into one color, we get the color-blending partial order that we saw earlier.
This diagram might remind you of something - if we take the colors that are contained in each set and mix them into one color, we get the color-blending partial order that we saw earlier.
![A color mixing poset, ordered by inclusion](color_mixing_poset_blend.svg)
The order example with the number dividers is also isomorphic to an inclusion order - the inclusion order of all possible sets of *prime* numbers, including repeating ones (or alternatively the set of all *prime powers*). This is confirmed by the fundamental theory of arithmetic, which states that every number can be written as a product of primes in exactly one way.
The order example with the number dividers is also isomorphic to an inclusion order, namely the inclusion order of all possible sets of *prime* numbers, including repeating ones (or alternatively the set of all *prime powers*). This is confirmed by the fundamental theory of arithmetic, which states that every number can be written as a product of primes in exactly one way.
![Divides poset](divides_poset_inclusion.svg)
Order isomorphisms
---
We mentioned order isomorphisms several times already so this is about time to elaborate a bit about what they are. Take the isomorphism between the number partial order and the prime inclusion order as an example. Like an isomorphism between any two sets, it is comprised of two functions:
We mentioned order isomorphisms several times already so this is about time to elaborate on what they are. Take the isomorphism between the number partial order and the prime inclusion order as an example. Like an isomorphism between any two sets, it is comprised of two functions:
- One function from the prime inclusion order, to the number order (which in this case is just the *multiplication* of all the elements in the set)
- One function from the number order to the prime inclusion order (which is an operation called *prime factorization* of a number, consisting of finding the set of prime numbers that result in that number when multiplied with one another).
![Divides poset](divides_poset_isomorphism.svg)
For sets, an isomorphism means just that the functions are inverse of each other. But as orders, besides being sets, have the arrows that connect them there is an additional requirement for a pair of functions to form an isomorphism - to be an isomorphism, a function has *to respect those arrows, in other words should be *order preserving*. More specifically, applying the function (let's call it F) to any two elements in one set (**a** and **b**) should result in two elements that have the same corresponding order in the other set (so **a ≤ b** iff **F(a) ≤ F(b)**.
When we talk about sets, an isomorphism means just a reversible function. But as orders, besides having their underlying sets, have the arrows that connect them, there is an additional requirement for a pair of functions to form an isomorphism - to be an isomorphism, a function has to *respect those arrows*, in other words it should be *order preserving*. More specifically, applying the function (let's call it F) to any two elements in one set ($a$ and $b$) should result in two elements that have the same corresponding order in the other set (so $a ≤ b$ if $F(a) ≤ F(b)$.
Birkhoff's representation theorem
---
So far, we saw two different partial orders, one based on color mixing, and one based on number division, which can be represented by the inclusion orders of all possible combinations of sets of some *basic elements* (the primary colors in the first case, and the prime numbers (or prime powers) in the second one.) Many other partial orders can be defined in this way. Which ones exactly, is a question that is answered by an amazing result called *Birkhoff's representation theorem*. They are the partial orders that meet the following two criteria:
So far, we saw two different partial orders, one based on color mixing, and one based on number division, that can be represented by the inclusion orders of all possible combinations of sets of some *basic elements* (the primary colors in the first case, and the prime numbers (or prime powers) in the second one.) Many other partial orders can be defined in this way. Which ones exactly, is a question that is answered by an amazing result called *Birkhoff's representation theorem*. They are the *finite* partial orders that meet the following two criteria:
1. All elements have *joins* and *meets* (those partial orders are called *lattices*, by the way)
2. Those *meet* and *join* operations *distribute* over one another, that is if we denote joins as meets as **** or **∧**, then **x (y ∧ z) = (x y) ∧ (x z)** (those are called *distributive lattices*.)
1. All elements have *joins* and *meets*.
2. Those *meet* and *join* operations *distribute* over one another, that is if we denote joins as meets as $$ or $∧$, then $x (y ∧ z) = (x y) ∧ (x z)$.
(Just to note that this result is only proven for *finite* lattices, so it might not be valid for the numbers all the way to infinity. But it would be valid for any subset of them.)
I won't go into details about this result, I would only mention that the "prime" elements with which we can construct the inclusion order are the ones that are not the *join* of any other elements (for that reason, they are also called *join-irreducible* elements.)
The partial orders that meet the first criteria are called *lattices*. The ones that meet the second one are called distributive lattices.
And the "prime" elements which we use to construct the inclusion order are the elements that are not the *join* of any other elements. They are also called *join-irreducible* elements.
By the way, the partial orders that are *not* distributive lattices are also isomorphic to inclusion orders, it is just that they are isomorphic to inclusion orders that do not contain all possible combinations of elements.
<!-- TODO in a Power set P(X), the meet of a collection of subsets is their intersection, and the join is their union -->
Lattices
===
In the previous section we mentioned what *lattices* are - they are partial orders, in which every two elements have a *join* and a *meet*. So every lattice is also partial order, but not every partial order is a lattice (we will see even more members of this hierarchy). Most partial orders that are created based on some sort of rule, like the ones from the previous section, are also lattices when they are drawn in full, for example the color-mixing order.
We will now review the orders for which Birkhoff's theorem applies i.e. the *lattices*. Lattices are partial orders, in which every two elements have a *join* and a *meet*. So every lattice is also partial order, but not every partial order is a lattice (we will see even more members of this hierarchy).
Most partial orders that are created based on some sort of rule are distributive lattices, like for example the partial orders from the previous section are also distributive lattices when they are drawn in full, for example the color-mixing order.
![A color mixing lattice](color_mixing_lattice.svg)
Notice that when drawing our color-mixing lattice, we added the black ball at the top and the white one at the bottom. We did that because otherwise the top three elements wouldn't have a *join* element, and the bottom three wouldn't have a *meet*.
Notice that we added the black ball at the top and the white one at the bottom. We did that because otherwise the top three elements wouldn't have a *join* element, and the bottom three wouldn't have a *meet*.
Bounded lattices
---
@ -289,7 +305,9 @@ Our color-mixing lattice, has a *greatest element* (the black ball) and a *least
**Task:** Prove that all finite lattices are bounded.
Semilattices and trees
{% if site.distribution == 'print' %}
Interlude - semilattices and trees
---
Lattices are partial orders that have both *join* *and* *meet* for each pair of elements. Partial orders that just have *join* (and no *meet*), or just have *meet* and no *join* are called *semilattices*. More specifically, partial orders that have *meet* for every pair of elements are called *meet-semilattices*.
@ -312,6 +330,9 @@ The implications of the tendency to use trees to model everything as opposed to
> In simplicity of structure the tree is comparable to the compulsive desire for neatness and order that insists the candlesticks on a mantelpiece be perfectly straight and perfectly symmetrical about the center. The semilattice, by comparison, is the structure of a complex fabric; it is the structure of living things, of great paintings and symphonies.
{%endif%}
<!--
Formal concept analysis
---
@ -320,59 +341,76 @@ Formal concept analysis
Preorder
===
As interesting partial orders are, I like to leave them aside for a sec, just so I can return back to them like in an old romance novel.
In the previous section, we saw how removing the law of *totality* from the laws of (linear) order produces a different (and somewhat more interesting) structure, called *partial order*. Now let's see what will happen if we remove another one of the laws, namely the *antisymmetry* law. If you recall, the antisymmetry law mandated that you cannot have an object that is at the same time smaller and bigger than another one. (or that $a ≤ b ⟺ b ≰ a$).
First off, let's cover one more kind of order (or something like it).
| | Linear order | Partial order | Preorder |
| | $a ≤ b$ or $b ≤ a$ | $a ≤ b$ or $b ≤ a$ or neither | $a ≤ b$ or $b ≤ a$ or neither or both |
|---| --- | --- |
|Reflexivity| X | X | X |
|Transitivity| X | X | X |
|Antisymmetry | X | X | |
|Totality | X | | |
In the previous section, we saw how removing the law of totality from the laws of *(linear) order* produces a different (and somewhat more interesting) structure, called *partial order*. Now let's see what will happen if we remove another one of the laws, namely the *antisymmetry* law. If you recall, the antisymmetry law mandated that you cannot have an object that is at the same time smaller and bigger than another one. (or that **a ≤ b ⟺ b ≰ a**).
| **Total order** | reflexive | transitive | antisymmetric | total | Either **a ≤ b** or **b ≤ a**
| **Partial order/lattice** | reflexive | transitive | antisymmetric | ~~total~~ | Either **a ≤ b** or **b ≤ a** or they are unrelated.
| **Preorder** | reflexive | transitive | ~~antisymmetric~~ | ~~total~~ | Both **a ≤ b** and **b ≤ a** are possible.
This results in something called a preorder which is not exactly an order, as I hinted at the beginning - it can have arrows coming from any point to any other: if a partial order can be used to model who is better than who at soccer, then a preorder can be used to model who has beaten who, either directly (by playing him) or indirectly.
The result is a structure called a *preorder* which is not exactly an order - it can have arrows coming from any point to any other: if a partial order can be used to model who is better than who at soccer, then a preorder can be used to model who has beaten who, either directly (by playing him) or indirectly.
![preorder](preorder.svg)
Preorders have just one law - *transitivity* **a ≤ b and b ≤ c ➞ a ≤ c** (two, if we count *reflexivity*). The part about the indirect wins is a result of this law. Due to it, all indirect wins (ones that are wins not against the player directly, but against someone who had beat them) are added as a direct result of its application, as seen here (we show indirect wins in lighter tone).
Preorders have just one law - *transitivity* $a ≤ b \land b ≤ c \to a ≤ c$ (two, if we count *reflexivity*). The part about the indirect wins is a result of this law. Due to it, all indirect wins (ones that are wins not against the player directly, but against someone who had beat them) are added as a direct result of its application, as seen here (we show indirect wins in lighter tone).
![preorder in sport](preorder_sports.svg)
And as a result of that, all "circle" relationships (e.g. where you have a weaker player beating a stronger one) result in just a bunch of objects that are all connected to one another. Using this effect, we can convert the preorder into partial order by grouping all objects that have arrows to one another in sets and then create an order from those sets (they are called *equivalence classes*, by the way).
And as a result of that, all "circle" relationships (e.g. where you have a weaker player beating a stronger one) result in just a bunch of objects that are all connected to one another.
All of that structure arises naturally from the simple law of transitivity.
Preorders and equivalence relations
---
Preorders may be viewed as a middle-ground between *partial orders* and *equivalence relations*. As the missing exactly the property on which those two structures differ - (anti)symmetry. Because of that, if we have a bunch of objects in a preorder that follow the law of *symmetry*, those objects form an equivalence relation. And if they follow the reverse law of *antisymmetry*, they form an partial order.
| Equivalence relation | Preorder | Partial order |
| --- | --- | --- |
| Reflexivity | Reflexivity | Reflexivity |
| Transitivity | Transitivity | Transitivity |
| Symmetry | - |Antisymmetry |
In particular, any subset of objects that are connected with one another both ways (like in the example above) follows the *symmetry* requirement. So if we group all elements that have such connection, we would get a bunch of sets, all of which define different *equivalence relations* based on the preorder, called the preorder's *equivalence classes*.
![preorder](preorder_equivalence.svg)
All of that structure arises naturally from the simple law of transitivity.
And, even more interestingly, if we transfer the preorder connections between the elements of thesese sets to connections between the sets themselves, these connections would follow the *antisymmetry* requirement, which means that they would form a *partial order.*
![preorder](preorder_partial_order.svg)
In short, for every preorder, we can define the *partial order of the equivalence classes of this preorder*.
{% if site.distribution == 'print' %}
Maps as preorders
---
We use roadmaps all the time, and so most people do not realize that they are actually diagrams. More specifically, some of them are preorders - the objects represent intercections, the relations represent are the roads.
We use maps to get around all the time, often without thinking about the fact that that they are actually diagrams. More specifically, some of them are preorders - the objects represent cities or intercections, and the relations represent the roads.
![A map as a preorder](preorder_map.svg)
Reflexivity reflects reflects the fact that if you have a route allowing you to get from point **A** to point **B** and one that allows you to go from **B** to **C**, then you can go from **A** to **C** as well. Two-way roads may be represented by two arrows that form an isomorphism between objects. Intercections such that you can get from one to the other form equivalence classes (ideally all intercections would be in one equivalence class).
Reflexivity reflects the fact that if you have a route allowing you to get from point $a$ to point $b$ and one that allows you to go from $b$ to $c$, then you can go from $a$ to $c$ as well. Two-way roads may be represented by two arrows that form an isomorphism between objects. Objects that are such that you can always get from one object to the other form equivalence classes (ideally all intercections would be in one equivalence class).
![preorder](preorder_map_equivalence.svg)
However, maps that contain more than one road (and even more than one *route*) connecting two intercections, cannot be represented using preorders. For that we would need categories (don't worry, we are almost there.)
State machines as preorders
---
Let's now reformat the preorder that we used in the previous two examples, as Hasse diagram that goes from left to right. Now, it (hopefully) doesn't look so much like a hierarchy, nor like map, but like a description of a process (which if you think about it is also a map, just one that is temporal, rather than spatial.) This is actually a very good way to describe a computation model known as *finite state machine*.
Let's now reformat the preorder that we used in the previous two examples, as Hasse diagram that goes from left to right. Now, it (hopefully) doesn't look so much like a hierarchy, nor like map, but like a description of a process (which, if you think about it, is also a map just one that is temporal rather than spatial.) This is actually a very good way to describe a computation model known as *finite state machine*.
![A state machine as a preorder](preorder_state_machine.svg)
A specification of a finite state machine consists of a set of states that the machine can have, which, as the name suggest must be finite (so they can be mapped to diagrams, like finite categories.) and a bunch of transition functions that specify which state do we transition to (often expressed as tables.)
A specification of a finite state machine consists of a set of states that the machine can have, which, as the name suggest, must be finite and a bunch of transition functions that specify which state do we transition to (often expressed as tables.)
But as we saw, a finite state machine is similar to a preorder with a greatest and least object, in which the relations between the objects are represented by functions.
Finite state machines are used in organization planning e.g. imagine a process where an item gets manifactured, gets checked by a quality control person, who, if they find some defficiencies, pass it to the necessary repairing departments and then they check it again and send it for shipping - this process can be modelled by the above diagram.
Finite state machines are used in organization planning e.g. imagine a process where a given item gets manifactured, gets checked by a quality control person, who, if they find some defficiencies, pass it to the necessary repairing departments and then they check it again and send it for shipping - this process can be modelled by the above diagram.
{%endif%}
@ -406,11 +444,11 @@ State machines are, however not Turing-complete, that is, they cannot encode any
Orders as categories
===
We saw that preorders are a powerful concept, so let's take a deeper look at the law that governs them - the transitivity law. What this law tells us that if we have two pairs of relationship **a ≤ b** and **b ≤ c**, then we automatically have a third one **a ≤ c**.
We saw that preorders are a powerful concept, so let's take a deeper look at the law that governs them - the transitivity law. What this law tells us that if we have two pairs of relationship $a ≤ b$ and $b ≤ c$, then we automatically have a third one $a ≤ c$.
![Transitivity](transitivity.svg)
In other words, the transitivity law tells us that the **≤** relationship composes i.e. if we view the "bigger than" relationship as a morphism we would see that it fits the categorical definition of composition.
In other words, the transitivity law tells us that the $≤$ relationship composes i.e. if we view the "bigger than" relationship as a morphism we would see that the law of transitivity is actually the categorical definition of *composition*.
![Transitivity as functional composition](transitivity_composition.svg)
@ -418,7 +456,7 @@ In other words, the transitivity law tells us that the **≤** relationship comp
So let's review the definition of a category again.
> A category is a collection of **objects** (we can think of them as points) and **morphisms** (arrows) that go from one object to another, where:
> A category is a collection of *objects* (we can think of them as points) and *morphisms* (arrows) that go from one object to another, where:
> 1. Each object has to have the identity morphism.
> 2. There should be a way to compose two morphisms with an appropriate type signature into a third one in a way that is associative.
@ -428,13 +466,13 @@ Looks like we have law number 2 covered. What about that other one - the identit
So it's official - preorders are categories (sounds kinda obvious, especially after we also saw that orders can be reduced to sets and functions using the inclusion order, and sets and functions form a category in their own right.)
And since partial orders and total orders obey those two laws, they are preorders too. And also categories as well.
And since partial orders and total orders are preorders too, they are categories as well.
When we compare the categories of orders to other categories, like the quintessential category of sets we see one thing that immediately sets them apart: in other categories there can be *many different morphisms (arrows)* between two objects and in orders can have *at most one morphism*. That is, for two objects **a** **b** we either have **a ≤ b** or we do not.
When we compare the categories of orders to other categories, like the quintessential category of sets, we see one thing that immediately sets them apart: in other categories there can be *many different morphisms (arrows)* between two objects and in orders can have *at most one morphism*, that is, we either have $a ≤ b$ or we do not.
![Orders compared to other categories](arrows_one_arrow.svg)
That is in the contrast with the category of sets where there are potentially infinite amount of functions from, say, the set of integers and the set of boolean values, as well as a lot of functions that go the other way around, and the existence of either of these functions does not imply that one set is "bigger" than the other one.
In the contrast, in the category of sets where there are potentially infinite amount of functions from, say, the set of integers and the set of boolean values, as well as a lot of functions that go the other way around, and the existence of either of these functions does not imply that one set is "bigger" than the other one.
![Orders compared to other categories](order_category.svg)
@ -453,22 +491,24 @@ If you recall, this is an operation that corresponds to *set inclusion* in the c
But wait, wasn't there something else that corresponded to set inclusion - oh yes, the *join* operation in orders. And not merely that, but orders are defined in the exact same way as the categorical coproducts.
In category theory, an object **G** is the coproduct of objects **Y** and **B** if the following two conditions are met:
In category theory, an object $G$ is the coproduct of objects $Y$ and $B$ if the following two conditions are met:
1. We have a morphism from any of the elements of the coproduct to the coproduct, so **Y → G** and **B → G**.
2. For any other object **P** that also has those morphisms (so **Y → P** and **B → P**) we would have morphism **G → P**.
1. We have a morphism from any of the elements of the coproduct to the coproduct, so $Y → G$ and $B → G$.
2. For any other object $P$ that also has those morphisms (so $Y → P$ and $B → P$) we would have morphism $G → P$.
![Joins as coproduct](coproduct_morphisms.svg)
In the realm of orders, we say that **G** is the *join* of objects **Y** and **B** if:
In the realm of orders, we say that $G$ is the *join* of objects $Y$ and $B$ if:
1. It is bigger than both of these objects, so **Y ≤ G** and **B ≤ G**.
1. It is bigger than both of these objects, so $Y ≤ G$ and $B ≤ G$.
2. It is smaller than any other object that is bigger than them, so for any other object **P** such that **P ≤ G** and **P ≤ B** then we should also have **G ≤ P**.
2. It is smaller than any other object that is bigger than them, so for any other object $P$ such that $P ≤ G$ and $P ≤ B$ then we should also have $G ≤ P$.
![Joins as coproduct](coproduct_join_morphisms.svg)
We can see that the two definitions and their diagrams are the same. So, speaking in category theoretic terms, we can say that the *categorical coproduct* in the category of orders is the *join* operation.
We can see that the two definitions and their diagrams are the same. So, speaking in category theoretic terms, we can say that the *categorical coproduct* in the category of orders is the *join* operation. Which of course means that *products* correspond to *meets*.
Overall, orders are sometimes called "thin categories" as they have equivalents for most categorical concepts, and are often used for modelling structures that are simpler than the ones that require full-fledged categories. We will see an example of that in the next chapter.
<!--
TODO: Formal concept analysis

View File

@ -0,0 +1,99 @@
<?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"
viewBox="0 0 595.3 177"
version="1.1"
id="svg3397"
sodipodi:docname="binary_relation.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata3403">
<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="defs3401" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview3399"
showgrid="false"
inkscape:zoom="2.0525436"
inkscape:cx="292.3581"
inkscape:cy="21.142872"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg3397"
inkscape:document-rotation="0" />
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0"
transform="matrix(0.32913359,-0.00613048,0.03180803,0.45906746,200.70578,-15.323018)">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9"
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"
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="g2605"
transform="matrix(1.1909331,0,0,1.1909331,58.742612,-12.865502)">
<circle
cx="250.16379"
cy="90.603348"
r="24.6"
id="circle3365"
style="opacity:0.12999998;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="245.36378"
cy="84.403351"
r="24.6"
id="circle3379"
style="fill:#fce600;stroke:#ffdd00;stroke-width:6;stroke-miterlimit:10" />
</g>
<g
id="g2601"
transform="matrix(1.1909331,0,0,1.1909331,64.742612,-12.865502)">
<circle
cx="153.12378"
cy="90.683884"
r="24.6"
id="circle3371-9"
style="opacity:0.12999998;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="148.32379"
cy="84.383881"
r="24.6"
id="circle3385-3"
style="fill:#f58235;stroke:#e76524;stroke-width:6;stroke-miterlimit:10" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,186 @@
<?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"
viewBox="0 0 595.3 250"
version="1.1"
id="svg3397"
sodipodi:docname="binary_relation_product.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
width="595.29999"
height="250">
<metadata
id="metadata3403">
<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="defs3401" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview3399"
showgrid="false"
inkscape:zoom="2.0525436"
inkscape:cx="329.76238"
inkscape:cy="71.255726"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg3397"
inkscape:document-rotation="0" />
<path
inkscape:connector-curvature="0"
stroke-miterlimit="10"
d="m 278.87009,229.61941 c -65.10851,-1.05519 -100.02814,-46.74024 -99.12623,-102.3921 0.90193,-55.651878 46.74024,-100.02815 102.39212,-99.12624 55.65186,0.90192 100.02677,46.823952 99.12486,102.47582 -0.90192,55.65185 -46.73889,99.94443 -102.39075,99.04252 z"
id="path9389-3"
style="opacity:0.13999999;stroke:#000000;stroke-width:3.3479197;stroke-miterlimit:10;stroke-dasharray:none" />
<circle
stroke-miterlimit="10"
cx="122.06227"
cy="-278.87015"
id="circle9391-6"
style="fill:#e6e7e8;stroke:#808285;stroke-width:3.3479197;stroke-miterlimit:10;stroke-dasharray:none"
transform="rotate(90.928478)"
r="100.7724" />
<circle
stroke-miterlimit="10"
cx="56.769081"
cy="-252.80212"
r="23.1"
id="circle9401-6"
style="fill:#ffffff;fill-opacity:1;stroke:#808285;stroke-width:4;stroke-miterlimit:10;stroke-dasharray:none"
transform="rotate(90.928478)" />
<circle
stroke-miterlimit="10"
cx="129.95177"
cy="-207.82463"
r="23.1"
id="circle9461-3"
style="fill:#ffffff;fill-opacity:1;stroke:#808285;stroke-width:4;stroke-miterlimit:10;stroke-dasharray:none"
transform="rotate(90.928478)" />
<circle
stroke-miterlimit="10"
cx="78.308594"
cy="-332.14389"
r="23.1"
id="circle9479-1"
style="fill:#ffffff;fill-opacity:1;stroke:#808285;stroke-width:4;stroke-miterlimit:10;stroke-dasharray:none"
transform="rotate(90.928478)" />
<circle
stroke-miterlimit="10"
cx="163.40862"
cy="-327.94388"
r="23.1"
id="circle9485-0"
style="fill:#ffffff;fill-opacity:1;stroke:#808285;stroke-width:4;stroke-miterlimit:10;stroke-dasharray:none"
transform="rotate(90.928478)" />
<circle
stroke-miterlimit="10"
cx="148.70863"
cy="-270.44388"
r="23.1"
id="circle9467-6"
style="fill:#ffffff;fill-opacity:1;stroke:#808285;stroke-width:4;stroke-miterlimit:10;stroke-dasharray:none"
transform="rotate(90.928478)" />
<circle
cx="314.0593"
cy="167.90691"
r="10.438592"
id="circle3383-7"
style="fill:#d71920;stroke:#be1e2d;stroke-width:2.54599571;stroke-miterlimit:10" />
<circle
cx="256.69656"
cy="152.93321"
r="10.221382"
id="circle3389-9"
style="fill:#54b948;stroke:#00873a;stroke-width:2.4930191;stroke-miterlimit:10" />
<circle
cx="336.2941"
cy="168.39952"
r="10.877861"
id="circle3385"
style="fill:#f58235;stroke:#e76524;stroke-width:2.65313673;stroke-miterlimit:10" />
<circle
cx="339.78506"
cy="83.239616"
r="10.498181"
id="circle272-3-4"
style="fill:#fce600;stroke:#ffdd00;stroke-width:2.5605309;stroke-miterlimit:10" />
<circle
cx="241.67113"
cy="60.97649"
r="10.498181"
id="circle274-5-2-7-9"
style="fill:#39bced;stroke:#008dd2;stroke-width:2.5605309;stroke-miterlimit:10" />
<circle
cx="318.62903"
cy="82.403069"
r="10.877861"
id="circle3385-7"
style="fill:#f58235;stroke:#e76524;stroke-width:2.65313673;stroke-miterlimit:10" />
<g
id="g4363-0"
transform="matrix(0.44218946,0,0,0.44218946,25.540662,6.2716402)">
<circle
cx="539.70001"
cy="133.7"
r="24.6"
id="circle3373-9"
style="opacity:0.12999998;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="534.71521"
cy="126.90238"
r="24.6"
id="circle3387-3"
style="fill:#8967ac;stroke:#651c5f;stroke-width:6;stroke-miterlimit:10" />
</g>
<g
id="g4359-6"
transform="matrix(0.44218946,0,0,0.44218946,161.97735,124.55073)">
<circle
cx="271.79999"
cy="72.099998"
r="24.6"
id="circle3367-0"
style="opacity:0.12999998;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="264.84811"
cy="65.602043"
r="24.6"
id="circle3381-6"
style="fill:#39bced;stroke:#008dd2;stroke-width:6;stroke-miterlimit:10" />
</g>
<circle
cx="195.35522"
cy="133.57024"
r="10.877861"
id="circle3379-6"
style="fill:#fce600;stroke:#ffdd00;stroke-width:2.65313673;stroke-miterlimit:10" />
<circle
cx="217.79068"
cy="133.06078"
r="10.877861"
id="circle3389-2"
style="fill:#54b948;stroke:#00873a;stroke-width:2.65313673;stroke-miterlimit:10" />
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -0,0 +1,309 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:ns="foo"
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="svg2850"
sodipodi:docname="functor_programming_objects.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata2856">
<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="defs2854" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview2852"
showgrid="false"
inkscape:zoom="1.9283913"
inkscape:cx="215.01887"
inkscape:cy="100.74849"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="switch2848"
inkscape:document-rotation="0" />
<switch
transform="translate(0 -159)"
id="switch2848">
<g
ns:extraneous="self"
id="g2846"
transform="translate(3.5669904,3.3024829)">
<path
d="m 233.90488,242.24453 c 0,0 1.41544,-0.39525 3.86203,-0.99497 1.28716,-0.33166 2.70259,-0.7269 4.44092,-1.12928 1.73887,-0.40237 3.60547,-0.86779 5.79605,-1.34088 8.4378,-1.88359 19.85667,-3.71127 31.29803,-4.62676 11.4408,-0.91658 23.10088,-0.8656 31.79414,-0.26368 4.28303,0.33221 7.97841,0.49502 10.44747,0.80585 l 1.55796,0.14911 2.01242,-15.59721 c 11.12395,7.23177 21.29185,15.09177 30.17916,23.58768 -12.23184,2.99916 -23.85409,7.07882 -34.551,11.92814 l 1.88469,-15.53416 -1.55797,-0.14801 c -2.46906,-0.31138 -6.03671,-0.53778 -10.25176,-0.75048 -8.49811,-0.5449 -19.83365,-0.60301 -31.0793,0.36948 -11.31308,0.85299 -22.40852,2.673 -30.71859,4.49354 -2.0623,0.40896 -3.9289,0.87492 -5.66832,1.2773 -1.73832,0.40183 -3.15376,0.79707 -4.31264,1.06514 -2.44658,0.60027 -3.73319,0.93193 -3.73319,0.93193 z"
fill="#9d539f"
stroke-width="0.164458"
id="path2810" />
<path
d="m 223.47659,263.94971 c 0,0 1.51192,-0.37167 4.12516,-0.93576 1.37487,-0.31192 2.88679,-0.68305 4.74407,-1.06131 1.85783,-0.37825 3.85161,-0.81626 6.19185,-1.26084 9.0134,-1.77067 21.21126,-3.48871 33.43324,-4.34992 12.22198,-0.86121 24.67694,-0.81351 33.96334,-0.24778 4.57523,0.31247 8.52332,0.46597 11.16068,0.75815 l 1.66431,0.13979 2.14948,-14.66418 c 11.88264,6.7998 22.74455,14.18944 32.23872,22.17663 -13.06675,2.81936 -25.48224,6.65507 -36.90879,11.21385 l 2.01297,-14.60389 -1.66432,-0.13978 c -2.63681,-0.29219 -6.4484,-0.50543 -10.95127,-0.70498 -9.07753,-0.51256 -21.18659,-0.56738 -33.1997,0.347 -12.08494,0.80201 -23.93689,2.51292 -32.81433,4.22439 -2.20319,0.38483 -4.19697,0.82229 -6.05481,1.20054 -1.85727,0.37825 -3.36919,0.74993 -4.60756,1.0021 a 436.03056,436.03056 0 0 0 -3.98811,0.87547 z"
fill="#e90909"
stroke-width="0.164458"
id="path2812" />
<path
style="opacity:0.12999998;stroke:#000000;stroke-width:11.14949989;stroke-miterlimit:10"
d="m 449.84894,270.74164 a 45.712955,45.712955 0 0 1 -45.71295,45.71295 45.712955,45.712955 0 0 1 -45.71296,-45.71295 45.712955,45.712955 0 0 1 45.71296,-45.71296 45.712955,45.712955 0 0 1 45.71295,45.71296 z"
id="circle268" />
<path
d="m 219.16286,302.04918 c 0,0 1.62484,0.4073 4.43379,1.02458 1.47793,0.34097 3.10278,0.74827 5.0993,1.16216 1.99652,0.41334 4.13996,0.89246 6.65507,1.37816 9.68768,1.93622 22.79499,3.80447 35.92533,4.72653 13.13034,0.92206 26.50736,0.83764 36.4801,0.18858 4.91291,-0.35687 9.15264,-0.53668 11.98407,-0.86615 l 1.78711,-0.15898 2.36161,16.21174 c 12.73893,-7.54918 24.37818,-15.74961 34.54717,-24.60678 -14.04472,-3.08523 -27.39324,-7.29535 -39.68265,-12.30859 l 2.21471,16.14595 -1.78711,0.15898 c -2.83198,0.32946 -6.92479,0.57451 -11.75986,0.80694 -9.74852,0.58931 -22.75442,0.6803 -35.66,-0.30041 -12.98342,-0.85628 -25.72015,-2.71904 -35.26092,-4.58948 -2.36765,-0.41991 -4.51108,-0.89903 -6.50705,-1.31237 -1.99707,-0.41389 -3.62192,-0.82065 -4.95294,-1.09639 -2.80894,-0.61726 -4.28687,-0.95824 -4.28687,-0.95824 z"
fill="#0e2db8"
stroke-width="0.164458"
id="path2814" />
<path
d="m 233.82814,286.49693 c 0,0 1.41159,0.25874 3.84229,0.61945 1.28058,0.20667 2.69163,0.46542 4.41679,0.69676 1.72517,0.23188 3.5808,0.5153 5.75001,0.77295 8.3627,1.05417 19.59902,1.73777 30.75531,1.48012 11.15574,-0.25765 22.41454,-1.53384 30.74655,-3.0655 4.10048,-0.79214 7.65278,-1.348 10.00289,-1.92745 l 1.48889,-0.3163 3.68934,15.85212 c 9.93766,-8.61542 18.88089,-17.77793 26.51723,-27.46067 -12.15345,-1.80466 -23.83821,-4.78629 -34.71492,-8.65763 l 3.55888,15.80004 -1.4889,0.31686 c -2.35011,0.57944 -5.77193,1.18684 -9.82034,1.84796 -8.1489,1.45326 -19.09414,2.70314 -30.06733,2.88185 -11.02528,0.30918 -21.94858,-0.40072 -30.1808,-1.40337 -2.03819,-0.20502 -3.89382,-0.48899 -5.61899,-0.72033 -1.72462,-0.23189 -3.13567,-0.49009 -4.28578,-0.64467 -2.43069,-0.36127 -3.71127,-0.56739 -3.71127,-0.56739 z"
fill="#04bd3d"
stroke-width="0.164458"
id="path2816" />
<path
style="opacity:0.12999998;stroke:#000000;stroke-width:11.14949989;stroke-miterlimit:10"
d="m 245.75791,270.79187 a 45.712955,45.712955 0 0 1 -45.71296,45.71296 45.712955,45.712955 0 0 1 -45.71295,-45.71296 45.712955,45.712955 0 0 1 45.71295,-45.71296 45.712955,45.712955 0 0 1 45.71296,45.71296 z"
id="circle268-6" />
<path
transform="rotate(22.196)"
style="fill:#dbdb8b;stroke:#878578;stroke-width:5.78015995;stroke-miterlimit:10"
d="m 329.7359,173.33594 a 49.132961,49.132961 0 0 1 -49.13296,49.13296 49.132961,49.132961 0 0 1 -49.13297,-49.13296 49.132961,49.132961 0 0 1 49.13297,-49.13296 49.132961,49.132961 0 0 1 49.13296,49.13296 z"
id="circle2818" />
<g
aria-label="isEven"
transform="rotate(-4.889)"
style="font-weight:700;font-size:14.61870003px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0;word-spacing:0;fill:#9d539f;stroke-width:0.54819399"
id="text2822">
<path
d="m 233.23479,249.28354 h 2.55542 v 7.9946 h -2.55542 z m 0,-3.11219 h 2.55542 v 2.08431 h -2.55542 z"
style="stroke-width:0.54819399"
id="path137070" />
<path
d="m 244.49148,249.53337 v 1.94154 q -0.82088,-0.34262 -1.58465,-0.51394 -0.76377,-0.17131 -1.44188,-0.17131 -0.72808,0 -1.08498,0.18559 -0.34977,0.17845 -0.34977,0.55677 0,0.30693 0.26411,0.47111 0.27125,0.16417 0.96364,0.24269 l 0.44969,0.0642 q 1.96296,0.24983 2.64108,0.82088 0.67811,0.57104 0.67811,1.79164 0,1.27771 -0.94222,1.92014 -0.94222,0.64242 -2.81239,0.64242 -0.79232,0 -1.64175,-0.12848 -0.84229,-0.12135 -1.73454,-0.37118 v -1.94155 q 0.76377,0.37118 1.56323,0.55677 0.8066,0.18559 1.63461,0.18559 0.74949,0 1.12781,-0.20701 0.37832,-0.207 0.37832,-0.61387 0,-0.34262 -0.26411,-0.5068 -0.25697,-0.17131 -1.03502,-0.2641 l -0.44969,-0.0571 q -1.70599,-0.21414 -2.39125,-0.79232 -0.68525,-0.57818 -0.68525,-1.75596 0,-1.27057 0.87084,-1.88444 0.87084,-0.61387 2.66963,-0.61387 0.70667,0 1.48471,0.10707 0.77805,0.10707 1.69172,0.33549 z"
style="stroke-width:0.54819399"
id="path137072" />
<path
d="m 247.06117,246.62105 h 7.41642 v 2.07717 h -4.66828 v 1.98437 h 4.3899 v 2.07717 h -4.3899 v 2.44121 h 4.82532 v 2.07717 h -7.57346 z"
style="stroke-width:0.54819399"
id="path137074" />
<path
d="m 255.92661,249.28354 h 2.55542 l 1.99151,5.52484 1.98437,-5.52484 h 2.56256 l -3.14787,7.9946 h -2.80525 z"
style="stroke-width:0.54819399"
id="path137076" />
<path
d="m 274.44268,253.25942 v 0.72808 h -5.97454 q 0.0928,0.89939 0.64956,1.34909 0.55677,0.4497 1.5561,0.4497 0.80659,0 1.64888,-0.23556 0.84943,-0.24269 1.74168,-0.72808 v 1.9701 q -0.90653,0.34263 -1.81306,0.51394 -0.90653,0.17845 -1.81306,0.17845 -2.16996,0 -3.37629,-1.09926 -1.19919,-1.10639 -1.19919,-3.09791 0,-1.95582 1.17777,-3.07649 1.18492,-1.12067 3.25495,-1.12067 1.88444,0 3.01225,1.13495 1.13495,1.13494 1.13495,3.03366 z m -2.6268,-0.84942 q 0,-0.72808 -0.42828,-1.17064 -0.42114,-0.4497 -1.1064,-0.4497 -0.74235,0 -1.20632,0.42115 -0.46398,0.414 -0.57819,1.19919 z"
style="stroke-width:0.54819399"
id="path137078" />
<path
d="m 284.41452,252.41 v 4.86814 h -2.5697 v -0.79232 -2.93374 q 0,-1.03501 -0.05,-1.42761 -0.0428,-0.39259 -0.15704,-0.57818 -0.1499,-0.24983 -0.40687,-0.38545 -0.25697,-0.14276 -0.58532,-0.14276 -0.79946,0 -1.25629,0.62101 -0.45683,0.61387 -0.45683,1.70599 v 3.93306 h -2.55542 v -7.9946 h 2.55542 v 1.17063 q 0.57818,-0.69952 1.22774,-1.02787 0.64956,-0.33549 1.43474,-0.33549 1.38478,0 2.09859,0.84943 0.72094,0.84942 0.72094,2.46976 z"
style="stroke-width:0.54819399"
id="path137080" />
</g>
<g
aria-label="isOdd"
transform="rotate(-4.227)"
style="font-weight:700;font-size:14.61870003px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0;word-spacing:0;fill:#e90909;stroke-width:0.54819399"
id="text2826">
<path
d="m 233.16953,267.38287 h 2.55542 v 7.9946 h -2.55542 z m 0,-3.11218 h 2.55542 v 2.0843 h -2.55542 z"
style="stroke-width:0.54819399"
id="path137083" />
<path
d="m 244.42621,267.6327 v 1.94155 q -0.82087,-0.34263 -1.58464,-0.51394 -0.76377,-0.17131 -1.44188,-0.17131 -0.72808,0 -1.08498,0.18559 -0.34977,0.17845 -0.34977,0.55676 0,0.30694 0.26411,0.47111 0.27124,0.16418 0.96363,0.2427 l 0.4497,0.0642 q 1.96296,0.24983 2.64107,0.82087 0.67812,0.57105 0.67812,1.79165 0,1.27771 -0.94222,1.92013 -0.94222,0.64243 -2.81239,0.64243 -0.79232,0 -1.64175,-0.12849 -0.84229,-0.12135 -1.73454,-0.37118 v -1.94154 q 0.76377,0.37117 1.56323,0.55676 0.8066,0.18559 1.63461,0.18559 0.74949,0 1.12781,-0.207 0.37831,-0.207 0.37831,-0.61387 0,-0.34263 -0.2641,-0.5068 -0.25697,-0.17132 -1.03502,-0.26411 l -0.44969,-0.0571 q -1.706,-0.21415 -2.39125,-0.79233 -0.68525,-0.57818 -0.68525,-1.75595 0,-1.27057 0.87084,-1.88445 0.87084,-0.61387 2.66963,-0.61387 0.70666,0 1.48471,0.10707 0.77805,0.10707 1.69171,0.33549 z"
style="stroke-width:0.54819399"
id="path137085" />
<path
d="m 251.86405,266.51917 q -1.25629,0 -1.94868,0.92794 -0.69239,0.92795 -0.69239,2.61252 0,1.67744 0.69239,2.60539 0.69239,0.92794 1.94868,0.92794 1.26343,0 1.95582,-0.92794 0.69239,-0.92795 0.69239,-2.60539 0,-1.68457 -0.69239,-2.61252 -0.69239,-0.92794 -1.95582,-0.92794 z m 0,-1.99151 q 2.56969,0 4.02585,1.47043 1.45616,1.47044 1.45616,4.06154 0,2.58397 -1.45616,4.05441 -1.45616,1.47044 -4.02585,1.47044 -2.56256,0 -4.02585,-1.47044 -1.45616,-1.47044 -1.45616,-4.05441 0,-2.5911 1.45616,-4.06154 1.46329,-1.47043 4.02585,-1.47043 z"
style="stroke-width:0.54819399"
id="path137087" />
<path
d="m 264.74821,268.55351 v -4.28282 h 2.56969 v 11.10678 h -2.56969 v -1.15636 q -0.52822,0.70667 -1.1635,1.03502 -0.63529,0.32835 -1.47044,0.32835 -1.47757,0 -2.42693,-1.17064 -0.94936,-1.17778 -0.94936,-3.02653 0,-1.84875 0.94936,-3.01939 0.94936,-1.17778 2.42693,-1.17778 0.82801,0 1.4633,0.33549 0.64242,0.32835 1.17064,1.02788 z m -1.68458,5.17508 q 0.82087,0 1.24916,-0.5996 0.43542,-0.59959 0.43542,-1.74168 0,-1.14209 -0.43542,-1.74168 -0.42829,-0.5996 -1.24916,-0.5996 -0.81374,0 -1.24916,0.5996 -0.42828,0.59959 -0.42828,1.74168 0,1.14209 0.42828,1.74168 0.43542,0.5996 1.24916,0.5996 z"
style="stroke-width:0.54819399"
id="path137089" />
<path
d="m 275.21257,268.55351 v -4.28282 h 2.56969 v 11.10678 h -2.56969 v -1.15636 q -0.52822,0.70667 -1.1635,1.03502 -0.63529,0.32835 -1.47044,0.32835 -1.47757,0 -2.42693,-1.17064 -0.94936,-1.17778 -0.94936,-3.02653 0,-1.84875 0.94936,-3.01939 0.94936,-1.17778 2.42693,-1.17778 0.82802,0 1.4633,0.33549 0.64242,0.32835 1.17064,1.02788 z m -1.68458,5.17508 q 0.82088,0 1.24916,-0.5996 0.43542,-0.59959 0.43542,-1.74168 0,-1.14209 -0.43542,-1.74168 -0.42828,-0.5996 -1.24916,-0.5996 -0.81373,0 -1.24915,0.5996 -0.42829,0.59959 -0.42829,1.74168 0,1.14209 0.42829,1.74168 0.43542,0.5996 1.24915,0.5996 z"
style="stroke-width:0.54819399"
id="path137091" />
</g>
<g
aria-label="isPrime"
transform="rotate(-2.197)"
style="font-weight:700;font-size:14.61870003px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0;word-spacing:0;fill:#04bd3d;stroke-width:0.54819399"
id="text2830">
<path
d="m 241.26742,286.88537 h 2.55541 v 7.9946 h -2.55541 z m 0,-3.11218 h 2.55541 v 2.08431 h -2.55541 z"
style="stroke-width:0.54819399"
id="path137094" />
<path
d="m 252.5241,287.1352 v 1.94155 q -0.82087,-0.34263 -1.58464,-0.51394 -0.76377,-0.17131 -1.44189,-0.17131 -0.72808,0 -1.08498,0.18559 -0.34976,0.17845 -0.34976,0.55676 0,0.30694 0.2641,0.47111 0.27125,0.16418 0.96364,0.2427 l 0.4497,0.0642 q 1.96296,0.24983 2.64107,0.82087 0.67811,0.57105 0.67811,1.79165 0,1.27771 -0.94222,1.92013 -0.94222,0.64243 -2.81239,0.64243 -0.79232,0 -1.64174,-0.12849 -0.84229,-0.12134 -1.73455,-0.37118 v -1.94154 q 0.76377,0.37118 1.56323,0.55677 0.8066,0.18558 1.63461,0.18558 0.7495,0 1.12781,-0.207 0.37832,-0.207 0.37832,-0.61387 0,-0.34263 -0.26411,-0.5068 -0.25697,-0.17131 -1.03501,-0.26411 l -0.4497,-0.0571 q -1.70599,-0.21414 -2.39124,-0.79232 -0.68525,-0.57819 -0.68525,-1.75596 0,-1.27057 0.87084,-1.88444 0.87084,-0.61387 2.66962,-0.61387 0.70667,0 1.48471,0.10707 0.77805,0.10707 1.69172,0.33548 z"
style="stroke-width:0.54819399"
id="path137096" />
<path
d="m 255.09379,284.22288 h 4.56121 q 2.03434,0 3.11932,0.90654 1.09212,0.89939 1.09212,2.56969 0,1.67744 -1.09212,2.58397 -1.08498,0.89939 -3.11932,0.89939 h -1.81306 v 3.6975 h -2.74815 z m 2.74815,1.99152 v 2.97656 h 1.5204 q 0.79946,0 1.23488,-0.38546 0.43542,-0.39259 0.43542,-1.10639 0,-0.7138 -0.43542,-1.09926 -0.43542,-0.38545 -1.23488,-0.38545 z"
style="stroke-width:0.54819399"
id="path137098" />
<path
d="m 271.63263,289.06247 q -0.33549,-0.15703 -0.67098,-0.22841 -0.32835,-0.0785 -0.66384,-0.0785 -0.98505,0 -1.5204,0.63528 -0.52821,0.62815 -0.52821,1.80593 v 3.68322 h -2.55542 v -7.9946 h 2.55542 v 1.3134 q 0.49252,-0.78518 1.12781,-1.14208 0.64242,-0.36404 1.53467,-0.36404 0.12849,0 0.27839,0.0143 0.1499,0.007 0.43542,0.0428 z"
style="stroke-width:0.54819399"
id="path137100" />
<path
d="m 272.9032,286.88537 h 2.55541 v 7.9946 h -2.55541 z m 0,-3.11218 h 2.55541 v 2.08431 h -2.55541 z"
style="stroke-width:0.54819399"
id="path137102" />
<path
d="m 285.32338,288.21305 q 0.48539,-0.74236 1.14922,-1.12781 0.67098,-0.39259 1.47044,-0.39259 1.37764,0 2.09858,0.84942 0.72094,0.84943 0.72094,2.46976 v 4.86814 h -2.56969 v -4.16861 q 0.007,-0.0928 0.007,-0.19273 0.007,-0.0999 0.007,-0.28552 0,-0.84942 -0.24983,-1.22774 -0.24984,-0.38545 -0.8066,-0.38545 -0.72808,0 -1.12781,0.59959 -0.39259,0.5996 -0.40687,1.73454 v 3.92592 h -2.56969 v -4.16861 q 0,-1.32767 -0.22842,-1.70599 -0.22842,-0.38545 -0.81374,-0.38545 -0.73521,0 -1.13494,0.60673 -0.39973,0.59959 -0.39973,1.72027 v 3.93305 h -2.5697 v -7.9946 h 2.5697 v 1.17064 q 0.47111,-0.67811 1.07784,-1.02074 0.61387,-0.34262 1.34909,-0.34262 0.82801,0 1.4633,0.39973 0.63528,0.39973 0.96363,1.12067 z"
style="stroke-width:0.54819399"
id="path137104" />
<path
d="m 301.12699,290.86126 v 0.72808 h -5.97453 q 0.0928,0.89939 0.64956,1.34909 0.55677,0.44969 1.55609,0.44969 0.8066,0 1.64889,-0.23555 0.84942,-0.24269 1.74168,-0.72808 v 1.9701 q -0.90653,0.34262 -1.81306,0.51394 -0.90653,0.17845 -1.81306,0.17845 -2.16997,0 -3.3763,-1.09926 -1.19919,-1.1064 -1.19919,-3.09791 0,-1.95582 1.17778,-3.07649 1.18491,-1.12067 3.25494,-1.12067 1.88445,0 3.01226,1.13494 1.13494,1.13495 1.13494,3.03367 z m -2.62679,-0.84943 q 0,-0.72808 -0.42829,-1.17064 -0.42114,-0.44969 -1.10639,-0.44969 -0.74236,0 -1.20633,0.42114 -0.46397,0.41401 -0.57818,1.19919 z"
style="stroke-width:0.54819399"
id="path137106" />
</g>
<g
aria-label="&gt;0"
transform="rotate(0.662)"
style="font-weight:700;font-size:14.61870003px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0;word-spacing:0;fill:#0e2db8;stroke-width:0.54819399"
id="text2834">
<path
d="m 277.50721,295.55655 v -1.78451 l 9.15096,3.30491 v 1.68458 l -9.15096,3.30491 v -1.78451 l 6.8882,-2.35555 z"
style="stroke-width:0.54819399"
id="path137109" />
<path
d="m 294.93115,297.16261 q 0,-1.99865 -0.37831,-2.81239 -0.37118,-0.82087 -1.2563,-0.82087 -0.88511,0 -1.26343,0.82087 -0.37831,0.81374 -0.37831,2.81239 0,2.02006 0.37831,2.84808 0.37832,0.82801 1.26343,0.82801 0.87798,0 1.2563,-0.82801 0.37831,-0.82802 0.37831,-2.84808 z m 2.74815,0.0214 q 0,2.64822 -1.14209,4.0901 -1.14208,1.43474 -3.24067,1.43474 -2.10572,0 -3.2478,-1.43474 -1.14209,-1.44188 -1.14209,-4.0901 0,-2.65535 1.14209,-4.09009 1.14208,-1.44188 3.2478,-1.44188 2.09859,0 3.24067,1.44188 1.14209,1.43474 1.14209,4.09009 z"
style="stroke-width:0.54819399"
id="path137111" />
</g>
<g
aria-label="number"
transform="rotate(0.221)"
style="font-weight:700;font-size:16.61470032px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0;word-spacing:0;fill:#9d539f;stroke-width:0.62329602"
id="text2840">
<path
d="m 169.18357,264.69096 v 5.53283 h -2.92056 v -0.90051 -3.3343 q 0,-1.17633 -0.0568,-1.62253 -0.0487,-0.44619 -0.17847,-0.65712 -0.17037,-0.28394 -0.46242,-0.43808 -0.29206,-0.16226 -0.66524,-0.16226 -0.90862,0 -1.42783,0.7058 -0.51921,0.69769 -0.51921,1.93893 v 4.47007 h -2.90432 v -9.08617 h 2.90432 v 1.33048 q 0.65713,-0.79504 1.39538,-1.16823 0.73825,-0.38129 1.63064,-0.38129 1.57385,0 2.38512,0.9654 0.81938,0.96541 0.81938,2.80698 z"
style="fill:#797979;stroke-width:0.4138"
id="path137114" />
<path
d="m 171.77961,266.68667 v -5.54905 h 2.92056 v 0.90862 q 0,0.73825 -0.008,1.85779 -0.008,1.11144 -0.008,1.48462 0,1.09521 0.0568,1.58196 0.0568,0.47865 0.1947,0.69769 0.17848,0.28394 0.46242,0.43808 0.29206,0.15414 0.66524,0.15414 0.90862,0 1.42783,-0.69768 0.51921,-0.69769 0.51921,-1.93893 v -4.48629 h 2.90432 v 9.08617 h -2.90432 v -1.31425 q -0.65713,0.79504 -1.39538,1.17633 -0.73014,0.37318 -1.61442,0.37318 -1.57385,0 -2.40134,-0.9654 -0.81938,-0.96541 -0.81938,-2.80698 z"
style="fill:#797979;stroke-width:0.4138"
id="path137116" />
<path
d="m 192.12613,262.64657 q 0.55166,-0.84371 1.30614,-1.28179 0.76259,-0.4462 1.6712,-0.4462 1.56574,0 2.38512,0.9654 0.81938,0.96541 0.81938,2.80698 v 5.53283 h -2.92056 V 265.486 q 0.008,-0.10546 0.008,-0.21904 0.008,-0.11358 0.008,-0.32451 0,-0.9654 -0.28394,-1.39537 -0.28395,-0.43809 -0.91673,-0.43809 -0.82749,0 -1.2818,0.68147 -0.4462,0.68146 -0.46242,1.97137 v 4.46196 H 189.5382 V 265.486 q 0,-1.50895 -0.25961,-1.93892 -0.2596,-0.43809 -0.92484,-0.43809 -0.8356,0 -1.28991,0.68958 -0.45431,0.68146 -0.45431,1.95515 v 4.47007 h -2.92055 v -9.08617 h 2.92055 v 1.33048 q 0.53544,-0.77071 1.22501,-1.16011 0.69769,-0.38941 1.53329,-0.38941 0.94107,0 1.66309,0.45431 0.72203,0.45431 1.09521,1.27368 z"
style="fill:#797979;stroke-width:0.4138"
id="path137118" />
<path
d="m 205.85273,268.34976 q 0.93295,0 1.41971,-0.68146 0.49487,-0.68146 0.49487,-1.97948 0,-1.29803 -0.49487,-1.97949 -0.48676,-0.68146 -1.41971,-0.68146 -0.93296,0 -1.43594,0.68957 -0.49487,0.68147 -0.49487,1.97138 0,1.28991 0.49487,1.97948 0.50298,0.68146 1.43594,0.68146 z m -1.93081,-5.88166 q 0.60033,-0.79504 1.33047,-1.16823 0.73014,-0.38129 1.67932,-0.38129 1.67932,0 2.7583,1.33859 1.07898,1.33047 1.07898,3.43165 0,2.10117 -1.07898,3.43976 -1.07898,1.33047 -2.7583,1.33047 -0.94918,0 -1.67932,-0.37318 -0.73014,-0.38129 -1.33047,-1.17633 v 1.31425 h -2.90433 v -12.62328 h 2.90433 z"
style="fill:#797979;stroke-width:0.4138"
id="path137120" />
<path
d="m 221.98067,265.65637 v 0.82749 h -6.79029 q 0.10547,1.02219 0.73825,1.53329 0.63279,0.51109 1.76856,0.51109 0.91673,0 1.87402,-0.26772 0.96541,-0.27583 1.97949,-0.82749 v 2.2391 q -1.03031,0.3894 -2.06061,0.58411 -1.03031,0.20281 -2.06062,0.20281 -2.46624,0 -3.83728,-1.24935 -1.36292,-1.25746 -1.36292,-3.52088 0,-2.22287 1.33858,-3.49655 1.3467,-1.27369 3.69937,-1.27369 2.14174,0 3.42354,1.28991 1.28991,1.28991 1.28991,3.44788 z m -2.98546,-0.96541 q 0,-0.82749 -0.48675,-1.33047 -0.47865,-0.5111 -1.25746,-0.5111 -0.84372,0 -1.37104,0.47865 -0.52732,0.47053 -0.65713,1.36292 z"
style="fill:#797979;stroke-width:0.4138"
id="path137122" />
<path
d="m 230.92892,263.61198 q -0.3813,-0.17848 -0.76259,-0.25961 -0.37318,-0.0892 -0.75448,-0.0892 -1.11954,0 -1.72799,0.72203 -0.60034,0.71391 -0.60034,2.0525 v 4.18613 h -2.90432 v -9.08617 h 2.90432 v 1.49273 q 0.55978,-0.89239 1.2818,-1.29803 0.73014,-0.41374 1.74422,-0.41374 0.14603,0 0.31639,0.0162 0.17037,0.008 0.49488,0.0487 z"
style="fill:#797979;stroke-width:0.4138"
id="path137124" />
</g>
<g
aria-label="toBit"
transform="rotate(5.4347187)"
style="font-weight:700;font-size:14.61870003px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0;word-spacing:0;fill:#d45500;stroke-width:0.54819399"
id="text2822-2">
<path
d="m 315.72227,147.35361 v 2.26989 h 2.63393 v 1.82734 h -2.63393 v 3.39057 q 0,0.55676 0.22128,0.75663 0.22128,0.19273 0.87797,0.19273 h 1.3134 v 1.82733 h -2.19137 q -1.51327,0 -2.14855,-0.62814 -0.62815,-0.63529 -0.62815,-2.14855 v -3.39057 h -1.27057 v -1.82734 h 1.27057 v -2.26989 z"
style="fill:#d45500;stroke-width:0.54819399"
id="path137127" />
<path
d="m 323.72401,151.25811 q -0.84943,0 -1.29913,0.61387 -0.44255,0.60674 -0.44255,1.75596 0,1.14922 0.44255,1.7631 0.4497,0.60673 1.29913,0.60673 0.83515,0 1.27771,-0.60673 0.44255,-0.61388 0.44255,-1.7631 0,-1.14922 -0.44255,-1.75596 -0.44256,-0.61387 -1.27771,-0.61387 z m 0,-1.82734 q 2.06289,0 3.21925,1.11354 1.1635,1.11353 1.1635,3.08363 0,1.9701 -1.1635,3.08363 -1.15636,1.11354 -3.21925,1.11354 -2.07003,0 -3.24067,-1.11354 -1.1635,-1.11353 -1.1635,-3.08363 0,-1.9701 1.1635,-3.08363 1.17064,-1.11354 3.24067,-1.11354 z"
style="fill:#d45500;stroke-width:0.54819399"
id="path137129" />
<path
d="m 334.34541,151.0868 q 0.64956,0 0.98505,-0.28552 0.33548,-0.28552 0.33548,-0.84229 0,-0.54963 -0.33548,-0.83515 -0.33549,-0.29266 -0.98505,-0.29266 H 332.825 v 2.25562 z m 0.0928,4.66114 q 0.82801,0 1.24202,-0.34977 0.42114,-0.34976 0.42114,-1.05643 0,-0.69239 -0.414,-1.03501 -0.41401,-0.34977 -1.24916,-0.34977 h -1.6132 v 2.79098 z m 2.55542,-3.83313 q 0.88511,0.25697 1.3705,0.94936 0.48539,0.69239 0.48539,1.69885 0,1.54182 -1.04216,2.29845 -1.04215,0.75663 -3.16928,0.75663 h -4.56121 v -10.65709 h 4.12579 q 2.21993,0 3.21211,0.67098 0.99933,0.67097 0.99933,2.14855 0,0.77804 -0.36404,1.32767 -0.36404,0.54249 -1.05643,0.8066 z"
style="fill:#d45500;stroke-width:0.54819399"
id="path137131" />
<path
d="m 341.10513,149.6235 h 2.55541 v 7.9946 h -2.55541 z m 0,-3.11218 h 2.55541 v 2.0843 h -2.55541 z"
style="fill:#d45500;stroke-width:0.54819399"
id="path137133" />
<path
d="m 348.907,147.35361 v 2.26989 h 2.63394 v 1.82734 H 348.907 v 3.39057 q 0,0.55676 0.22128,0.75663 0.22128,0.19273 0.87798,0.19273 h 1.3134 v 1.82733 h -2.19138 q -1.51326,0 -2.14855,-0.62814 -0.62815,-0.63529 -0.62815,-2.14855 v -3.39057 h -1.27057 v -1.82734 h 1.27057 v -2.26989 z"
style="fill:#d45500;stroke-width:0.54819399"
id="path137135" />
</g>
<path
transform="rotate(22.196)"
style="fill:#d9d98d;stroke:#878578;stroke-width:5.78015995;stroke-miterlimit:10"
d="M 520.71887,96.078194 A 49.132961,49.132961 0 0 1 471.58591,145.21115 49.132961,49.132961 0 0 1 422.45295,96.078194 49.132961,49.132961 0 0 1 471.58591,46.945232 49.132961,49.132961 0 0 1 520.71887,96.078194 Z"
id="circle2836" />
<g
aria-label="boolean"
transform="rotate(0.221)"
style="font-weight:700;font-size:16.61470032px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0;word-spacing:0;fill:#9d539f;stroke-width:0.62329602"
id="text2844">
<path
d="m 371.10518,268.07782 q 0.93295,0 1.41971,-0.68146 0.49487,-0.68146 0.49487,-1.97949 0,-1.29802 -0.49487,-1.97948 -0.48676,-0.68146 -1.41971,-0.68146 -0.93296,0 -1.43594,0.68957 -0.49487,0.68146 -0.49487,1.97137 0,1.28991 0.49487,1.97949 0.50298,0.68146 1.43594,0.68146 z m -1.93081,-5.88167 q 0.60033,-0.79504 1.33047,-1.16822 0.73014,-0.38129 1.67932,-0.38129 1.67932,0 2.7583,1.33858 1.07898,1.33048 1.07898,3.43165 0,2.10118 -1.07898,3.43977 -1.07898,1.33047 -2.7583,1.33047 -0.94918,0 -1.67932,-0.37318 -0.73014,-0.3813 -1.33047,-1.17634 v 1.31425 h -2.90433 v -12.62327 h 2.90433 z"
style="fill:#797979;stroke-width:0.4138"
id="path137139" />
<path
d="m 382.48722,262.72348 q -0.9654,0 -1.4765,0.69768 -0.50299,0.68958 -0.50299,1.99571 0,1.30614 0.50299,2.00383 0.5111,0.68957 1.4765,0.68957 0.94918,0 1.45216,-0.68957 0.50299,-0.69769 0.50299,-2.00383 0,-1.30613 -0.50299,-1.99571 -0.50298,-0.69768 -1.45216,-0.69768 z m 0,-2.07684 q 2.34455,0 3.6588,1.26557 1.32237,1.26557 1.32237,3.50466 0,2.23909 -1.32237,3.50467 -1.31425,1.26557 -3.6588,1.26557 -2.35267,0 -3.68314,-1.26557 -1.32236,-1.26558 -1.32236,-3.50467 0,-2.23909 1.32236,-3.50466 1.33047,-1.26557 3.68314,-1.26557 z"
style="fill:#797979;stroke-width:0.4138"
id="path137141" />
<path
d="m 393.90171,262.72348 q -0.9654,0 -1.4765,0.69768 -0.50298,0.68958 -0.50298,1.99571 0,1.30614 0.50298,2.00383 0.5111,0.68957 1.4765,0.68957 0.94918,0 1.45217,-0.68957 0.50298,-0.69769 0.50298,-2.00383 0,-1.30613 -0.50298,-1.99571 -0.50299,-0.69768 -1.45217,-0.69768 z m 0,-2.07684 q 2.34456,0 3.65881,1.26557 1.32236,1.26557 1.32236,3.50466 0,2.23909 -1.32236,3.50467 -1.31425,1.26557 -3.65881,1.26557 -2.35266,0 -3.68314,-1.26557 -1.32236,-1.26558 -1.32236,-3.50467 0,-2.23909 1.32236,-3.50466 1.33048,-1.26557 3.68314,-1.26557 z"
style="fill:#797979;stroke-width:0.4138"
id="path137143" />
<path
d="m 400.99217,257.32857 h 2.90432 v 12.62327 h -2.90432 z"
style="fill:#797979;stroke-width:0.4138"
id="path137145" />
<path
d="m 415.75718,265.38442 v 0.82749 h -6.79028 q 0.10546,1.0222 0.73825,1.53329 0.63279,0.5111 1.76856,0.5111 0.91673,0 1.87402,-0.26772 0.9654,-0.27583 1.97948,-0.82749 v 2.23909 q -1.0303,0.38941 -2.06061,0.58411 -1.0303,0.20282 -2.06061,0.20282 -2.46625,0 -3.83728,-1.24935 -1.36293,-1.25746 -1.36293,-3.52089 0,-2.22286 1.33859,-3.49655 1.3467,-1.27368 3.69937,-1.27368 2.14174,0 3.42353,1.28991 1.28991,1.28991 1.28991,3.44787 z m -2.98545,-0.9654 q 0,-0.82749 -0.48676,-1.33048 -0.47864,-0.51109 -1.25746,-0.51109 -0.84371,0 -1.37104,0.47864 -0.52732,0.47054 -0.65712,1.36293 z"
style="fill:#797979;stroke-width:0.4138"
id="path137147" />
<path
d="m 422.02826,265.86307 q -0.90862,0 -1.37104,0.30828 -0.45431,0.30828 -0.45431,0.90862 0,0.55166 0.36507,0.86805 0.37318,0.30828 1.03031,0.30828 0.81937,0 1.37915,-0.58411 0.55977,-0.59222 0.55977,-1.4765 v -0.33262 z m 4.43761,-1.09521 v 5.18398 h -2.92866 v -1.3467 q -0.58411,0.82749 -1.31425,1.20879 -0.73014,0.37318 -1.77667,0.37318 -1.4116,0 -2.29588,-0.81938 -0.87616,-0.82749 -0.87616,-2.14174 0,-1.59819 1.0952,-2.34455 1.10332,-0.74636 3.45599,-0.74636 h 1.71177 v -0.22716 q 0,-0.68957 -0.54355,-1.00597 -0.54355,-0.3245 -1.69554,-0.3245 -0.93296,0 -1.73611,0.18659 -0.80315,0.18659 -1.49272,0.55977 v -2.21475 q 0.93295,-0.22716 1.87402,-0.34073 0.94106,-0.12169 1.88213,-0.12169 2.45813,0 3.54523,0.97352 1.0952,0.9654 1.0952,3.1477 z"
style="fill:#797979;stroke-width:0.4138"
id="path137149" />
<path
d="m 438.30223,264.41902 v 5.53282 h -2.92056 v -0.9005 -3.3343 q 0,-1.17633 -0.0568,-1.62253 -0.0487,-0.44619 -0.17847,-0.65712 -0.17037,-0.28394 -0.46242,-0.43808 -0.29206,-0.16226 -0.66524,-0.16226 -0.90862,0 -1.42783,0.7058 -0.51921,0.69769 -0.51921,1.93892 v 4.47007 h -2.90432 v -9.08616 h 2.90432 v 1.33047 q 0.65713,-0.79504 1.39538,-1.16822 0.73825,-0.38129 1.63064,-0.38129 1.57385,0 2.38512,0.9654 0.81938,0.96541 0.81938,2.80698 z"
style="fill:#797979;stroke-width:0.4138"
id="path137151" />
</g>
<g
id="g9775"
transform="matrix(0.82572983,0,0,0.82572983,58.271082,98.983539)">
<path
d="m 218.22815,109.35527 c -7.38305,14.27163 -13.38355,28.63245 -17.65523,42.89629 14.6729,-4.16347 29.35072,-6.82454 43.51498,-8.12144 z"
fill="#9d539f"
stroke-width="0.199167"
id="path2810-6"
style="fill:#d45500"
sodipodi:nodetypes="cccc" />
<path
style="fill:#000000;fill-opacity:0;stroke:#d45500;stroke-width:4.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 227.78876,129.15039 c 47.69223,-35.157956 129.04722,-22.13645 156.55801,19.40978"
id="path9756"
sodipodi:nodetypes="cc" />
</g>
</g>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -11,7 +11,7 @@
version="1.1"
id="svg3397"
sodipodi:docname="linear_order.svg"
inkscape:version="1.0.1 (0767f8302a, 2020-10-17)">
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata3403">
<rdf:RDF>
@ -20,7 +20,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@ -35,84 +35,34 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview3399"
showgrid="false"
inkscape:zoom="1.6510641"
inkscape:cx="275.4743"
inkscape:cy="84.808576"
inkscape:zoom="2.0525436"
inkscape:cx="271.29833"
inkscape:cy="81.486934"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg3397"
inkscape:document-rotation="0" />
<circle
cx="250.16379"
cy="90.603348"
r="24.6"
id="circle3365"
style="opacity:0.13;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="56.307613"
cy="92.667412"
r="24.6"
id="circle3369"
style="opacity:0.13;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="153.12378"
cy="90.683884"
r="24.6"
id="circle3371"
style="opacity:0.13;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="351.04132"
cy="94.997795"
r="24.6"
id="circle3375"
style="opacity:0.13;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
fill="#fce600"
stroke="#ffdd00"
cx="245.36378"
cy="84.403351"
r="24.6"
id="circle3379"
style="stroke-width:6;stroke-miterlimit:10" />
<g
id="g4359"
transform="translate(179.00772,21.419883)">
transform="translate(187.00772,21.419883)">
<circle
cx="271.79999"
cy="72.099998"
r="24.6"
id="circle3367"
style="opacity:0.13;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
style="opacity:0.12999998;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
fill="#39bced"
stroke="#008dd2"
cx="264.84811"
cy="65.602043"
r="24.6"
id="circle3381"
style="stroke-width:6;stroke-miterlimit:10" />
style="fill:#39bced;stroke:#008dd2;stroke-width:6;stroke-miterlimit:10" />
</g>
<circle
fill="#d71920"
stroke="#be1e2d"
cx="51.507595"
cy="84.367409"
r="24.6"
id="circle3383"
style="stroke-width:6;stroke-miterlimit:10" />
<circle
fill="#f58235"
stroke="#e76524"
cx="148.32379"
cy="84.383881"
r="24.6"
id="circle3385"
style="stroke-width:6;stroke-miterlimit:10" />
<g
id="g4363"
transform="translate(10.910065,-39.37605)">
@ -132,98 +82,138 @@
style="stroke-width:6;stroke-miterlimit:10" />
</g>
<circle
fill="#54b948"
stroke="#00873a"
cx="343.96902"
cy="86.556648"
cx="367.04132"
cy="94.997795"
r="24.6"
id="circle3389"
style="stroke-width:6;stroke-miterlimit:10" />
id="circle3375"
style="opacity:0.12999998;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0"
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,22.156493,-3.7462915)">
<path
style="stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9"
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.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3"
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
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-7"
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,119.32121,-2.5218538)"
inkscape:transform-center-x="90.746292"
inkscape:transform-center-y="15.402261">
<path
style="stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-4"
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.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-3"
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
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-5"
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,216.00259,-2.5206338)">
<path
style="stroke-width:35.526"
inkscape:connector-curvature="0"
id="path1478-7-9-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.649;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1"
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
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-4"
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,315.46626,0.4027295)">
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,325.46626,0.4027295)">
<path
style="stroke-width:35.526"
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-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.649;paint-order:markers fill stroke"
style="stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-31"
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>
<circle
cx="359.96902"
cy="86.556648"
r="24.6"
id="circle3389"
style="fill:#54b948;stroke:#00873a;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="272.16379"
cy="90.603348"
r="24.6"
id="circle3365"
style="opacity:0.12999998;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-2"
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,415.64867,0.1648088)">
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-5"
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,232.00259,-2.5206338)">
<path
style="stroke-width:35.526"
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-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-1"
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>
<circle
cx="267.36377"
cy="84.403351"
r="24.6"
id="circle3379"
style="fill:#fce600;stroke:#ffdd00;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="88.307617"
cy="92.667412"
r="24.6"
id="circle3369"
style="opacity:0.12999998;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<circle
cx="179.12378"
cy="90.683884"
r="24.6"
id="circle3371"
style="opacity:0.12999998;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-2"
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,417.64867,0.1648088)">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-7"
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.649;paint-order:markers fill stroke"
style="stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-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
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-7"
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,139.32121,-2.5218538)"
inkscape:transform-center-x="90.746292"
inkscape:transform-center-y="15.402261">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-4"
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"
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>
<circle
cx="174.32379"
cy="84.383881"
r="24.6"
id="circle3385"
style="fill:#f58235;stroke:#e76524;stroke-width:6;stroke-miterlimit:10" />
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0"
transform="matrix(0.28042832,-0.00522328,0.02710106,0.39113454,48.156493,-3.7462915)">
<path
style="stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9"
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"
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>
<circle
cx="83.507599"
cy="84.367409"
r="24.6"
id="circle3383"
style="fill:#d71920;stroke:#be1e2d;stroke-width:6;stroke-miterlimit:10" />
</svg>

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

@ -35,13 +35,13 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview3399"
showgrid="false"
inkscape:zoom="9.34375"
inkscape:cx="328.01174"
inkscape:cy="3.7406242"
inkscape:zoom="2.3359375"
inkscape:cx="319.69709"
inkscape:cy="-18.092152"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
@ -61,44 +61,6 @@
<g
id="g2760-0"
transform="matrix(0.58065273,0.58065273,-0.58065273,0.58065273,42.036768,-23.943945)">
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-7-0-1"
transform="matrix(-0.25201197,0.05511724,0.10212662,0.34572826,122.61059,73.899896)"
inkscape:transform-center-x="1.985515"
inkscape:transform-center-y="-1.2183682">
<path
style="stroke-width:35.526"
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.649;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
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-7-0-3"
transform="matrix(-0.24851641,0.06919204,0.12139355,0.33944291,-45.479502,113.688)"
inkscape:transform-center-x="-10.078677"
inkscape:transform-center-y="3.5196494">
<path
style="stroke-width:35.526"
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.649;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="g2760-9-8-7-4"
transform="matrix(3.7238294,0,0,3.7238294,-609.47687,-296.97043)"
@ -204,29 +166,31 @@
</g>
<g
id="g2760-9-8-7-4-3"
transform="matrix(1.9814726,0,0,1.9814726,-454.45212,-27.94686)"
style="stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
transform="matrix(1.9814726,0,0,1.9814726,-441.18139,42.830367)"
style="fill:#ececec;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none">
<g
id="g2749-4-6-7-6"
style="fill:#ececec;stroke:#666666;stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
transform="rotate(-37.328029,178.27377,-57.179395)">
<g
id="g10519-1"
style="stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
style="fill:#ececec;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none">
<path
style="opacity:0.12999998;fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
d="M 69.76424,85.225021 A 17.200493,17.200493 0 0 1 52.563747,102.42551 17.200493,17.200493 0 0 1 35.363255,85.225021 17.200493,17.200493 0 0 1 52.563747,68.024529 17.200493,17.200493 0 0 1 69.76424,85.225021 Z"
id="circle3369-5-5-8-0" />
id="circle3369-5-5-8-0"
inkscape:connector-curvature="0" />
<path
style="fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
d="M 68.537605,84.338951 A 17.200493,17.200493 0 0 1 51.337112,101.53944 17.200493,17.200493 0 0 1 34.13662,84.338951 17.200493,17.200493 0 0 1 51.337112,67.138458 17.200493,17.200493 0 0 1 68.537605,84.338951 Z"
id="circle3383-6-6-4-6" />
id="circle3383-6-6-4-6"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
<g
id="g2760-3"
transform="matrix(0.86438585,0,0,0.86438585,-175.72519,161.59708)">
transform="matrix(0.86438585,0,0,0.86438585,-162.45446,232.37431)">
<g
id="g2749-2"
style="fill:#cccccc;stroke:#666666"
@ -234,11 +198,13 @@
<path
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 80.040796,90.58149 a 24.6,24.6 0 0 1 -24.6,24.6 24.6,24.6 0 0 1 -24.6,-24.6 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3369-33-0" />
id="circle3369-33-0"
inkscape:connector-curvature="0" />
<path
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 76.107595,84.367409 a 24.6,24.6 0 0 1 -24.6,24.600001 24.6,24.6 0 0 1 -24.6,-24.600001 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3383-85-6" />
id="circle3383-85-6"
inkscape:connector-curvature="0" />
</g>
<g
aria-label="M"
@ -248,34 +214,37 @@
<path
d="m -34.056867,88.279589 h 6.829136 l 4.738584,11.135672 4.766458,-11.135672 h 6.815198 v 20.807961 h -5.073072 V 93.868331 l -4.794332,11.219299 h -3.400631 l -4.794332,-11.219299 v 15.219219 h -5.087009 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.71357697"
id="path156241" />
id="path156241"
inkscape:connector-curvature="0" />
</g>
</g>
<g
id="g2760-9-8-7-4-3-3"
transform="matrix(1.9814726,0,0,1.9814726,-193.60613,-108.00318)"
style="stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
transform="matrix(1.9814726,0,0,1.9814726,-212.77496,-176.56862)"
style="fill:#ececec;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none">
<g
id="g2749-4-6-7-6-2"
style="fill:#ececec;stroke:#666666;stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
transform="rotate(-37.328029,178.27377,-57.179395)">
<g
id="g10519-1-0"
style="stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
style="fill:#ececec;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none">
<path
style="opacity:0.12999998;fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
d="M 69.76424,85.225021 A 17.200493,17.200493 0 0 1 52.563747,102.42551 17.200493,17.200493 0 0 1 35.363255,85.225021 17.200493,17.200493 0 0 1 52.563747,68.024529 17.200493,17.200493 0 0 1 69.76424,85.225021 Z"
id="circle3369-5-5-8-0-6" />
id="circle3369-5-5-8-0-6"
inkscape:connector-curvature="0" />
<path
style="fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
d="M 68.537605,84.338951 A 17.200493,17.200493 0 0 1 51.337112,101.53944 17.200493,17.200493 0 0 1 34.13662,84.338951 17.200493,17.200493 0 0 1 51.337112,67.138458 17.200493,17.200493 0 0 1 68.537605,84.338951 Z"
id="circle3383-6-6-4-6-1" />
id="circle3383-6-6-4-6-1"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
<g
id="g2760-0-7"
transform="matrix(0.86438585,0,0,0.86438585,83.218886,80.774285)">
transform="matrix(0.86438585,0,0,0.86438585,64.050054,12.208847)">
<g
id="g2749-6-8"
style="fill:#cccccc;stroke:#666666"
@ -283,11 +252,13 @@
<path
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 80.040796,90.58149 a 24.6,24.6 0 0 1 -24.6,24.6 24.6,24.6 0 0 1 -24.6,-24.6 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3369-33-3-6" />
id="circle3369-33-3-6"
inkscape:connector-curvature="0" />
<path
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 76.107595,84.367409 a 24.6,24.6 0 0 1 -24.6,24.600001 24.6,24.6 0 0 1 -24.6,-24.600001 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3383-85-2-8" />
id="circle3383-85-2-8"
inkscape:connector-curvature="0" />
</g>
<g
aria-label="D"
@ -297,7 +268,8 @@
<path
d="m -26.841538,91.417825 v 12.696615 h 1.923307 q 3.289135,0 5.017324,-1.63063 1.742127,-1.63063 1.742127,-4.738582 0,-3.094016 -1.72819,-4.71071 -1.728189,-1.616693 -5.031261,-1.616693 z m -5.36575,-4.05567 h 5.658427 q 4.738584,0 7.052128,0.682913 2.32748,0.668977 3.985985,2.28567 1.463386,1.407638 2.174174,3.247324 0.710787,1.839685 0.710787,4.167166 0,2.355352 -0.710787,4.208982 -0.710788,1.83968 -2.174174,3.24732 -1.672442,1.61669 -4.01386,2.29961 -2.341417,0.66897 -7.024253,0.66897 h -5.658427 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.71357697"
id="path156248" />
id="path156248"
inkscape:connector-curvature="0" />
</g>
</g>
</g>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,305 @@
<?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"
viewBox="0 0 595.3 177"
version="1.1"
id="svg3397"
sodipodi:docname="preorder_partial_order.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata3403">
<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="defs3401" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview3399"
showgrid="false"
inkscape:zoom="2.3359375"
inkscape:cx="301.09535"
inkscape:cy="3.7406242"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="g2760-0"
inkscape:document-rotation="0"
showguides="true"
inkscape:guide-bbox="true">
<sodipodi:guide
position="578.41487,-35.590171"
orientation="1,0"
id="guide3917"
inkscape:locked="false" />
</sodipodi:namedview>
<g
id="g2760-8"
transform="translate(392.18394,2.4928396)">
<g
id="g2760-0"
transform="matrix(0.58065273,0.58065273,-0.58065273,0.58065273,42.036768,-23.943945)">
<g
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-7-0-1"
transform="matrix(-0.25201197,0.05511724,0.10212662,0.34572826,122.61059,73.899896)"
inkscape:transform-center-x="1.985515"
inkscape:transform-center-y="-1.2183682">
<path
style="stroke-width:35.526"
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.649;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
style="display:inline;fill:#dddddd;stroke:#838383;stroke-width:6.389;stroke-miterlimit:10"
id="g1482-7-0-7-0-3"
transform="matrix(-0.24851641,0.06919204,0.12139355,0.33944291,-45.479502,113.688)"
inkscape:transform-center-x="-10.078677"
inkscape:transform-center-y="3.5196494">
<path
style="stroke-width:35.526"
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.649;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="g2760-9-8-7-4"
transform="matrix(3.7238294,0,0,3.7238294,-609.47687,-296.97043)"
style="stroke-width:1.3735;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
<g
id="g2749-4-6-7"
style="fill:#ececec;stroke:#666666;stroke-width:1.3735;stroke-miterlimit:4;stroke-dasharray:none"
transform="rotate(-37.328029,178.27377,-57.179395)">
<g
id="g10519"
style="stroke-width:1.3735;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
<path
style="opacity:0.12999998;fill:#ececec;stroke:#666666;stroke-width:1.37349999;stroke-miterlimit:4;stroke-dasharray:none"
d="M 69.76424,85.225021 A 17.200493,17.200493 0 0 1 52.563747,102.42551 17.200493,17.200493 0 0 1 35.363255,85.225021 17.200493,17.200493 0 0 1 52.563747,68.024529 17.200493,17.200493 0 0 1 69.76424,85.225021 Z"
id="circle3369-5-5-8" />
<path
style="fill:#ececec;stroke:#666666;stroke-width:1.37349999;stroke-miterlimit:4;stroke-dasharray:none"
d="M 68.537605,84.338951 A 17.200493,17.200493 0 0 1 51.337112,101.53944 17.200493,17.200493 0 0 1 34.13662,84.338951 17.200493,17.200493 0 0 1 51.337112,67.138458 17.200493,17.200493 0 0 1 68.537605,84.338951 Z"
id="circle3383-6-6-4" />
</g>
</g>
</g>
<g
id="g2760-9-8-7"
transform="matrix(0.86438585,0,0,0.86438585,-158.15326,47.988659)">
<g
id="g2749-4-6"
style="fill:#cccccc;stroke:#666666"
transform="rotate(-37.328029,183.17645,-58.627543)">
<path
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 80.040796,90.58149 a 24.6,24.6 0 0 1 -24.6,24.6 24.6,24.6 0 0 1 -24.6,-24.6 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3369-5-5" />
<path
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 76.107595,84.367409 a 24.6,24.6 0 0 1 -24.6,24.600001 24.6,24.6 0 0 1 -24.6,-24.600001 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3383-6-6" />
</g>
<g
aria-label="G"
transform="matrix(0.69820387,-0.7467102,0.71451093,0.66809626,0,0)"
style="font-style:normal;font-weight:normal;font-size:28.54299927px;line-height:1.25;font-family:sans-serif;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.71357697"
id="text2753-2-9">
<path
d="m 23.307402,225.47818 q -2.00693,0.97559 -4.167166,1.46339 -2.160237,0.4878 -4.459844,0.4878 -5.1985053,0 -8.2367738,-2.8989 -3.0382685,-2.91284 -3.0382685,-7.88835 0,-5.03126 3.0940165,-7.91622 3.0940165,-2.88497 8.4737028,-2.88497 2.076615,0 3.972048,0.39024 1.909371,0.39024 3.595749,1.15677 v 4.30654 q -1.742126,-0.98953 -3.470316,-1.47732 -1.714252,-0.4878 -3.442441,-0.4878 -3.205513,0 -4.947639,1.79788 -1.7281898,1.78393 -1.7281898,5.11488 0,3.30307 1.6724418,5.10094 1.672441,1.79788 4.75252,1.79788 0.836221,0 1.547009,-0.0976 0.724724,-0.1115 1.296142,-0.33449 v -4.04173 h -3.275198 v -3.59575 h 8.362207 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.71357697"
id="path156224" />
</g>
</g>
<g
id="g10526"
transform="translate(-26.256642,65.320909)">
<g
id="g2749-7-7"
style="fill:#cccccc;stroke:#666666"
transform="matrix(0.62600464,-0.59605461,0.59605461,0.62600464,-23.306073,105.23298)">
<path
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 80.040796,90.58149 a 24.6,24.6 0 0 1 -24.6,24.6 24.6,24.6 0 0 1 -24.6,-24.6 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3369-7-4" />
<path
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 76.107595,84.367409 a 24.6,24.6 0 0 1 -24.6,24.600001 24.6,24.6 0 0 1 -24.6,-24.600001 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3383-4-5" />
</g>
<g
aria-label="F"
transform="matrix(0.72509778,-0.72062332,0.68954896,0.69383047,0,0)"
style="font-style:normal;font-weight:normal;font-size:24.67219925px;line-height:1.25;font-family:sans-serif;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.61680597"
id="text2753-1-2">
<path
d="m -51.666764,126.34067 h 12.516804 v 3.50567 h -7.87872 v 3.34906 h 7.408888 v 3.50566 h -7.408888 v 7.62574 h -4.638084 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.61680597"
id="path156229" />
</g>
</g>
<g
id="g2760-9-8-4-4"
transform="matrix(0.86438585,0,0,0.86438585,-99.622192,16.388398)">
<g
id="g2749-4-5-7"
style="fill:#cccccc;stroke:#666666"
transform="rotate(-37.328029,296.07441,96.778899)">
<path
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 80.040796,90.58149 a 24.6,24.6 0 0 1 -24.6,24.6 24.6,24.6 0 0 1 -24.6,-24.6 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3369-5-0-4" />
<path
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 76.107595,84.367409 a 24.6,24.6 0 0 1 -24.6,24.600001 24.6,24.6 0 0 1 -24.6,-24.600001 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3383-6-3-4" />
</g>
<g
aria-label="O"
transform="matrix(0.69820387,-0.7467102,0.71451093,0.66809626,0,0)"
style="font-style:normal;font-weight:normal;font-size:28.54299927px;line-height:1.25;font-family:sans-serif;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.71357697"
id="text2753-2-6-3">
<path
d="m -105.05794,226.65278 q -2.45292,0 -3.80481,1.81181 -1.35189,1.81181 -1.35189,5.10094 0,3.2752 1.35189,5.08701 1.35189,1.81182 3.80481,1.81182 2.46685,0 3.81874,-1.81182 1.351887,-1.81181 1.351887,-5.08701 0,-3.28913 -1.351887,-5.10094 -1.35189,-1.81181 -3.81874,-1.81181 z m 0,-3.88843 q 5.01732,0 7.860471,2.87103 2.84315,2.87102 2.84315,7.93015 0,5.0452 -2.84315,7.91623 -2.843151,2.87102 -7.860471,2.87102 -5.00339,0 -7.86048,-2.87102 -2.84315,-2.87103 -2.84315,-7.91623 0,-5.05913 2.84315,-7.93015 2.85709,-2.87103 7.86048,-2.87103 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.71357697"
id="path156234" />
</g>
</g>
<g
id="g2760-9-8-7-4-3"
transform="matrix(1.9814726,0,0,1.9814726,-454.45212,-27.94686)"
style="stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
<g
id="g2749-4-6-7-6"
style="fill:#ececec;stroke:#666666;stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none"
transform="rotate(-37.328029,178.27377,-57.179395)">
<g
id="g10519-1"
style="stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
<path
style="opacity:0.12999998;fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
d="M 69.76424,85.225021 A 17.200493,17.200493 0 0 1 52.563747,102.42551 17.200493,17.200493 0 0 1 35.363255,85.225021 17.200493,17.200493 0 0 1 52.563747,68.024529 17.200493,17.200493 0 0 1 69.76424,85.225021 Z"
id="circle3369-5-5-8-0" />
<path
style="fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
d="M 68.537605,84.338951 A 17.200493,17.200493 0 0 1 51.337112,101.53944 17.200493,17.200493 0 0 1 34.13662,84.338951 17.200493,17.200493 0 0 1 51.337112,67.138458 17.200493,17.200493 0 0 1 68.537605,84.338951 Z"
id="circle3383-6-6-4-6" />
</g>
</g>
</g>
<g
id="g2760-3"
transform="matrix(0.86438585,0,0,0.86438585,-175.72519,161.59708)">
<g
id="g2749-2"
style="fill:#cccccc;stroke:#666666"
transform="rotate(-44.545114,52.727379,84.306425)">
<path
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 80.040796,90.58149 a 24.6,24.6 0 0 1 -24.6,24.6 24.6,24.6 0 0 1 -24.6,-24.6 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3369-33-0" />
<path
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 76.107595,84.367409 a 24.6,24.6 0 0 1 -24.6,24.600001 24.6,24.6 0 0 1 -24.6,-24.600001 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3383-85-6" />
</g>
<g
aria-label="M"
transform="matrix(0.72045954,-0.72526052,0.69398619,0.68939224,0,0)"
style="font-style:normal;font-weight:normal;font-size:28.54299927px;line-height:1.25;font-family:sans-serif;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.71357697"
id="text2753-15">
<path
d="m -34.056867,88.279589 h 6.829136 l 4.738584,11.135672 4.766458,-11.135672 h 6.815198 v 20.807961 h -5.073072 V 93.868331 l -4.794332,11.219299 h -3.400631 l -4.794332,-11.219299 v 15.219219 h -5.087009 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.71357697"
id="path156241" />
</g>
</g>
<g
id="g2760-9-8-7-4-3-3"
transform="matrix(1.9814726,0,0,1.9814726,-193.60613,-108.00318)"
style="stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
<g
id="g2749-4-6-7-6-2"
style="fill:#ececec;stroke:#666666;stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none"
transform="rotate(-37.328029,178.27377,-57.179395)">
<g
id="g10519-1-0"
style="stroke-width:2.60276;stroke-miterlimit:4;stroke-dasharray:none;fill:#ececec">
<path
style="opacity:0.12999998;fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
d="M 69.76424,85.225021 A 17.200493,17.200493 0 0 1 52.563747,102.42551 17.200493,17.200493 0 0 1 35.363255,85.225021 17.200493,17.200493 0 0 1 52.563747,68.024529 17.200493,17.200493 0 0 1 69.76424,85.225021 Z"
id="circle3369-5-5-8-0-6" />
<path
style="fill:#ececec;stroke:#666666;stroke-width:2.60276008;stroke-miterlimit:4;stroke-dasharray:none"
d="M 68.537605,84.338951 A 17.200493,17.200493 0 0 1 51.337112,101.53944 17.200493,17.200493 0 0 1 34.13662,84.338951 17.200493,17.200493 0 0 1 51.337112,67.138458 17.200493,17.200493 0 0 1 68.537605,84.338951 Z"
id="circle3383-6-6-4-6-1" />
</g>
</g>
</g>
<g
id="g2760-0-7"
transform="matrix(0.86438585,0,0,0.86438585,83.218886,80.774285)">
<g
id="g2749-6-8"
style="fill:#cccccc;stroke:#666666"
transform="rotate(-44.545114,52.727379,84.306425)">
<path
style="opacity:0.12999998;fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 80.040796,90.58149 a 24.6,24.6 0 0 1 -24.6,24.6 24.6,24.6 0 0 1 -24.6,-24.6 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3369-33-3-6" />
<path
style="fill:#cccccc;stroke:#666666;stroke-width:6;stroke-miterlimit:10"
d="m 76.107595,84.367409 a 24.6,24.6 0 0 1 -24.6,24.600001 24.6,24.6 0 0 1 -24.6,-24.600001 24.6,24.6 0 0 1 24.6,-24.600001 24.6,24.6 0 0 1 24.6,24.600001 z"
id="circle3383-85-2-8" />
</g>
<g
aria-label="D"
transform="matrix(0.72045954,-0.72526052,0.69398619,0.68939224,0,0)"
style="font-style:normal;font-weight:normal;font-size:28.54299927px;line-height:1.25;font-family:sans-serif;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.71357697"
id="text2753-0-8">
<path
d="m -26.841538,91.417825 v 12.696615 h 1.923307 q 3.289135,0 5.017324,-1.63063 1.742127,-1.63063 1.742127,-4.738582 0,-3.094016 -1.72819,-4.71071 -1.728189,-1.616693 -5.031261,-1.616693 z m -5.36575,-4.05567 h 5.658427 q 4.738584,0 7.052128,0.682913 2.32748,0.668977 3.985985,2.28567 1.463386,1.407638 2.174174,3.247324 0.710787,1.839685 0.710787,4.167166 0,2.355352 -0.710787,4.208982 -0.710788,1.83968 -2.174174,3.24732 -1.672442,1.61669 -4.01386,2.29961 -2.341417,0.66897 -7.024253,0.66897 h -5.658427 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#4d4d4d;stroke-width:0.71357697"
id="path156248" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -36,15 +36,15 @@ In the context of logic itself, these propositions are abstracted away (i.e. we
Composing propositions
---
At the heart of logic, as in category theory, is the concept of *composition* - if we have two or more propositions that are somehow related to one another, we can combine them into one using a logical operators, like "and", "or" "follows" etc. The result would be a new proposition, not unlike the way in which two monoid objects are combined into one using the monoid operation. And actually some logical operations do form monoids, like for example the operation **and**, with the proposition **true** serving as the identity element.
At the heart of logic, as in category theory, is the concept of *composition* - if we have two or more propositions that are somehow related to one another, we can combine them into one using a logical operators, like "and", "or" "follows" etc. The result would be a new proposition, not unlike the way in which two monoid objects are combined into one using the monoid operation. And actually some logical operations do form monoids, like for example the operation *and*, with the proposition $true$ serving as the identity element.
![Logical operations that form monoids](logic_monoid.svg)
However, unlike monoids/groups, logics have not one but *many* logical operations and logic studies *the ways in which they relate to one another*, for example, in logic we might be interested in the law of distributivity of **and** and **or** operations and what it entails.
However, unlike monoids/groups, logics have not one but *many* logical operations and logic studies *the ways in which they relate to one another*, for example, in logic we might be interested in the law of distributivity of *and* and $or$ operations and what it entails.
![The distributivity operation of "and" and "or"](logic_distributivity.svg)
Important to note that **∧** is the symbol for **and** and **** is the symbol for **or** (although the law above is actually valid even if **and** and **or** are flipped).
Important to note that $∧$ is the symbol for *and* and $$ is the symbol for $or$ (although the law above is actually valid even if *and* and $or$ are flipped).
The equivalence of primary and composite propositions
---
@ -58,13 +58,13 @@ Modus ponens
As an example of a proposition that contains multiple levels of nesting (and also as a great introduction of the subject of logic in its own right), consider one of the oldest (it was already known by Stoics at 3rd century B.C.) and most famous propositions ever, namely the *modus ponens*.
Modus ponens is a proposition that states that if proposition **A** is true and also if proposition **(A → B)** is true (that is if **A** implies **B**), then **B** is true as well. For example, if we know that "Socrates is a human" and that "humans are mortal" (or "being human implies being mortal"), we also know that "Socrates is mortal."
Modus ponens is a proposition that states that if proposition $A$ is true and also if proposition $(A → B)$ is true (that is if $A$ implies $B$), then $B$ is true as well. For example, if we know that "Socrates is a human" and that "humans are mortal" (or "being human implies being mortal"), we also know that "Socrates is mortal."
![Modus ponens](modus_ponens.svg)
Let's dive into it. The proposition is composed of two other propositions in a **follows** relation, where the proposition that follows (**B**) is primary, but the proposition from which **B** follows is not primary (let's call that one **C** - so the whole proposition becomes **C → B**.)
Let's dive into it. The proposition is composed of two other propositions in a $follows$ relation, where the proposition that follows ($B$) is primary, but the proposition from which $B$ follows is not primary (let's call that one $C$ - so the whole proposition becomes $C → B$.)
Going one more level down, we notice that the **C** propositions is itself composed of two propositions in an **and**, relationship - **A** and let's call the other one **D** (so **A ∧ D**), where **D** is itself composed of two propositions, this time in a **follows** relationship - **A → B**. But all of this is better visualized in the diagram.
Going one more level down, we notice that the $C$ propositions is itself composed of two propositions in an *and*, relationship - $A$ and let's call the other one $D$ (so $A ∧ D$), where $D$ is itself composed of two propositions, this time in a $follows$ relationship - $A → B$. But all of this is better visualized in the diagram.
Tautologies
---
@ -81,7 +81,7 @@ The simplest tautology is the statement that each proposition implies itself (e.
![Identity tautology](tautology_identity.svg)
Here are some more complex (less boring) tautologies (the symbol **¬** means "not"/negation.
Here are some more complex (less boring) tautologies (the symbol $¬$ means "not"/negation.
![Tautologies](tautology_list.svg)
@ -96,11 +96,11 @@ Realizing that the colors of the balls in modus ponens are superficial, we may w
This structure (the one that looks like a coloring book in our example) is called *axiom schema*. And the propositions that are produced by it are *axioms*.
Note that the propositions that we plug into the schema don't have to be primary. For example, having the proposition **a** (that is symbolized below by the orange ball) and the proposition stating that **a** implies **a or b** (which is one of the tautologies that we saw above), we can plug those propositions into the *modus ponens* and prove that **a or b** is true.
Note that the propositions that we plug into the schema don't have to be primary. For example, having the proposition $a$ (that is symbolized below by the orange ball) and the proposition stating that $a$ implies $a \lor b$ (which is one of the tautologies that we saw above), we can plug those propositions into the *modus ponens* and prove that $a \lor b$ is true.
![Using modus ponens for rule of inference](modus_ponens_composite.svg)
This is it about *axiom schemas* and *rules of inference are almost the same thing except they allow us to actually distill the conclusion from the premises. For example in the case above, we can use modus ponens as a rule of inference to proves that **a or b** is true.
*Axiom schemas* and *rules of inference* are almost the same thing except they allow us to actually distill the conclusion from the premises. For example in the case above, we can use modus ponens as a rule of inference to proves that $a \lor b$ is true.
All axiom schemas can be easily applied as rules of inference and the other way around.
@ -109,11 +109,11 @@ Logical systems
Knowing that we can use axiom schemas/rules of inference to generate new propositions, we might ask whether it is possible to create a small collection of such schemas/rules that is curated in such a way that it enables us to generate *all* other propositions. You would be happy (although a little annoyed, I imagine) to learn that there exist not only one, but many such collections. And yes, collections of this sort are what we call *logical systems*.
Here is one such collection which consists of the following five axiom schemes **in addition to the inference rule modus ponens** (These are axiom schemes, even though we use colors).
Here is one such collection which consists of the following five axiom schemes *in addition to the inference rule modus ponens* (These are axiom schemes, even though we use colors).
![A minimal collection of Hilbert axioms](min_hilbert.svg)
Proving that this and other similar logical systems are complete (can really generate all other propositions) is due to Gödel and is known as "Gödel's completeness theorem" (Gödel is so important that I specifically searched for the **ö** letter so I can spell his hame right.)
Proving that this and other similar logical systems are complete (can really generate all other propositions) is due to Gödel and is known as "Gödel's completeness theorem" (Gödel is so important that I specifically searched for the "ö" letter so I can spell his hame right.)
Conclusion
---
@ -179,16 +179,16 @@ If we are tired of diagrams, we can represent the composition diagram above as t
Each proposition in classical logic can be proved with such diagrams/tables.
The **and** and **or** operations
The and and or operations
---
OK, *you* know what **and** means and *I* know what it means, but what about those annoying people that want everything to be formally specified (nudge, nudge). Well we already know how we can satisfy them - we just have to construct the boolean function that represents **and**.
OK, *you* know what *and* means and *I* know what it means, but what about those annoying people that want everything to be formally specified (nudge, nudge). Well we already know how we can satisfy them - we just have to construct the boolean function that represents *and*.
Because **and** is a *binary* operator, instead of a single value the function would accept a *pair* of boolean values.
Because *and* is a *binary* operator, instead of a single value the function would accept a *pair* of boolean values.
![And](and.svg)
Here is the equivalent truth-table (in which **∧** is the symbol for **and**.)
Here is the equivalent truth-table (in which $∧$ is the symbol for *and*.)
| p | q | p ∧ q |
|---| --- | --- |
@ -197,7 +197,7 @@ Here is the equivalent truth-table (in which **∧** is the symbol for **and**.)
| False | True | False |
| False | False | False |
We can do the same for **or**, here is the table.
We can do the same for $or$, here is the table.
| p | q | p q |
|---| --- | --- |
@ -206,17 +206,17 @@ We can do the same for **or**, here is the table.
| False | True | True |
| False | False | False |
**Task:** Draw the diagram for **or**.
**Task:** Draw the diagram for *or*.
Using those tables, we can also prove some axiom schemas we can use later:
- For **and**: **p ∧ q → p** and **p ∧ q → q** "If I am tired and hungry, this means that I am hungry".
- For **or**: **p → p q** and **p → p q** "If I have a pen this means that I am either have a pen or a ruler".
- For *and* $p ∧ q → p$ and $p ∧ q → q$ "If I am tired and hungry, this means that I am hungry".
- For *or*: $p → p q$ and $p → p q$ "If I have a pen this means that I am either have a pen or a ruler".
The *implies* operation
---
Let's now look into something less trivial: the *implies* operation, (also known as *entailment*). This operation binds two propositions in a way that the truth of the first one implies the truth of the second one. You can read **p → q** as "if **p** is true, then **q** must also be true.
Let's now look into something less trivial: the *implies* operation, (also known as *entailment*). This operation binds two propositions in a way that the truth of the first one implies the truth of the second one. You can read $p → q$ as "if $p$ is true, then $q$ must also be true.
Entailment is also a binary function - it is represented by a function from an ordered pair of boolean values, to a boolean value.
@ -229,17 +229,17 @@ Entailment is also a binary function - it is represented by a function from an o
Now there are some aspects of this which are non-obvious so let's go through every case.
1. If *p* is true and *q* is also true, then **p** does imply **q** - obviously.
2. If *p* is true but *q* is false then **q** does not follow from **p** - cause *q* would have been true if it did.
3. If *p* is false but *q* is true, then **p** still does imply **q**. What the hell? Consider that by saying that *p* implies *q* we don't say that the two are 100% interdependent e.g. the claim that "drinking alcohol causes headache" does not mean that drinking is the only source of headaches.
4. And finally if **p** is false but **q** is false too, then **p** still does imply **q** (just some other day).
1. If $p$ is true and $q$ is also true, then $p$ does imply $q$ - obviously.
2. If $p$ is true but $q$ is false then $q$ does not follow from $p$ - cause $q$ would have been true if it did.
3. If $p$ is false but $q$ is true, then $p$ still does imply $q$. What the hell? Consider that by saying that $p$ implies $q$ we don't say that the two are 100% interdependent e.g. the claim that "drinking alcohol causes headache" does not mean that drinking is the only source of headaches.
4. And finally if $p$ is false but $q$ is false too, then $p$ still does imply $q$ (just some other day).
It might help you to remember that in classical logic **p → q** (**p** implies **q**) is true when **-p q** (either **p** is false or **q** is true.)
It might help you to remember that in classical logic $p → q$ ($p$ implies $q$) is true when $\neg p q$ (either $p$ is false or $q$ is true.)
Proving results by axioms/rules of inference
---
Let's examine the above formula, stating that **p → q** is the same as **¬p q**.
Let's examine the above formula, stating that $p → q$ is the same as $¬p q$.
![Hilbert formula](hilbert_formula.svg)
@ -252,18 +252,18 @@ We can easily prove this by using truth tables.
| False | True | **True** | True | True | **True** |
| False | False | **True** | True | False | **True** |
But it would be much more intuitive if we do it using axioms and rules of inference. To do so, we have to start with the formula we have (**p → q**) plus the axiom schemas, and arrive at the formula we want to prove (**¬p q**).
But it would be much more intuitive if we do it using axioms and rules of inference. To do so, we have to start with the formula we have ($p → q$) plus the axiom schemas, and arrive at the formula we want to prove ($¬p q$).
Here is one way to do it. The formulas that are used at each step are specified at the right-hand side, the rule of inference is modus ponens.
![Hilbert proof](hilbert_proof.svg)
Note that to really prove that the two formulas are equivalen we have to also do it the other way around (start with (**¬p q**) and (**p → q**)).
Note that to really prove that the two formulas are equivalen we have to also do it the other way around (start with ($¬p q$) and ($p → q$)).
Intuitionistic logic. The BHK interpretation
===
Although the classical truth-functional interpretation of logic works and is correct in its own right, it doesn't fit well the categorical framework that we are using here: It is too "low-level", it relies on manipulating the values of the propositions. According to it, the operations **and**, **or** and **implies** are just 3 of the 16 possible binary logical operations and they are not really connected to each other.
Although the classical truth-functional interpretation of logic works and is correct in its own right, it doesn't fit well the categorical framework that we are using here: It is too "low-level", it relies on manipulating the values of the propositions. According to it, the operations *and* *or* and *implies* are just 3 of the 16 possible binary logical operations and they are not really connected to each other.
For these and other reasons (mostly other, probably), in the 20th century a whole new school of logic was founded, called *intuitionistic logic*. If we view classical logic as based on *set theory*, then intuitionistic logic would be based on *category theory* and its related theories. If *classical logic* is based on Plato's theory of forms, then intuinism began with a philosophical idea originating from Kant and Schopenhauer: the idea that the world as we experience it is largely predetermined of out perceptions of it. As the mathematician L.E.J. Brouwer puts it.
@ -283,10 +283,10 @@ This bivalence is at the heart of what is called the BrouwerHeytingKolmogo
The original formulation of the BHK interpretation is not based on any particular mathematical theory. Here, we will first illustrate it using the language of set theory (just so we can abandon it a little later).
The **and** and **or** operations
The and and or operations
---
As the existence of a proof of a proposition is taken to mean that the proposition is true, the definitions of **and** is rather simple - the proof of **A ∧ B** is just *a pair* containing a proof of **A**, and a proof of **B** i.e. *a set-theoretic product* of the two (see chapter 2). The principle for determining whether the proposition is true or false is similar to that of primary propositions - if the pair of proofs of **A** and **B** exist (i.e. if both proofs exist) then the proof of **A ∧ B** can be constructed (and so **A ∧ B** is "true").
As the existence of a proof of a proposition is taken to mean that the proposition is true, the definitions of *and* is rather simple - the proof of $A ∧ B$ is just *a pair* containing a proof of $A$, and a proof of $B$ i.e. *a set-theoretic product* of the two (see chapter 2). The principle for determining whether the proposition is true or false is similar to that of primary propositions - if the pair of proofs of $A$ and $B$ exist (i.e. if both proofs exist) then the proof of $A ∧ B$ can be constructed (and so $A ∧ B$ is "true").
![And in the BHK interpretation](bhk_and.svg)
@ -295,23 +295,23 @@ As the existence of a proof of a proposition is taken to mean that the propositi
The *implies* operation
---
Saying that **A** implies **B** (**A → B**) would just mean that there exist a function which can convert a proof of **A** to a proof of **B**.
Saying that $A$ implies $B$ ($A → B$) would just mean that there exist a function which can convert a proof of $A$ to a proof of $B$.
![Implies in the BHK interpretation](bhk_implies.svg)
And the *modus ponens* rule of inference is expressed by the fact that if we have a proof of **A** we can call this function (**A → B**) to obtain a proof of **B**.
And the *modus ponens* rule of inference is expressed by the fact that if we have a proof of $A$ we can call this function ($A → B$) to obtain a proof of $B$.
(Note that in order for this to work, we also need to define the functions in terms of sets i.e. we need to have a set representing **A → B** for each **A** and **B**. We will come back to this later.)
(Note that in order for this to work, we also need to define the functions in terms of sets i.e. we need to have a set representing $A → B$ for each $A$ and $B$. We will come back to this later.)
The *negation* operation
---
So according to BHK interpretation saying that **A** is true, means that that we possess a proof of **A** - simple enough. But it's a bit harder to express the fact that **A** is false: it is not enough to say that we *don't have a proof* of **A** (the fact that don't have it, doesn't mean it doesn't exist). Instead, we must show that claiming that **A** is true leads to a *contradiction*.
So according to BHK interpretation saying that $A$ is true, means that that we possess a proof of $A$ - simple enough. But it's a bit harder to express the fact that $A$ is false: it is not enough to say that we *don't have a proof* of $A$ (the fact that don't have it, doesn't mean it doesn't exist). Instead, we must show that claiming that $A$ is true leads to a *contradiction*.
To express this, intuitionistic logic defines the constant **⊥** which plays the role of *False* (and is also known as "absurdity" or "bottom value"). **⊥** is defined as the proof of a formula that does not have any proofs. And the equivalent of false propositions are the ones that imply that the bottom value is provable (which is a contradiction). So **¬A** is **A → ⊥**.
To express this, intuitionistic logic defines the constant $⊥$ which plays the role of *False* (and is also known as "absurdity" or "bottom value"). $⊥$ is defined as the proof of a formula that does not have any proofs. And the equivalent of false propositions are the ones that imply that the bottom value is provable (which is a contradiction). So $¬A$ is $A → ⊥$.
In set theory, the **⊥** constant is expressed by the empty set.
In set theory, the $⊥$ constant is expressed by the empty set.
![False in the BHK interpretation](bhk_false.svg)
@ -346,7 +346,7 @@ Such higher-level interpretations of logic are sometimes called *algebraic* inte
The Curry-Howard isomorphism
---
Programmers might find the definition of the BHK interpretation interesting for other reason - it is very similar to a definition of a programming language: propositions are *types*, the **implies** operations are *functions*, **and** operations are composite types (objects), and **or** operations are *sum types* (which are currently not supported in most programming languages, but that's a separate topic.) Finally a proof of a given proposition is represented by a value of the corresponding type.
Programmers might find the definition of the BHK interpretation interesting for other reason - it is very similar to a definition of a programming language: propositions are *types*, the *implies* operations are *functions*, *and* operations are composite types (objects), and *or* operations are *sum types* (which are currently not supported in most programming languages, but that's a separate topic.) Finally a proof of a given proposition is represented by a value of the corresponding type.
![Logic as a programming language](logic_curry.svg)
@ -380,7 +380,7 @@ So we already saw that a logical system along with a set of primary propositions
![Logic as a preorder](logic_category.svg)
If we assume that there is only one way to go from proposition **A**, to proposition **B** (or there are many ways, but we are not interested in the difference between them), then logic is not only a category, but a *preorder* in which the relationship "bigger than" is taken to mean "implies".
If we assume that there is only one way to go from proposition $A$, to proposition $B$ (or there are many ways, but we are not interested in the difference between them), then logic is not only a category, but a *preorder* in which the relationship "bigger than" is taken to mean "implies".
![Logic as a preorder](logic_preorder.svg)
@ -394,33 +394,33 @@ And so it can be represented by a Hasse diagram, yey.
Now let's examine the question that we asked before - exactly which ~~categories~~ orders represent logic and what laws does an order have to obey so it is isomorphic to a logical system? We will attempt to answer this question as we examine the elements of logic again, this time in the context of orders.
The **and** and **or** operations
The and and or operations
---
By now you probably realized that the **and** and **or** operations are the bread and butter of logic (although it's not clear which is which). As we saw, in the BHK interpretation those are represented by set *products* and *sums*. The equivalent constructs in the realm of order theory are *meets* and *joins* (in category-theoretic terms *products* and *coproducts*.)
By now you probably realized that the *and* and *or* operations are the bread and butter of logic (although it's not clear which is which). As we saw, in the BHK interpretation those are represented by set *products* and *sums*. The equivalent constructs in the realm of order theory are *meets* and *joins* (in category-theoretic terms *products* and *coproducts*.)
![Order meet and joing](lattice_meet_join.svg)
Here comes the first criteria for an order to represent a logical system accurately - *it has to have **meet** and **join** operations for all elements*. Having two elements without a meet would mean that you would have a logical system where there are propositions for which you cannot say that one or the other is true. And this not how logic works, so our order has to have meets and joins for all elements. Incidentally we already know how such orders are called - they are called *lattices*.
Here comes the first criteria for an order to represent a logical system accurately - *it has to have $meet$ and $join$ operations for all elements*. Having two elements without a meet would mean that you would have a logical system where there are propositions for which you cannot say that one or the other is true. And this not how logic works, so our order has to have meets and joins for all elements. Incidentally we already know how such orders are called - they are called *lattices*.
One important law of the **and** and **or** operations, that is not always present in the **meet**-s and **join**-s concerns the connection between the two, i.e. way that they distribute, over one another.
One important law of the *and* and *or* operations, that is not always present in the *meet*-s and *join*-s concerns the connection between the two, i.e. way that they distribute, over one another.
![The distributivity operation of "and" and "or"](logic_distributivity.svg)
Lattices that obey this law are called *distributive lattices*.
Wait, where have we heard about distributive lattices before? In the previous chapter we said that they are isomorphic to *inclusion orders* i.e. orders which contain all combinations of sets of a given number of elements. The fact that they popped up again is not coincidental - "logical" orders are isomorphic to inclusion orders. To understand why, you only need to think about the BHK interpretation - the elements which participate in the inclusion are our prime propositions. And the inclusions are all combinations of these elements, in an **or** relationship (for simplicity's sake, we are ignoring the **and** operation.)
Wait, where have we heard about distributive lattices before? In the previous chapter we said that they are isomorphic to *inclusion orders* i.e. orders which contain all combinations of sets of a given number of elements. The fact that they popped up again is not coincidental - "logical" orders are isomorphic to inclusion orders. To understand why, you only need to think about the BHK interpretation - the elements which participate in the inclusion are our prime propositions. And the inclusions are all combinations of these elements, in an $or$ relationship (for simplicity's sake, we are ignoring the *and* operation.)
![A color mixing poset, ordered by inclusion](logic_poset_inclusion.svg)
**NB: For historical reasons, the symbols for *and* and *or* logical operations are flipped when compared to arrows in the diagrams ∧ is *and* and is *or*.**
$NB: For historical reasons, the symbols for *and* and *or* logical operations are flipped when compared to arrows in the diagrams ∧ is *and* and is *or*.$
The *negation* operation
---
In order for a distributive lattice to represent a logical system, it has to also have objects that correspond to the values **True** and **False**. But to mandate that these objects exist, we must first find a way to specify what they are in order/category-theoretic terms.
In order for a distributive lattice to represent a logical system, it has to also have objects that correspond to the values $True$ and $False$. But to mandate that these objects exist, we must first find a way to specify what they are in order/category-theoretic terms.
A well-known result in logic, called *the principle of explosion*, states that if we have a proof of **False** (or if "**False** is true" if we use the terminology of classical logic), then any and every other statement can be proven. And we also know that no true statement implies **False** (in fact in intuinistic logic this is the definition of a true statement). Based on these criteria we know that the **False** object would look like this when compared to other objects:
A well-known result in logic, called *the principle of explosion*, states that if we have a proof of $False$ (or if "$False$ is true" if we use the terminology of classical logic), then any and every other statement can be proven. And we also know that no true statement implies $False$ (in fact in intuinistic logic this is the definition of a true statement). Based on these criteria we know that the $False$ object would look like this when compared to other objects:
![False, represented as a Hasse diagram](lattice_false.svg)
@ -428,61 +428,65 @@ Circling back to the BHK interpretation, we see that the empty set fits both con
![False, represented as a Hasse diagram](lattice_false_bhk.svg)
Conversely, the proof of **True** (or the statement that "**True** is true") is trivial and doesn't say anything, so *nothing follows from it*, but at the same time it follows from every other statement.
Conversely, the proof of $True$ (or the statement that "$True$ is true") is trivial and doesn't say anything, so *nothing follows from it*, but at the same time it follows from every other statement.
![True, represented as a Hasse diagram](lattice_true.svg)
So **True** and **False** are just the *greatest* and *least* objects of our order (in category-theoretic terms *terminal* and *initial* object.)
So $True$ and $False$ are just the *greatest* and *least* objects of our order (in category-theoretic terms *terminal* and *initial* object.)
![The whole logical system, represented as a Hasse diagram](lattice_true_false.svg)
This is another example of the categorical concept of duality - ***True** and **False** are dual to each other*, (which makes a lot of sense if you think about it).
This is another example of the categorical concept of duality - $True$ and $False$ are dual to each other (which makes a lot of sense if you think about it.)
So in order to represent logic, our distributive lattice has to also be *bounded* i.e. it has to have greatest and least elements (which play the roles of **True** and **False**).
So in order to represent logic, our distributive lattice has to also be *bounded* i.e. it has to have greatest and least elements (which play the roles of $True$ and $False$.)
The *implies* operation
---
Finally, if a lattice really represents a logical system (that is, it is isomorphic to a set of propositions) it also has to have *function objects* i.e. there needs to be a rule that identifies a unique object **A → B** for each pair of objects **A** and **B**, such that all axioms of logic are followed.
Finally, if a lattice really represents a logical system (that is, it is isomorphic to a set of propositions) it also has to have *function objects* i.e. there needs to be a rule that identifies a unique object $A → B$ for each pair of objects $A$ and $B$, such that all axioms of logic are followed.
How would this object be described? You guessed it, using categorical language i.e. by recognizing a structure that consists of set of relations between objects in which (A → B) plays a part.
How would this object be described? You guessed it, using categorical language i.e. by recognizing a structure that consists of set of relations between objects in which ($A → B$) plays a part.
![Implies operation](implies.svg)
This structure is actually a categorical reincarnation our favorite rule of inference, the *modus ponens* (**A ∧ (A → B) → B**). This rule is the essence of the **implies** operation and, because we already know how the operations that it contains (**and** and **implies**) are represented in our lattice, we can directly "categorize" it and use it as a definition, saying that **(A → B)** is the object which is related to objects **A** and **B** in such a way that such that **A ∧ (A → B) → B**.
This structure is actually a categorical reincarnation our favorite rule of inference, the *modus ponens* ($A ∧ (A → B) → B$). This rule is the essence of the *implies* operation and, because we already know how the operations that it contains (*and* and *implies*) are represented in our lattice, we can directly "categorize" it and use it as a definition, saying that $(A → B)$ is the object which is related to objects $A$ and $B$ in such a way that such that $A ∧ (A → B) → B$.
![Implies operation with impostors](implies_modus_ponens.svg)
This definition is not complete, however, because **(A → B)** is *not the only object* that fits in this formula. For example, the set **A → B ∧ C** is also one such object, as is **A → B ∧ C ∧ D**. So how do we set apart the real formula from all those "imposter" formulas? If you remember the definitions of the *categorical product* (or of it's equivalent for orders, the *meet* operation) you would already know where this is going: we define the function object using a *universal property*, by recognizing that all other formulas that can be in the place of **X** in **A ∧ X → B** point to **(A → B)** i.e. they are below **(A → B)** in a Hasse diagram.
This definition is not complete, however, because $(A → B)$ is *not the only object* that fits in this formula. For example, the set $A → B ∧ C$ is also one such object, as is $A → B ∧ C ∧ D$. So how do we set apart the real formula from all those "imposter" formulas? If you remember the definitions of the *categorical product* (or of it's equivalent for orders, the *meet* operation) you would already know where this is going: we define the function object using a *universal property*, by recognizing that all other formulas that can be in the place of $X$ in $A ∧ X → B$ point to $(A → B)$ i.e. they are below $(A → B)$ in a Hasse diagram.
![Implies operation with universal property](implies_universal_property.svg)
Or, using the logic terminology, we say that **A → B ∧ C** and **A → B ∧ C ∧ D** etc. are all "stronger" results than (**A → B**) and so (**A → B**) is the weakest result that fits the formula (stronger results lay lower in the diagram).
Or, using the logic terminology, we say that $A → B ∧ C$ and $A → B ∧ C ∧ D$ etc. are all "stronger" results than ($A → B$) and so ($A → B$) is the weakest result that fits the formula (stronger results lay lower in the diagram).
So this is the final condition for an order/lattice to be a representation of logic - for each pair **A** and **B**, it has to have a unique object **X** which obey the formula **A ∧ X → B** and the universal property. In category theory this object is called the *exponential object*.
So this is the final condition for an order/lattice to be a representation of logic - for each pair $A$ and $B$, it has to have a unique object $X$ which obey the formula $A ∧ X → B$ and the universal property. In category theory this object is called the *exponential object*.
Without being too formal, let's try to test if this definition captures the concept correctly by examining a few special cases.
For example, let's take **A** and **B** to be the same object. In this case, (**A → B**) (or (**A → A**) if you want to be pedantic) would be the topmost object **X** for which the criteria given by the formula **A ∧ X → A** is satisfied. But in this case the formula is *always satisfied* as the *meet* of **A** and any other object would always be below **A**. So this formula is always for all **X**. The topmost object that fits it is, then, the topmost object out there i.e. **True**.
For example, let's take $A$ and $B$ to be the same object. In this case, ($A → B$) (or ($A → A$) if you want to be pedantic) would be the topmost object $X$ for which the criteria given by the formula $A ∧ X → A$ is satisfied. But in this case the formula is *always satisfied* as the *meet* of $A$ and any other object would always be below $A$. So this formula is always for all $X$. The topmost object that fits it is, then, the topmost object out there i.e. $True$.
![Implies identity](implies_identity.svg)
This corresponds to the identity axiom in logic, that states that everything follows from itself.
And by the similar logic we can see easily that if we take **A** to be any object that is below **B**, then **(A → B)** will also correspond to the **True** object.
And by the similar logic we can see easily that if we take $A$ to be any object that is below $B$, then $(A → B)$ will also correspond to the $True$ object.
![Implies when A follows from B](implies_b_follows.svg)
So if we have **A → B** if **A** implies **B**, then **(A → B)** is always true.
So if we have $A → B$ if $A$ implies $B$, then $(A → B)$ is always true.
And what if **B** is lower than **A**. In this case the topmost object that fits the formula **A ∧ X → B** is **B** itself: **B** fits the formula because the meet of two objects is always below those same objects, so **A ∧ B → B** for all **A** and **B**. And **B** is definitely the topmost object that can possibly fit it, as it literary sets its upper bound.
And what if $B$ is lower than $A$. In this case the topmost object that fits the formula $A ∧ X → B$ is $B$ itself: $B$ fits the formula because the meet of two objects is always below those same objects, so $A ∧ B → B$ for all $A$ and $B$. And $B$ is definitely the topmost object that can possibly fit it, as it literary sets its upper bound.
![Implies when B follows from A](implies_a_follows.svg)
Translated to logical language, says that if **B → A**, then the proof of **(A → B)** is just the proof of **B**.
Translated to logical language, says that if $B → A$, then the proof of $(A → B)$ is just the proof of $B$.
Note that this definition does not follow the one from the truth tables exactly. This is because this definition is valid specifically for intuinistic logic. For classical logic, the definition of **(A → B)** is simpler - it is just equivalent to (**-A B**).
Note that this definition does not follow the one from the truth tables exactly. This is because this definition is valid specifically for intuinistic logic. For classical logic, the definition of $(A → B)$ is simpler - it is just equivalent to ($-A B$).
By the way, the law of distributivity follows from this criteria, so the only criteria that are left for an lattice to follow the laws of intuinistic logic is for it to be *bounded* i.e. to have greatest and least objects (**True** and **False**) and to have a function object as described above. Lattices that follow these criteria are called *Heyting algrebras*.
By the way, the law of distributivity follows from this criteria, so the only criteria that are left for an lattice to follow the laws of intuinistic logic is for it to be *bounded* i.e. to have greatest and least objects ($True$ and $False$) and to have a function object as described above. Lattices that follow these criteria are called *Heyting algrebras*.
And for a lattice to follow the laws of classical logic it has to be *bounded* and *distributive* and to be *complemented* which is to say that each proposition **A** should be complemented with a unique proposition **-A** (such that **A -A = 1** and **A ∧ -A = 0**). These lattices are called *Boolean algebras*.
And for a lattice to follow the laws of classical logic it has to be *bounded* and *distributive* and to be *complemented* which is to say that each proposition $A$ should be complemented with a unique proposition $\neg A$ (such that $A \neg A = 1$ and $A ∧ \neg A = 0$). These lattices are called *boolean algebras*.
<!--
https://www.algebraicjulia.org/blog/post/2021/09/cset-graphs-4/
-->

View File

@ -16,14 +16,14 @@ So far, we saw many different categories and category types. Let's review them b
The category of sets
---
We began (in chapters 1 and 2) by reviewing the mother of all categories - *the category of sets* which is not only the prototype of a category, but it contains many other categories, such as the category of types in a programming languages.
We began by reviewing the mother of all categories - *the category of sets* which is not only the archetype of a category, but it contains many other categories, such as the category of types in a programming languages.
![The category of sets](category_sets.svg)
Category types
Special types of categories
---
We learned that they are special types of categories, like categories thatghave just one *object* (monoids, groups) and categories that have only one *morphism* between any two objects (preorders, partial orders).
We also learned about some special types of categories that have some special properties like categories that have just one *object* (monoids, groups) and categories that have only one *morphism* between any two objects (preorders, partial orders.)
![Types of categories](category_types.svg)
@ -37,54 +37,55 @@ We also defined a lot of *categories based on different things*, like the ones b
Finite categories
---
And most importantly, we saw some categories that are *completely made up and have no value whatsoever*, such as my made-up soccer hierarchy. We call those *finite categories*. Although few the finite categories are useful by themselves, the idea of finite categories is important - we can draw any combination of points and arrows and call it a category, in the same way that we can construct a set out of every combination of objects.
And most importantly, we saw some categories that are *completely made up and have no value whatsoever*, such as my made-up soccer hierarchy. We call those *finite categories*. Although they are not useful by themselves, the idea of finite categories is important - we can draw any combination of points and arrows and call it a category, in the same way that we can construct a set out of every combination of objects.
![Finite categories](finite_categories.svg)
For future reference, let's see some examples of finite categories. The simplest category is **0** (enjoy the minimalism of this diagram.)
For future reference, let's see some examples of finite categories. The simplest category is $0$ (enjoy the minimalism of this diagram.)
![The finite category 0](finite_zero.svg)
The next simplest category is **1** - it is comprised of one object no morphism besides its identity morphism (as usual, we don't take note of the identity morphisms unless they are rellevant.)
The next simplest category is $1$ - it is comprised of one object no morphism besides its identity morphism (as usual, we don't draw or in general take note of the identity morphisms unless they are rellevant.)
![the finite category 1](finite_one.svg)
If we increment the number of objects to two, we see a couple of more interesting categories, like for example the category **2** containing two objects and one morphism.
If we increment the number of objects to two, we see a couple of more interesting categories, like for example the category $2$ containing two objects and one morphism.
![the finite category 2](finite_two.svg)
**Task:** There are just two more categories that have 2 objects and at most one morphism between two objects, draw them.
And finally the category **3** has 3 objects and also 3 morphisms (one of which is the composition of the other two.)
And finally the category $3$ has 3 objects and also 3 morphisms (one of which is the composition of the other two.)
![the finite category 3](finite_three.svg)
Categorical Isomorphisms
Isomorphisms
===
Many of the categories we saw have similarities between one another, as for example both the color-mixing order and categories that represent logic have greatest and least objects. To pinpoint such similarities and understand what they mean, we specify formal ways to connect categories to one another. In chapter 1 we talked about set isomorphisms, which establish an equivalence between sets. If you remember, a set isomorphism is a *two-way function* between two sets or, alternatively it can be seen as two "twin" functions each of which equals identity when composed with the other.
Many of the categories we saw have similarities between one another, as for example both the color-mixing order and categories that represent logic have greatest and least objects. To pinpoint such similarities and understand what they mean, we specify formal ways to connect categories with one another.
In chapter 1 we talked about set isomorphisms, which establish an equivalence between sets, if you remember, a set isomorphism is a *two-way function* between two sets, which can alternatively be viewed as two "twin" functions each of which equals identity when composed with the other.
![Set isomorphism](set_isomorphism.svg)
Then, in chapter 4, we mentioned order isomorphisms and saw that they are the same thing as set isomorphisms, but with one extra condition - aside from being there, the functions that define the isomorphism have to preserve the order of the elements i.e. all elements have to have the same arrows pointing to and from them. Or more formally put: **a** and **b**, **a ≤ b** iff **F(a) ≤ F(b)**.
Then, in chapter 4, we mentioned order isomorphisms and saw that they are the same thing as set isomorphisms, but with one extra condition - aside from being there, the functions that define the isomorphism have to preserve the order of the elements i.e. all elements have to have the same arrows pointing to and from them. Or more formally put, for any $a$ and $b$ if we have $a ≤ b$ we should also have $F(a) ≤ F(b)$ (and vise versa.)
![Order isomorphism](order_isomorphism.svg)
We can extend this definition to work for categories as well. However, unlike orders, categories can have more than one morphism between two objects, so the definition is a little more complex.
It is the following: 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 (the "signature" of a function is just its source and target, so two functions have the same signature if they have the same source and target sets).
We can extend this definition to work for categories that have more than one morphism between two objects. The definition is a little more complex, but not a lot. It is the following: 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 (or the same source and target)
![Category isomorphism](category_isomorphism.svg)
Although a little more complex, this definition is the same as the one we have for orders - it is just that when dealing with categories, we have to account for the fact that we can have more than one morphism between two objects and so we need to explicitly specify which one corresponds to which.
If we examine it closely we will see that, although a little bit more complex, this definition is equivalent to the one we have for orders - it is just that when we can have more than one morphism between two given objects we need to explicitly specify which morphism corresponds to which in the other category.
![Category isomorphism](category_order_isomorphism.svg)
In order theory we only need to verify that the corresponding morphism actually exist (this is guaranteed by the *order-preserving* condition.)
And when the categories that we connect with one another can potentially have just one morphism, we only need to connect the objects and to verify that the corresponding morphism actually exist in the other category (this is guaranteed by the *order-preserving* condition.)
![Order isomorphism](category_order_isomorphism_2.svg)
As you see, categorical isomorphisms are easy to define, however they are very *hard to find* in practice - the only one that comes to mind to me is the Curry-Howard-Lambek isomorphism from the last chapter. And the reason for that is simple - if two categories are isomorphic, they basically contain the same data and it would be more accurate to refer to them as different *representations* of the same category than as separate categories.
As you see, categorical isomorphisms are not hard to define, however they are very *hard to find* in practice - the only one that comes to mind to me is the Curry-Howard-Lambek isomorphism from the last chapter. And the reason they are so rare is simple - if two categories are isomorphic, they basically contain the same data and it would be more accurate to refer to them as different *representations* of the same category than as separate categories.
<!--
comics:
@ -96,27 +97,27 @@ Pretty much.
What are functors
===
Much more abundant than isomorphisms, which are two-way connections between categories, are the one-way connections which we will examine next. Those are called *functors*. As with normal functions, every categorical isomorphism is also a functor (or two functors), but not the other way around. This is because, unlike an isomorphism, a functor does not have to point all objects and all morphisms in the target category (again, same as with normal functions.)
Much more abundant than isomorphisms, which are two-way connections between categories, are the one-way connections, which we will examine next. As you can guess, those are called *functors*. They are much like normal functions e.g. just like every set isomorphism is also a function, every categorical isomorphism is also a functor (but not the other way around). So it's quite appropriata to think of functors as *functions between categories.*
![Functor](functor.svg)
And now for the full definition: a functor between two categories (let's call them **A** and **B**) consists of a mapping that maps each *object* in **A** to an object in **B** and a mapping that maps each *morphism* between objects in **A** to a morphism in **B** in a way that preserves the structure of the category.
And now for the full definition: a functor between two categories (let's call them $A$ and $B$) consists of a pair of mappings - a mapping that maps each *object* in $A$ to an object in $B$ and a mapping that maps each *morphism* between any objects in $A$ to a morphism between objects in $B$ in a way that preserves the structure of the category.
Object mapping
---
Let's go through each component of this definition. Firstly, we have a mappings between the categories' objects. These are just regular old functions, so the definition from chapter 1 applies.
> A function is a relationship between two sets that matches each element of one set, called the *domain* of the function, with exactly one element from another set, called the converse domain, or the *codomain* of the function.
> A function is a relationship between two sets that matches each element of one set, called the *source* of the function, with exactly one element from another set, called the converse domain, or the *target* of the function.
![Functor for objects](functor_objects.svg)
Formally, this component of the functor can be defined as a function between the categories' *underlying sets*.
Formally, we can define the object mapping of of the functor as a function between the categories' *underlying sets*.
Morphism mapping
---
The other component of a functor is a mapping between morphisms. This mapping resembles a function as well, but with the added requirement that each morphism with a given source and target must be mapped to a morphism with a corresponding source and target (as per the object mapping.)
The other mapping that forms the functor is a mapping between the categories' morphisms. This mapping resembles a function as well, but with the added requirement that each morphism with a given source and target must be mapped to a morphism with a corresponding source and target, as per the object mapping.
![Functor for morphisms](functor_morphisms.svg)
@ -129,39 +130,43 @@ Note how the concepts of "homomorphism set" and of "underlying set" allowed us t
Functor laws
---
So these are the two components that form a functor. But aside from defining them we should verify that they preserve the structure of the source category into the target. What is the structure of a category? As stated in the category definition in chapter 2:
So these are the two mappings (functions) that form a functor. But not every such pair of mappings is a functor. As we said, in addition to existing, the mappings should *preserve the structure* of the source category into the target category.
> A category is a collection of **objects** (we can think of them as points) and **morphisms** (arrows) that go from one object to another, where:
What is the structure of a category? Let's revisit the definition from chapter 2:
> A category is a collection of *objects* (we can think of them as points) and *morphisms* (arrows) that go from one object to another, where:
> 1. Each object has to have the identity morphism.
> 2. There should be a way to compose two morphisms with an appropriate type signature into a third one in a way that is associative.
So this requirement translates to the following two laws, which are called the *functor laws*
1 Functions between morphisms should *preserve identities* i.e. all identity morphisms should be mapped to other identity morphisms.
1. Functions between morphisms should *preserve identities* i.e. all identity morphisms should be mapped to other identity morphisms.
![Functor](functor_laws_identity.svg)
![Functor](functor_laws_identity.svg)
2 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, so **F(g•f) = F(g)•F(f)**.
![Functor](functor_laws_composition.svg)
2. Functors 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, so $F(g•f) = F(g)•F(f)$.
![Functor](functor_laws_composition.svg)
And this is all there is to it about functors - a simple but, as we will see shortly, very powerful idea.
Diagrams as functors
Diagrams
===
Let's start with one that is very meta. Consider a diagram, any diagram from this book. By definition diagrams are, or aim to be, some kind of description of reality, so in order to understand them we have to relate them to some structure, be it a real-world or mathematical. For this, we have to associate each object from the diagram with an object from the external world, and also each morphism from the diagram with some kind of relationship between the corresponding real-world objects. But diagrams are just finite categories. So when we are perceiving a diagram, we are actually creating a functor in our heads. We might even say that the functor is perception itself.
Let's start with one that is very meta. Consider a diagram, any diagram from this book. By definition diagrams are, or aim to be, some kind of description of reality, so in order to understand them we have to relate them to some structure, be it a real-world or mathematical. For this, we have to associate each object from the diagram with an object from the external world, and also each morphism from the diagram with some kind of relationship between the corresponding real-world objects.
For example, if we consider the preorder representing different cities and the roads in a given region, then a diagram that represents that order is actually just a map of the region where the cities are located.
So diagrams can be seen as a finite categories. But that is only a part of the story. They are finite categories plus ways of interpreting those categories in the context of other categories i.e. functors - when we are perceiving a diagram, we are actually creating a functor in our heads from the category that we see, to some other category. We might even argue (as I did in my blog post about using logic to model real-life thinking) that perception itself is functorial.
For example, if we consider the preorder representing different cities and the roads in a given region, then a diagram that represents that order is actually just a map of the region where the cities are located, together with it's connection to the region it represents
![A map and a preorder of city pathways](preorder_map_functor.svg)
Knowing that the lines on the map represent the roads that connect different points in the city allows you to find your way around, even if there are no labels.
Formally a *diagram* is a finite category (called the *index category* or *schema category*), together with a functor from that category to any other category that provides the interpretation of the category.
Object mapping
---
We already have a pretty good intuition of how diagrams work, but let's but let's try to describe it in detail. The first component of any functor diagram is the mapping from the objects in the diagram to real-world objects. In the case of maps, this is done once by the people who create the map, but also by the user who, when seeing a given place in the map and the corresponding place in real-life, makes a mental connection between the two, based on the map labels.
We already have a pretty good intuition of how diagrams work, but let's try to describe it in detail. The first component of any functor in a diagram is the mapping from the objects in the diagram to real-world objects.
In the case of maps, this is done once by the people who create the map, but also by the user who, when seeing a given place in the map and the corresponding place in real-life, makes a mental connection between the two, based on the map labels.
Morphism mapping
---
@ -171,48 +176,64 @@ The real value of most diagrams lies in the morphisms, and the fact that they co
Functor laws
---
In diagrams, identities are not displayed, as they are mostly irrelevant. Morphisms that are a result of composition are not displayed, but we use them all the time they are called routes.
In diagrams, morphisms that are a result of composition are often not displayed, but we use them all the time
For maps, for example, they are called *routes*.
![A map and a preorder of city pathways](preorder_map_functor_route.svg)
The law of preserving composition tells us that the route we create on a map corresponds to a real-world route.
Constant functor
---
When we think about diagram functors (and even functors in general), our intuition is to think of every object in the souce category being mapped to a *different* object in the target. But that is not always the case. An interesting functor that doesn't follow that rule is the *constant functor* - one that maps *all* objects of the source category to a single object in the target (and all morphisms go to the identity morphism.
![Constant functor](constant_functor.svg)
This one that plays a part in some definitions that we will see later.
Functors in programming
===
Before we think about how functors work in programmers, let's try to answer the million-dollar question: "How are functors *useful*?" (sometimes formulated also as "Why are you wasting my/your time with this?") We just saw that *maps are functors* and we know that *maps are useful*, so let's start from there. And why is a map (or any other kind of diagram) useful? Well, obviously, it is because the points and arrows in the map corresponds to the cities and the roads in the place you are in i.e. because of the very fact that it is a functor, but there is a second aspect as well: *diagrams are simpler to work with than actual thing they are representing i.e.* it is much easier to go through all routes between two given places by following a map than to actually drive through all these routes in real life.
Before we think about what functors are in programming languages, let's try to answer the million-dollar question: "How are functors *useful*?" (sometimes formulated also as "Why are you wasting my/your time with this?") We just saw that *maps are functors* and we know that *maps are useful*, so let's start from there.
It the same point is valid also for programming: a functor from the realm of simple types (like `string`, `number`, `boolean` etc) to a more complex realm (like `Array` and `Map`) allows you to work from the context of the simpler type while actually performing operations on the more complex one.
So why is a map (or any other kind of diagram) useful? Well, it obviously has to do with the fact that the points and arrows of the map corresponds to the cities and the roads in the place you are visiting in i.e. because of the very fact that it is a functor, but there is a second aspect as well: *maps are simpler to work with than actual thing they are representing i.e.* it is much easier to go through all routes between two given places by following a map than to actually drive through all these routes in real life.
If we think about the category of simple types, there are numerous functions between those types, like, as we said before, there are a myriad functions that convert a number to boolean.
It the same point is valid also for programming: a functor from the realm of simple (primitive) types to the realm of more complex types allows you to work from the context of the simpler type while actually performing operations on the more complex one
If we think about the category of simple types (like `string`, `number`, `boolean` etc) there are numerous functions between those types, like, as we said before, there are a myriad functions that convert a number to boolean.
![Functions from array to boolean](set_arrows.svg)
For lists, there aren't that many functions. But there also doesn't need to be that many of them, as with map we can use every function that convert strings to numbers to convert string arrays to number arrays.
For complex types, like `List`, there aren't that many functions. But there also doesn't need to be that many of them, as with `map` we can use every function that convert strings to numbers to convert string arrays to number arrays.
![A functor in programming](functor_programming.svg)
Because they are simpler, maps don't include *all* roads and *all* traveling options. And the same is true for functors in programming - having a functor doesn't allow you to do define *all* operations using only the simple type, only some of them (some are better than nothing, right?)
Let's revisit the general functor definition in the context of programming (by just changing the terms we used, according to the table in chapter 2.)
This would give you some notion for understanding what functors are in abstract terms, to formalize it, let's revisit the general functor definition in the context of programming, by just changing the terms we used, according to the table in chapter 2 and also (last but not least) change the font we use in our formulas from modern to monospaced.
> A functor between two categories (let's call them **A** and **B**) consists of a mapping that maps each *type* in **A** to a type in **B** and a mapping that maps each *function* between types in **A** to a function between types in **B** in a way that preserves the structure of the category.
> A functor between two categories (let's call them `A` and `B`) consists of a mapping that maps each *type* in `A` to a type in `B` and a mapping that maps each *function* between types in `A` to a function between types in `B` in a way that preserves the structure of the category.
(Mathematicians and programmmers are two communities, divided by their common appreciation of peculiar typefaces.)
Type mapping
---
The first component of a functor is a mapping that converts one type (let's call it **A**) to another type (**B**). So it is *like a function, but between types*. Such constructions are supported by almost all programming languages that have static type checking in the first place - they go by the name of *generic types*.
The first component of a functor is a mapping that converts one type (let's call it `A`) to another type (`B`). So it is *like a function, but between types*. Such constructions are supported by almost all programming languages that have static type checking in the first place - they go by the name of *generic types*.
A generic type is nothing but a function (sometimes called a *type-level function*) that maps one concrete type to another concrete type. For example, the type `Array<A>` maps the type `String` to `Array<String>`, `Number` to `Array<Number>` etc.
![A functor in programming - type mapping](functor_programming_objects.svg)
A generic type is nothing but a function (sometimes called a *type-level function*) that maps one concrete type to another concrete type. For example, the type `Array<A>` maps the type `String` to `Array<String>`, `Number` to `Array<Number>` etc.
Here is the time to make the important note that the existence of type-level function does not require that you also define a normal, value-level function, of type `A => Array<A>`. Functors in which such functions exist (which are most of them) are called *pointed functors*.
Function mapping
---
So the type mapping of a functor can correspond to a generic type in a programming language (we can also have functors between two generic types, but we will review those later.) However the nontrivial part of the functor is the *function mapping* - that is a mapping that convert any function operating on simple types, like `String ➞ Number` to a function between their more complex counterparts e.g. `Array<String> ➞ Array<Number>`.
So the type mapping of a functor is simply a generic type in a programming language (we can also have functors between two generic types, but we will review those later.) However the nontrivial part of the functor is the *function mapping* - that is a mapping that convert any function operating on simple types, like `String ➞ Number` to a function between their more complex counterparts e.g. `Array<String> ➞ Array<Number>`.
![A functor in programming - function mapping](functor_programming_morphism.svg)
![A functor in programming - function mapping](functor_programming_morphisms.svg)
In programming languages, this mapping is represented by a higher-order function called `map` with a signature (using Haskell notation), `(a ➞ b) ➞ (Fa ➞ Fb)`, where `F` represents the composite type.
@ -232,14 +253,13 @@ class Array<A> {
}
```
Functor laws
---
Aside from facilitating code reuse by bringing in all standard functions of simple types in a more complex context, `map` allows us to work in a way that is predictable, courtesy of the functor laws, which in programming context look like this.
```
a.map((a => a) == a)
a.map(a => a) == a
const compose = (f, g) => f(g)
a.map(f).map(g) == a.map(compose(g, f))
@ -250,16 +270,16 @@ a.map(f).map(g) == a.map(compose(g, f))
Endofunctors
===
All programming language types are actually in one category, so all the functors used in programming are *endofunctors* (ones in which the source and target category is one and the same) - this doesn't make any difference when it comes to the above definitions (you can also think of the different type families as belonging to different categories if that's easier for you), but it does make a difference in other situations, for example, you can apply an endofunctor **F** to a given value **a** infinitely many times, adding more and more levels of nesting.
Up until now we acted like different type families belong to different categories. However, that is not the case - they are actually one category. So all functors used in programming are *endofunctors* (ones in which the source and target category is one and the same). This doesn't make any difference when it comes to the above definitions (you can also think of the different type families as belonging to different categories if that's easier for you), but it does make a difference in other situations, for example, you can apply an endofunctor $F$ to a given value $a$ infinitely many times, adding more and more levels of nesting.
![A functor in programming as endofunctor](endofunctor_programming.svg)
This might look weird, but it does not lead to any type of paradox - there is nothing wrong about a list that contains other lists, and (though rarely useful in practice) you can have a list of lists of lists, or a list of lists of lists of lists etc (and the functor laws would still hold, provided that you called `map` the right number of times.)
Identity functors
===
Identity functor
---
There is one particular endofuctor that will probably look familiar to you - it is the *identity functor*, the one that maps each object and morphism to itself.
There is one particular endofuctor that will probably look familiar to you - it is the *identity funcor*, the one that maps each object and morphism to itself.
![Identity functor](identity_functor.svg)
@ -268,7 +288,7 @@ The reason this functor is defined is the same reason as the identity morphisms
Homomorphism functors
===
Given any category, we can generate the set of the sets of all morphisms that have a specific type signature with respect to a given object from that category. This is called the *Homomorphism set*, denoted **Hom(B,_)**, **B** being the object that you picked (for example, let's take the brown ball.)
Given any category, we can generate the set of the sets of all morphisms that have a specific type signature with respect to a given object from that category. This is called the *Homomorphism set*, denoted $Hom(B,_)$, $B$ being the object that you picked (for example, let's take the brown ball.)
![Homomorphism set](hom_set.svg)
@ -283,21 +303,21 @@ With the homomorphism functors, we can *represent* any category in the category
Functors in monoids
===
In group theory, there is this cool thing called *group homomorphism* (or *monoid homomorphism* when we are talking about monoids) - it is a function between the groups's underlying sets which preserves the group operation.
In group theory, there is this cool thing called *group homomorphism* (or *monoid homomorphism* when we are talking about monoids) - it is a function between the groupss' underlying sets which preserves the group operation.
If the time of the day right now is **00:00** then what would the time be after **n** hours? The answer to this question can be expressed as a function from and to the set of integers.
If the time of the day right now is $00:00$ then what would the time be after $n$ hours? The answer to this question can be expressed as a function from and to the set of integers.
![Group homomorphism as a function](group_homomorphism_function.svg)
This function is interesting - it preserves the operation of (modular) addition. That is, 13 hours from now the time will be 1 o'clock and if 14 hours from now it will be 2 o'clock, then the time after (13 + 14) hours will be (1 + 2) o'clock.
Or to put it formally, if we call it (the function) **F**, then we have the following equation - **F(a + b) = F(a) m+ F(b)** (where **m+** means modular addition) Because this equation works, the **F** function is a *group homomorphism* between the group of integers under addition and the group of modulo arithmetic with base 11 under modular addition.
Or to put it formally, if we call it (the function) $F$, then we have the following equation - $F(a + b) = F(a) m+ F(b)$ (where $m+$ means modular addition) Because this equation works, the $F$ function is a *group homomorphism* between the group of integers under addition and the group of modulo arithmetic with base 11 under modular addition.
![Group homomorphism](group_homomorphism.svg)
The groups don't have to be so similar for there to be a homomorphism between them. Take, for example, the function that maps any number **n** to 2 (or any other number) to the *power of **n**,* so **n ➞ 2ⁿ**. This function gives a rise to a group homomorphism between the group of integets under addition and the integers under multiplication, or **F(a + b) = F(a) * F(b)**
The groups don't have to be so similar for there to be a homomorphism between them. Take, for example, the function that maps any number $n$ to 2 (or any other number) to the *power of $n$,* so $n ➞ 2ⁿ$. This function gives a rise to a group homomorphism between the group of integets under addition and the integers under multiplication, or $F(a + b) = F(a) * F(b)$
![Group homomorphism between different groups](group_homomorphism_addition_multiplication.svg)
@ -319,25 +339,25 @@ Because of the above, the morphism mapping is the only rellevant component of th
Functor laws
---
The first functor law trivial, it just says that the one and only identity object of the source group (which corresponds to the identity morphism of its one and only object) should be mapped to the one and only identity object of the target group. And we can see that this is the case - in our first example, **0**, the identity of the addition operation, is mapped to **0**. And in the second one **0** is mapped to **1** - the identity object of the multiplication operation.
The first functor law trivial, it just says that the one and only identity object of the source group (which corresponds to the identity morphism of its one and only object) should be mapped to the one and only identity object of the target group. And we can see that this is the case - in our first example, $0$, the identity of the addition operation, is mapped to $0$. And in the second one $0$ is mapped to $1$ - the identity object of the multiplication operation.
As we said, in order for a function to be a group homomorphism, it must satisfy the equation
**F(a + b) = F(a) * F(b)**. And if you remember that, when interpreted categorically, group objects (like **1** and **2** **3** etc.) correspond to morphisms (like **+1**, **+2** **+3** etc.) and the monoid operation of combining two objects corresponds to *functional composition*, you would see that this equation is actually a just a formulation of the second functor law **F(g•f) = F(g)•F(f)**.
$F(a + b) = F(a) * F(b)$. And if you remember that, when interpreted categorically, group objects (like $1$ and $2$ $3$ etc.) correspond to morphisms (like $+1$, $+2$ $+3$ etc.) and the monoid operation of combining two objects corresponds to *functional composition*, you would see that this equation is actually a just a formulation of the second functor law $F(g•f) = F(g)•F(f)$.
**Task:** Figure out how the functor law looks for the other group homorphism that we reviewed.
$Task:$ Figure out how the functor law looks for the other group homorphism that we reviewed.
<!--
**gᵃ gᵇ= gᵃ⁺ᵇ**
$gᵃ gᵇ= gᵃ⁺ᵇ$
-->
**Task:** Although it's trivial, we didn't prove that the first functor law (the one about the preservation of identities always holds. Interestingly enough, for groups/monoids it actually follows from the second law. Try to prove that. Start with the definition of the identity function.
$Task:$ Although it's trivial, we didn't prove that the first functor law (the one about the preservation of identities always holds. Interestingly enough, for groups/monoids it actually follows from the second law. Try to prove that. Start with the definition of the identity function.
<!-- TODO show isomorphism theorems -->
Functors in orders
===
And now let's talk about one concept that is completely unrelated to functors, nudge-nudge (I know you are probably tired of this but hey, bad jokes are better than no jokes at all.) In the theory of orders, we have functions between orders (which is unsurprising, as orders, like monoids/groups, are based on sets.) And one very interesting type of such function, which has applications in calculus and analysis, is a *monotonic function* (also called *monotone map*). This is a function between two orders that *preserves the order* of the elements. So a function **F** is monotonic when for every **a** and **b** in the source order, if **a ≤ b** then **F(a) ≤ F(b)**.
And now let's talk about one concept that is completely unrelated to functors, nudge-nudge (I know you are probably tired of this but hey, bad jokes are better than no jokes at all.) In the theory of orders, we have functions between orders (which is unsurprising, as orders, like monoids/groups, are based on sets.) And one very interesting type of such function, which has applications in calculus and analysis, is a *monotonic function* (also called *monotone map*). This is a function between two orders that *preserves the order* of the elements. So a function $F$ is monotonic when for every $a$ and $b$ in the source order, if $a ≤ b$ then $F(a) ≤ F(b)$.
For example, the function that maps the current time to the distance travelled by some object is monotonoc because the distance travelled increases (or stays the same) as time increases.
@ -364,22 +384,13 @@ Functor laws
It is not hard to see that monotone maps obey the first functor law - identities are the only morphisms that go between a given object and itself.
And the second law also follows from the fact that there is only one morphism with a given signature. Suppose we have a monotone map. Suppose that in the source order we have two morphisms **f :: a ➞ b** and **g :: b ➞ c**. Then, in the target order would contain morphisms that correspond to those two: **F(f): F(a) ➞ F(b)** **F(g): F(b) ➞ F(c)**
And the second law also follows from the fact that there is only one morphism with a given signature. Suppose we have a monotone map. Suppose that in the source order we have two morphisms $f :: a ➞ b$ and $g :: b ➞ c$. Then, in the target order would contain morphisms that correspond to those two: $F(f): F(a) ➞ F(b)$ $F(g): F(b) ➞ F(c)$
If we compose the two morphisms in the target order, we get a morphism **F(g)•F(f) :: F(a) ➞ F(c)**.
If we compose the two morphisms in the target order, we get a morphism $F(g)•F(f) :: F(a) ➞ F(c)$.
If we compose the two morphisms in the source order, we get a morphism **g•f :: a ➞ c**. And from it, we can get the corresponding morphism in the target category - **F(g•f) :: F(a) ➞ F(c)**.
If we compose the two morphisms in the source order, we get a morphism $g•f :: a ➞ c$. And from it, we can get the corresponding morphism in the target category - $F(g•f) :: F(a) ➞ F(c)$.
But both morphisms **F(g•f)** and **F(g)•F(f)** have the signature **F(a) ➞ F(c)** and so they must be equal to one another.
<!--
Forgetful Functors
===
Functors in logic
===
-->
But both morphisms $F(g•f)$ and $F(g)•F(f)$ have the signature $F(a) ➞ F(c)$ and so they must be equal to one another.
The category of small categories
===
@ -396,6 +407,24 @@ There isn't much to say about this category, it is just a good exercise to try t
[The category of categories](category_of_categories)
Categories all the way down
---
The recursive nature of category theory might leave some of you confused: we started by saying that categories are *composed of objects and morphisms*, but now we are saying that there are morphisms between categories (functors) and a category where *the objects are categories themselves*. Does that mean that categories are an example of categories?
Yes. Sounds a bit weird on intuitive level (as for example biscuits don't contain other biscuits and houses don't use houses as building material) but it is perfectly legitimate.
Category theory does *categorize* (see what I did there) everything, so all of maths is categories all the way down and whether you would threat a given category as a universe, or as a point depends solemly on your viewpoint.
Like for example, every monoid is a category with one just object. But at the same time, monoids can be seen as belonging to one category - the category of monoids - with monoid homomorphisms acting as objects.
At the same time we have the category of groups, for example, which contains the category of monoids as a subcategory, as all monoids are groups.
There may be many more levels of categories from categories. However that does not mean that we have to cover all of them and think about them at all. It is like the concept of a derivative in calculus - the first derivative of a position of the object gives its *speed*, which is useful, the derivative of speed is also useful - it is *velocity*, but the derivative of velocity and those after it leave us indifferent.
We can use the same tactict with our little journey in category theory - stick on the level that make sense for us and not be obsessed with forming picture of the whole thing Because there is no *whole thing* - category theory is an *abstract* theory. That is, it does not seek to represent an actual state of affairs, but to provide a language that you can use to express many different ideas, actual or purely imaginary. So view the category of categories not as a structure, but as a space, where all these concepts live.
{% if site.distribution == 'print' %}
The ghost of Russell's paradox
@ -405,20 +434,61 @@ We say *small* because otherwise the category will include itself and it's going
{% endif %}
Categories all the way down
Free and forgetful functors
===
In the first few chapters, we reviewed a lot of types of categories that are based on each other i.e. ones where one category is the same as the other plus some additional law - groups are monoids with added inversion, partial orders are antisymmetric preorders. And virtually all categories can be viewed as are sets with added morphisms.
![Comparison of different types of categories](categories_comparison.svg)
Between any two such categories there are two functors called the free and forgetful functor.
Forgetful functors
===
Forgetful functors map the objects from the more richer and featureful category to their corresponding objects in the simpler and more unstructured one.
They strip (forget) all the structure of the more complex category which is not present in the simpler one. i.e.
Object mapping
---
The recursive nature of category theory might leave some of you confused: we started by saying that categories are composed of objects and morphisms, but now we are saying that there are morphisms between categories as well. Does that mean that categories are an example of categories?
If you do away with the monoid operation of a given monoid, what is left is its underlying set. This observation defines the object mapping of a forgetful functor that goes from the category of monoids to the category of sets (where each monoid is mapped to it's underlying set.)
Yes. Sounds a bit weird on intuitive level (as for example biscuits don't contain other biscuits and houses don't use houses as building material) but it is perfectly legitimate.
![Forgetful functor - object mapping](forgetful_functor_objects.svg)
Morphism mapping
---
category theory does *categorize* (see what I did there) everything as categories, so it is categories all the way down, like for example, every monoid is a category with one just object.
In order for the forgetful functor to really be a functor it also must map morphisms between the two categories i.e. to map every *monoid homomorphism* between two monoids to a function between their underlying sets. This won't be hard - we said that monoid homomorphisms are function between the monoids' underlying sets which preserves the group operation. Which means that... they are functions. So we need only to forget the extra conditions.
But at the same time, monoids can be seen as belonging to one category - the category of monoids - with monoid homomorphisms acting as objects.
![Forgetful functor](forgetful_functor.svg)
At the same time we have the category of groups, for example, which contains the category of monoids as a subcategory, as all monoids are groups.
Functor laws
---
There may be many more levels of categories within categories.
In this case the functor laws are obviously followed - we basically copied the structure of the monoid category into the set category.
Free functors
===
Now let's review the functor that has certain relationship with the free functor, but goes the other way around - from sets to monoids. This section would be a little longer, as while going from a more complex category to a simpler one is trivial enough, going the other way around is not that easy.
As a matter of fact, literary going the other way around is impossible, as the forgetful functor maps all monoids that are based on a given set to that set, so if we try to reverse the mapping we would get something that is not a functor.
In other words, the connection between more simple to more complex versions of a category is not an isomorphism - we cannot connect each underlying set to *all of the monoids that are based on it*. However, we can connect them to one special monoid that is connected to all of them.
And that object is the *free monoid* that we saw in chapter 3. And that is the free functor.
Object mapping
---
So the free functor maps every set to the free monoid of that set. When we reviewed free monoids we said that the free monoid of a set $A$ it is the monoid of lists of A's which we will dub $[A]$. The object mapping is just a function that maps each object $a:A$ to the singleton list, so $a \to [a]$.
Morphism mapping
---
The free monoid for set A is the monoid containing lists of elements of type a, so the morphism mapping of the free functor maps each function between sets to a function between lists of sets.
And the way to construct this mapping that establishes a connection between the free and forgetful functor is to apply the function to every element of that lists.
However that does not mean that we have to cover all of them and think about them at all. It is like the concept of a derivative in calculus - the first derivative of a position of the object gives its *speed*, which is useful, the derivative of speed is also useful - it is **velocity**, but the derivative of velocity and those after it leave us indifferent. We can use the same tactict with our little journey in category theory - stick on the level that make sense for us and not be obsessed with forming picture of the whole thing Because there is no *whole thing* - category theory is an *abstract* theory. That is, it does not seek to represent an actual state of affairs, but to provide a language that you can use to express many different ideas, actual or purely imaginary. So view the category of categories not as a structure, but as a space, where all these concepts live.

View File

@ -0,0 +1,323 @@
<?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"
viewBox="0 0 595.3 189.5"
version="1.1"
id="svg15613"
sodipodi:docname="constant_functor.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata15619">
<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="defs15617" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview15615"
showgrid="false"
inkscape:zoom="1.3085254"
inkscape:cx="226.68682"
inkscape:cy="46.523034"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg15613" />
<g
id="g42748"
transform="matrix(1.3397762,-0.10017139,0.10080481,1.2924446,-207.48473,-16.661939)" />
<ellipse
style="fill:#e6e7e8;stroke:none;stroke-width:1.69637835;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4"
cy="104.26049"
cx="111.57014"
transform="matrix(0.99721659,-0.07455915,0.07775931,0.99697216,0,0)"
rx="71.048759"
ry="68.555557" />
<g
id="g42748-8"
transform="matrix(1.3397762,-0.10017139,0.10080481,1.2924446,109.15564,-36.288284)" />
<ellipse
style="fill:#e6e7e8;stroke:none;stroke-width:2.26200581;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4-1"
cy="125.68458"
cx="423.49353"
transform="matrix(0.99721659,-0.07455915,0.07775931,0.99697216,0,0)"
rx="94.738716"
ry="91.414192" />
<g
inkscape:transform-center-y="-7.8820551"
inkscape:transform-center-x="6.0198456"
transform="matrix(0.18139377,0.01683251,0.00331309,0.18810413,321.236,48.740581)"
id="g1482-7-0-1-0-3-9"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7"
inkscape:connector-curvature="0"
style="stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="M -1074.4393,218.2691 C -655.7613,162.8326 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5"
inkscape:connector-curvature="0"
style="fill:none;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
<g
inkscape:transform-center-y="-9.0128961"
inkscape:transform-center-x="7.0592611"
transform="matrix(0.17465771,-0.01726862,0.0362553,0.23398751,315.56811,56.632127)"
id="g1482-7-0-1-0-3-9-30"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7-30"
inkscape:connector-curvature="0"
style="stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="M -1116.0146,210.41161 C -697.33657,154.97511 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5-92"
inkscape:connector-curvature="0"
style="fill:none;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
<rect
y="120.74249"
x="379.48758"
height="22.763296"
width="22.396215"
id="rect24164-1-7"
style="opacity:0.23000004;fill:#3a3a3a;fill-opacity:1;stroke:#cccccc;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)" />
<rect
y="69.85817"
x="410.32559"
height="22.763296"
width="22.396215"
id="rect24164-1-7-5"
style="opacity:0.23000004;fill:#3a3a3a;fill-opacity:1;stroke:#cccccc;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)" />
<g
style="display:inline;fill:#dddddd;stroke:#483737;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-8"
transform="matrix(-0.07854244,0.15160907,-0.22467539,-0.09461099,485.28633,58.878117)"
inkscape:transform-center-x="-12.157065"
inkscape:transform-center-y="-0.73403693">
<path
style="stroke:#483737;stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-50"
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="fill:none;stroke:#483737;stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-96"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<rect
y="152.29453"
x="431.47522"
height="22.763296"
width="22.396215"
id="rect24164-1-7-4-8"
style="opacity:0.23000004;fill:#3a3a3a;fill-opacity:1;stroke:#cccccc;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)" />
<g
style="display:inline;fill:#dddddd;stroke:#806600;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-5-7-2-10"
transform="matrix(0.13549631,-0.10793046,0.16531766,0.17455085,395.85031,93.24688)"
inkscape:transform-center-x="11.40825"
inkscape:transform-center-y="-4.576857">
<path
style="stroke:#806600;stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-0-2-2-3"
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="fill:none;stroke:#806600;stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-4-7-6-04"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<rect
y="121.54293"
x="475.24097"
height="22.763296"
width="22.396215"
id="rect24164-1-7-4"
style="opacity:0.23000004;fill:#3a3a3a;fill-opacity:1;stroke:#cccccc;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)" />
<g
style="display:inline;fill:#dddddd;stroke:#445500;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-5-7-2-1-4"
transform="matrix(-0.13549631,0.10793046,-0.16531766,-0.17455085,545.24471,125.15128)"
inkscape:transform-center-x="-11.40825"
inkscape:transform-center-y="4.5768618">
<path
style="stroke:#445500;stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-0-2-2-0-4"
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="fill:none;stroke:#445500;stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-4-7-6-6-4"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#806600;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-1-6"
transform="matrix(-0.10802317,0.13370201,0.18549303,0.15453181,392.40349,5.6899408)"
inkscape:transform-center-x="2.8428186"
inkscape:transform-center-y="-11.849154">
<path
style="stroke:#806600;stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-5-3"
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="fill:none;stroke:#806600;stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-9-1"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#000080;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-5-7-2-4-7"
transform="matrix(0.1521502,-0.08474666,0.13289534,0.19869427,397.09444,73.32809)"
inkscape:transform-center-x="10.541054"
inkscape:transform-center-y="-6.8316466">
<path
style="stroke:#000080;stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-0-2-2-9-5"
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="fill:none;stroke:#000080;stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-4-7-6-0-9"
d="M 85.255937,126.08872 C 157.92012,89.606392 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<g
style="display:inline;fill:#dddddd;stroke:#6c5353;stroke-width:6.38899994;stroke-miterlimit:10"
id="g1482-7-0-1-0-3-5-5"
transform="matrix(0.15565419,0.07790525,-0.10222112,0.21541501,409.7662,45.995161)"
inkscape:transform-center-x="0.5354074"
inkscape:transform-center-y="-12.167418">
<path
style="stroke:#6c5353;stroke-width:35.52600098"
inkscape:connector-curvature="0"
id="path1478-7-9-0-19-0-0-9"
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="fill:none;stroke:#6c5353;stroke-width:10.64900017;paint-order:markers fill stroke"
inkscape:connector-curvature="0"
id="path1480-1-3-1-5-7-4-8"
d="M 127.38575,78.377847 C 176.95734,66.301724 277.68509,72.076365 317.498,86.173"
sodipodi:nodetypes="cc"
transform="matrix(0.89574,0,0,0.81736,18.384,154.236)" />
</g>
<rect
y="116.49667"
x="375.52905"
height="22.763296"
width="22.396215"
id="rect24164-8"
style="opacity:1;fill:#ab6510;fill-opacity:1;stroke:#81510b;stroke-width:1.81155717;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)" />
<rect
y="66.727562"
x="407.77725"
height="22.763296"
width="22.396215"
id="rect24164-8-7"
style="opacity:1;fill:#e6e7e8;fill-opacity:1;stroke:#bbbcbe;stroke-width:1.81155717;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)" />
<rect
y="117.2971"
x="471.28241"
height="22.763296"
width="22.396215"
id="rect24164-8-1"
style="opacity:1;fill:#fce600;fill-opacity:1;stroke:#ffdd00;stroke-width:1.81155717;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)" />
<rect
y="148.04871"
x="428.21268"
height="22.763296"
width="22.396215"
id="rect24164-8-1-5"
style="opacity:1;fill:#39bced;fill-opacity:1;stroke:#008dd2;stroke-width:1.81155717;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)" />
<ellipse
cx="115.6871"
cy="82.637268"
id="circle15601-9-4-6"
style="opacity:0.203;fill:#030303;fill-opacity:1;stroke:none;stroke-width:2.21405125;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
rx="12.399649"
ry="11.964526" />
<ellipse
cx="112.34751"
cy="78.247818"
id="circle15601-9-4"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405125;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
rx="12.399649"
ry="11.964526" />
<ellipse
cx="113.66792"
cy="135.66214"
id="circle15601-9-4-6-5"
style="opacity:0.203;fill:#030303;fill-opacity:1;stroke:none;stroke-width:2.21405125;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
rx="12.399649"
ry="11.964526" />
<ellipse
cx="110.32835"
cy="131.27269"
id="circle15601-9-4-3"
style="fill:#e6e7e8;stroke:#bbbcbe;stroke-width:2.21405125;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(0.99721659,-0.07455915,0.0777593,0.99697216,0,0)"
rx="12.399649"
ry="11.964526" />
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -5,6 +5,7 @@
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:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="0 0 595.3 189.5"
@ -25,7 +26,91 @@
</rdf:RDF>
</metadata>
<defs
id="defs15617" />
id="defs15617">
<linearGradient
inkscape:collect="always"
id="linearGradient19480">
<stop
style="stop-color:#626262;stop-opacity:1;"
offset="0"
id="stop19476" />
<stop
style="stop-color:#626262;stop-opacity:0;"
offset="1"
id="stop19478" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient19406">
<stop
style="stop-color:#666666;stop-opacity:1;"
offset="0"
id="stop19402" />
<stop
style="stop-color:#666666;stop-opacity:0;"
offset="1"
id="stop19404" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient19398">
<stop
style="stop-color:#dbdb8b;stop-opacity:1;"
offset="0"
id="stop19394" />
<stop
style="stop-color:#dbdb8b;stop-opacity:0;"
offset="1"
id="stop19396" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient19398"
id="linearGradient19400"
x1="207.42062"
y1="-233.21608"
x2="216.54462"
y2="-240.86847"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient19406"
id="linearGradient19408"
x1="211.855"
y1="-234.56033"
x2="218.97429"
y2="-242.21271"
gradientUnits="userSpaceOnUse" />
<linearGradient
gradientTransform="rotate(-84.970792,115.76834,-132.80651)"
inkscape:collect="always"
xlink:href="#linearGradient19398"
id="linearGradient19400-1"
x1="207.42062"
y1="-233.21608"
x2="216.54462"
y2="-240.86847"
gradientUnits="userSpaceOnUse" />
<linearGradient
gradientTransform="rotate(-84.970792,115.76834,-132.80651)"
inkscape:collect="always"
xlink:href="#linearGradient19406"
id="linearGradient19408-7"
x1="211.855"
y1="-234.56033"
x2="218.97429"
y2="-242.21271"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient19480"
id="linearGradient19482"
x1="-903.73083"
y1="179.14421"
x2="-363.1792"
y2="201.58907"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
@ -35,27 +120,35 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview15615"
showgrid="false"
inkscape:zoom="1.5686713"
inkscape:cx="332.04846"
inkscape:cy="198.90336"
inkscape:zoom="3.1373426"
inkscape:cx="289.47245"
inkscape:cy="61.672592"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="g1482-7-0-1-0-3-9-30-8-3" />
inkscape:current-layer="svg15613" />
<g
id="g42748"
transform="matrix(1.1027395,-0.05790455,0.05928732,1.0638579,-179.04382,400.69013)" />
transform="matrix(0.59711466,-0.03135433,0.03210307,0.57606093,40.023432,263.59217)" />
<g
id="g42748-8"
transform="matrix(1.1027395,-0.05790455,0.05928732,1.0638579,81.501948,390.33136)" />
transform="matrix(0.59711466,-0.03135433,0.03210307,0.57606093,181.10453,257.98307)" />
<ellipse
style="fill:#e6e7e8;stroke:none;stroke-width:1.97402608;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4-3"
cy="95.501747"
cx="313.36697"
transform="matrix(0.99996235,0.00867727,-0.00546787,0.99998505,0,0)"
rx="82.671486"
ry="79.770416" />
<g
inkscape:transform-center-y="-10.036943"
inkscape:transform-center-x="9.7028592"
transform="matrix(0.15013463,-0.03740092,0.08293716,0.13918823,332.50093,84.738008)"
inkscape:transform-center-y="-5.434833"
inkscape:transform-center-x="3.8640726"
transform="matrix(0.05978964,-0.02025196,0.0330289,0.07536806,326.48737,92.509479)"
id="g1482-7-0-1-0-3-9-30"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
@ -72,11 +165,11 @@
</g>
<g
aria-label="num"
transform="matrix(0.63677698,-0.02304201,0.02304201,0.63677698,66.341631,92.413988)"
transform="matrix(0.34480389,-0.01247686,0.01247686,0.34480389,172.89547,96.665891)"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.92882442px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.22322066"
id="text11431-9-8" />
<g
transform="translate(207.87999,233.36143)"
transform="matrix(0.54148297,0,0,0.54148297,249.53609,172.98653)"
id="g1257-8">
<path
id="circle2818-6-2-5"
@ -148,11 +241,21 @@
style="stroke-width:0.3489151"
d="m 230.19346,-176.22378 q 0.87229,-1.62191 1.30843,-3.16886 0.43614,-1.54695 0.43614,-3.05301 0,-1.50606 -0.43614,-3.04619 -0.43614,-1.54695 -1.30843,-3.16204 h 2.02398 q 1.03584,1.66961 1.53332,3.20293 0.50429,1.5265 0.50429,3.01893 0,1.49243 -0.49748,3.01212 -0.49747,1.51287 -1.54013,3.19612 z" />
</g>
<path
id="circle2818-6-2-5-3"
d="m 233.17934,-256.84382 a 21.430199,21.430199 0 0 1 1.64915,30.26198 21.430199,21.430199 0 0 1 -30.262,1.64913 21.430199,21.430199 0 0 1 -1.64912,-30.26198 21.430199,21.430199 0 0 1 30.26197,-1.64913 z"
style="fill:url(#linearGradient19400);stroke:url(#linearGradient19408);stroke-width:1.49958548;stroke-miterlimit:10;stroke-dasharray:none;fill-opacity:1"
inkscape:connector-curvature="0" />
<path
id="circle2818-6-2-5-3-5"
d="m 2.5012284,-260.63905 a 21.430199,21.430199 0 0 1 30.2900456,1.01008 21.430199,21.430199 0 0 1 -1.010094,30.29007 21.430199,21.430199 0 0 1 -30.2900436,-1.0101 21.430199,21.430199 0 0 1 1.010092,-30.29005 z"
style="fill:url(#linearGradient19400-1);fill-opacity:1;stroke:url(#linearGradient19408-7);stroke-width:1.49958551;stroke-miterlimit:10;stroke-dasharray:none"
inkscape:connector-curvature="0" />
</g>
<g
inkscape:transform-center-y="-10.036943"
inkscape:transform-center-x="9.7028552"
transform="matrix(0.15013463,-0.03740092,0.08293716,0.13918823,333.6747,31.430798)"
inkscape:transform-center-y="-5.4348338"
inkscape:transform-center-x="3.8640733"
transform="matrix(0.05978964,-0.02025196,0.0330289,0.07536806,326.95481,63.644532)"
id="g1482-7-0-1-0-3-9-30-8"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
@ -170,19 +273,30 @@
<g
inkscape:transform-center-y="-10.036943"
inkscape:transform-center-x="9.7028564"
transform="matrix(0.15013463,-0.03740092,0.08293716,0.13918823,342.84129,-28.737812)"
transform="matrix(0.08129535,-0.02025196,0.04490906,0.07536806,322.61533,31.064255)"
id="g1482-7-0-1-0-3-9-30-8-3"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<g
inkscape:transform-center-y="-5.4348338"
inkscape:transform-center-x="3.8640733"
transform="matrix(0.05978964,-0.02025196,0.0330289,0.07536806,329.0203,34.895791)"
id="g1482-7-0-1-0-3-9-30-8-1"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7-30-1-2"
inkscape:connector-curvature="0"
style="stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="m -1118.8752,209.64293 c 418.678,-55.4365 1081.72693,-41.98261 1420.00872,6.30101"
id="path1480-1-3-1-5-7-5-92-0-4"
d="M -1116.0146,210.41161 C -697.33657,154.97511 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5-92-0-9"
inkscape:connector-curvature="0"
style="fill:none;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
<g
id="g1257"
transform="translate(-39.970879,230.94286)">
transform="matrix(0.54148297,0,0,0.54148297,142.37514,171.45154)">
<path
id="circle2818-6-2"
d="m 227.71768,-95.544612 a 21.4302,21.4302 0 0 1 1.64915,30.261978 21.4302,21.4302 0 0 1 -30.262,1.649132 21.4302,21.4302 0 0 1 -1.64912,-30.26198 21.4302,21.4302 0 0 1 30.26197,-1.64913 z"
@ -255,4 +369,22 @@
inkscape:connector-curvature="0" />
</g>
</g>
<g
inkscape:transform-center-y="-5.4348338"
inkscape:transform-center-x="3.8640733"
transform="matrix(0.05978964,-0.02025196,0.0330289,0.07536806,329.79249,-2.2954204)"
id="g1482-7-0-1-0-3-9-30-8-1-0"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:url(#linearGradient19482);stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7-30-1-2-3"
inkscape:connector-curvature="0"
style="stroke:url(#linearGradient19482);stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="M -1116.0146,210.41161 C -697.33657,154.97511 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5-92-0-9-6"
inkscape:connector-curvature="0"
style="fill:none;stroke:url(#linearGradient19482);stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,312 @@
<?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"
viewBox="0 0 595.3 189.5"
version="1.1"
id="svg15613"
sodipodi:docname="functor_programming_morphisms.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata15619">
<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="defs15617" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview15615"
showgrid="false"
inkscape:zoom="6.4013401"
inkscape:cx="401.60641"
inkscape:cy="122.76785"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg15613"
showguides="false" />
<g
id="g42748"
transform="matrix(1.5213308,-0.07988467,0.08179232,1.4676901,-217.03672,174.08098)" />
<g
id="g42748-8"
transform="matrix(1.5213308,-0.07988467,0.08179232,1.4676901,142.4102,159.7901)" />
<ellipse
style="fill:#e6e7e8;stroke:none;stroke-width:2.16419768;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4-1"
cy="119.02538"
cx="427.23254"
transform="matrix(0.99862421,-0.05243749,0.05564228,0.99845077,0,0)"
rx="90.642258"
ry="87.461487" />
<path
id="path2810-3-9"
d="m 460.76815,68.393112 c 0,0 0.15926,0.538859 0.40781,1.472617 0.13592,0.490796 0.29518,1.029656 0.46417,1.693762 0.16901,0.664328 0.36114,1.376503 0.56322,2.214341 0.798,3.225496 1.64685,7.610757 2.20402,12.030269 0.55749,4.41927 0.81012,8.950801 0.81782,12.345105 -0.008,1.673295 0.0254,3.113564 -0.0171,4.081524 l -0.0118,0.60946 5.04268,0.34551 c -2.05997,4.52412 -4.34324,8.69437 -6.85974,12.38489 -1.24287,-4.66832 -2.81779,-9.06962 -4.61791,-13.08982 l 5.01955,0.29764 0.0115,-0.60944 c 0.0428,-0.96797 0.0331,-2.360386 0.004,-4.003931 -0.0215,-3.316894 -0.26432,-7.722531 -0.83523,-12.06442 -0.53418,-4.371423 -1.37311,-8.631238 -2.14798,-11.808887 -0.17856,-0.789785 -0.37088,-1.501948 -0.53989,-2.166481 -0.16882,-0.664122 -0.32808,-1.202981 -0.44068,-1.645728 -0.24871,-0.933733 -0.38463,-1.424321 -0.38463,-1.424321 z"
inkscape:connector-curvature="0"
style="fill:#666666;stroke-width:0.05816754" />
<ellipse
style="fill:#e6e7e8;stroke:none;stroke-width:2.16419768;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4-1-3"
cy="104.48248"
cx="186.9032"
transform="matrix(0.99862421,-0.05243749,0.05564228,0.99845077,0,0)"
rx="90.642258"
ry="87.461487" />
<g
inkscape:transform-center-y="-9.6473636"
inkscape:transform-center-x="7.3374513"
transform="matrix(0.18107734,0.00130906,0.01593509,0.23167384,387.25499,42.008898)"
id="g1482-7-0-1-0-3-9"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7"
inkscape:connector-curvature="0"
style="stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="M -1074.4393,218.2691 C -655.7613,162.8326 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5"
inkscape:connector-curvature="0"
style="fill:none;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
<path
id="path2812-6-7"
d="m 453.61204,68.197914 c 0,0 0.15393,0.475742 0.39491,1.299828 0.13162,0.433221 0.28538,0.908977 0.44939,1.495194 0.16402,0.586393 0.35032,1.214959 0.54671,1.954359 0.7751,2.846419 1.6068,6.714139 2.16459,10.609359 0.55777,3.89521 0.82978,7.88601 0.86276,10.87378 0.005,1.4728 0.0473,2.74103 0.0146,3.5926 l -0.006,0.53636 4.74698,0.3503 c -1.90411,3.963206 -4.02069,7.613066 -6.36024,10.838576 -1.20453,-4.12066 -2.7196,-8.00925 -4.44349,-11.564366 l 4.72452,0.30797 0.006,-0.53636 c 0.0328,-0.85139 0.0132,-2.07728 -0.0268,-3.52429 -0.0452,-2.91964 -0.30694,-6.7998 -0.87694,-10.62688 -0.53566,-3.85268 -1.35709,-7.60976 -2.11009,-10.414 -0.17409,-0.696873 -0.36022,-1.325449 -0.52424,-1.911848 -0.164,-0.586217 -0.31794,-1.061957 -0.42728,-1.452829 a 140.03563,140.03563 0 0 0 -0.37243,-1.257324 z"
inkscape:connector-curvature="0"
style="fill:#666666;stroke-width:0.05281736" />
<g
id="g12411"
transform="translate(195.71584,-207.43653)">
<g
transform="matrix(1.3930441,0,0,1.3930441,-13.087451,-516.67291)"
id="g12398">
<path
inkscape:connector-curvature="0"
style="opacity:0.12999998;stroke:#000000;stroke-width:5.35910654;stroke-miterlimit:10"
d="m 202.73415,608.54435 a 21.972353,21.972353 0 0 1 4.57033,30.73565 21.972353,21.972353 0 0 1 -30.73566,4.57034 21.972353,21.972353 0 0 1 -4.57033,-30.73566 21.972353,21.972353 0 0 1 30.73566,-4.57033 z"
id="circle268-6-9" />
<path
inkscape:connector-curvature="0"
style="fill:#dbdb8b;stroke:#878578;stroke-width:2.77828455;stroke-miterlimit:10"
d="m 206.64962,610.13577 a 23.616208,23.616208 0 0 1 -7.93163,32.44288 23.616208,23.616208 0 0 1 -32.44288,-7.93164 23.616208,23.616208 0 0 1 7.93164,-32.44287 23.616208,23.616208 0 0 1 32.44287,7.93163 z"
id="circle2818-6" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.12448883px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.25311226"
x="184.12337"
y="620.03595"
id="text11431-9"
transform="rotate(1.2700671)"><tspan
sodipodi:role="line"
x="184.12337"
y="620.03595"
style="fill:#666666;stroke-width:0.25311226"
id="tspan11815">[num]</tspan></text>
</g>
</g>
<path
id="path2814-0-3"
d="m 418.46313,70.361627 c 0,0 -0.093,0.529876 -0.22594,1.443916 -0.0752,0.48129 -0.16812,1.01117 -0.25466,1.66027 -0.0863,0.64908 -0.19038,1.34674 -0.28795,2.16361 -0.39678,3.14793 -0.69291,7.38969 -0.6854,11.61701 0.008,4.22732 0.34309,8.51044 0.78104,11.690046 0.22763,1.565531 0.38303,2.919491 0.55387,3.818891 l 0.0922,0.5688 -5.13864,1.13043 c 2.71207,3.90654 5.60739,7.4458 8.67917,10.49894 0.66434,-4.57011 1.70507,-8.94317 3.0275,-12.99548 l -5.12096,1.08186 -0.0921,-0.5688 c -0.17086,-0.89957 -0.34377,-2.20497 -0.52974,-3.748427 -0.41364,-3.10915 -0.74278,-7.27325 -0.72631,-11.42992 -0.0251,-4.17874 0.27773,-8.30167 0.65682,-11.40102 0.0799,-0.76812 0.18394,-1.46578 0.2703,-2.11468 0.0865,-0.64927 0.17934,-1.17914 0.23697,-1.61187 0.13293,-0.91403 0.20807,-1.39532 0.20807,-1.39532 z"
inkscape:connector-curvature="0"
style="fill:#666666;stroke-width:0.05281736" />
<g
id="g12386"
transform="matrix(1.3930441,0,0,1.3930441,111.26859,-278.4171)">
<path
id="circle268-6-9-7"
d="m 70.348346,289.1314 a 21.972353,21.972353 0 0 1 4.57033,30.73565 21.972353,21.972353 0 0 1 -30.73566,4.57034 21.972353,21.972353 0 0 1 -4.57033,-30.73566 21.972353,21.972353 0 0 1 30.73566,-4.57033 z"
style="opacity:0.12999998;stroke:#000000;stroke-width:5.35910654;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<path
id="circle2818-6-2"
d="m 74.263816,290.72282 a 23.616208,23.616208 0 0 1 -7.93163,32.44288 23.616208,23.616208 0 0 1 -32.44288,-7.93164 23.616208,23.616208 0 0 1 7.93164,-32.44287 23.616208,23.616208 0 0 1 32.44287,7.93163 z"
style="fill:#dbdb8b;stroke:#878578;stroke-width:2.77828455;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<text
transform="rotate(1.2700671)"
id="text11431-9-8"
y="304.47513"
x="48.886883"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.12448883px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.25311226"
xml:space="preserve"><tspan
id="tspan11815-2"
style="fill:#666666;stroke-width:0.25311226"
y="304.47513"
x="48.886883"
sodipodi:role="line">num</tspan></text>
</g>
<path
id="path2810"
d="m 193.01896,71.162858 c 0,0 0.15926,0.444291 0.40781,1.214177 0.13592,0.404663 0.29518,0.848954 0.46417,1.396513 0.16901,0.547735 0.36114,1.134927 0.56322,1.825725 0.798,2.659438 1.64685,6.275096 2.20402,9.918998 0.55749,3.6437 0.81012,7.37996 0.81782,10.178563 -0.008,1.379646 0.0254,2.567147 -0.0171,3.365231 l -0.0118,0.502505 5.04268,0.284873 c -2.05997,3.730157 -4.34324,7.168547 -6.85974,10.211387 -1.24287,-3.84905 -2.81779,-7.47792 -4.61791,-10.792616 l 5.01955,0.245413 0.0115,-0.502479 c 0.0428,-0.798095 0.0331,-1.946146 0.004,-3.301264 -0.0215,-2.734774 -0.26432,-6.367236 -0.83523,-9.947133 -0.53418,-3.604254 -1.37311,-7.116483 -2.14798,-9.73646 -0.17856,-0.651187 -0.37088,-1.238367 -0.53989,-1.786275 -0.16882,-0.547569 -0.32808,-0.99186 -0.44068,-1.356906 -0.24871,-0.769865 -0.38463,-1.174356 -0.38463,-1.174356 z"
inkscape:connector-curvature="0"
style="fill:#9d539f;stroke-width:0.05281736" />
<path
id="path2812"
d="m 185.82559,68.323007 c 0,0 0.15393,0.475742 0.39491,1.299828 0.13162,0.433221 0.28538,0.908977 0.44939,1.495194 0.16402,0.586393 0.35032,1.214959 0.54671,1.954359 0.7751,2.846423 1.6068,6.714144 2.16459,10.609359 0.55777,3.89521 0.82978,7.886015 0.86276,10.873785 0.005,1.472797 0.0473,2.741029 0.0146,3.592599 l -0.006,0.536353 4.74698,0.350301 c -1.90411,3.963215 -4.02069,7.613075 -6.36024,10.838585 -1.20453,-4.12066 -2.7196,-8.00925 -4.44349,-11.564367 l 4.72452,0.307963 0.006,-0.536358 c 0.0328,-0.851393 0.0132,-2.077282 -0.0268,-3.524289 -0.0452,-2.919638 -0.30694,-6.799805 -0.87694,-10.626882 -0.53566,-3.852678 -1.35709,-7.609757 -2.11009,-10.413998 -0.17409,-0.696875 -0.36022,-1.325451 -0.52424,-1.91185 -0.164,-0.586217 -0.31794,-1.061957 -0.42728,-1.452829 a 140.03563,140.03563 0 0 0 -0.37243,-1.257324 z"
inkscape:connector-curvature="0"
style="fill:#e90909;stroke-width:0.05281736" />
<path
id="path2816"
d="m 178.84179,72.158997 c 0,0 -0.0503,0.458145 -0.1098,1.245095 -0.0366,0.414974 -0.087,0.872946 -0.12132,1.430903 -0.0345,0.557977 -0.0825,1.158928 -0.11496,1.859734 -0.1448,2.703147 -0.1046,6.318252 0.23527,9.886016 0.33984,3.567581 1.00835,7.144685 1.69117,9.778355 0.34832,1.295236 0.60833,2.420328 0.84815,3.159775 l 0.13566,0.469638 -4.99283,1.547457 c 2.98901,2.98462 6.13033,5.63807 9.40815,7.86088 0.29776,-3.93475 0.98334,-7.74652 1.97257,-11.319958 l -4.97915,1.504461 -0.13584,-0.469632 c -0.23982,-0.739442 -0.51332,-1.82155 -0.81848,-3.10313 -0.65348,-2.576822 -1.30632,-6.054087 -1.61668,-9.565018 -0.35334,-3.524602 -0.37789,-7.040048 -0.2466,-9.70021 0.0187,-0.657623 0.0668,-1.258585 0.10113,-1.816547 0.0345,-0.5578 0.0847,-1.015757 0.10765,-1.38774 0.0597,-0.786956 0.0962,-1.201919 0.0962,-1.201919 z"
inkscape:connector-curvature="0"
style="fill:#04bd3d;stroke-width:0.05281736" />
<path
id="path2810-3"
d="m 447.23595,69.805293 c 0,0 0.15926,0.444291 0.40781,1.214177 0.13592,0.404663 0.29518,0.848954 0.46417,1.396513 0.16901,0.547735 0.36114,1.134927 0.56322,1.825725 0.798,2.659436 1.64685,6.275096 2.20402,9.918996 0.55749,3.6437 0.81012,7.37996 0.81782,10.17857 -0.008,1.37964 0.0254,2.56714 -0.0171,3.36523 l -0.0118,0.5025 5.04268,0.28487 c -2.05997,3.730156 -4.34324,7.168546 -6.85974,10.211386 -1.24287,-3.84905 -2.81779,-7.47792 -4.61791,-10.792606 l 5.01955,0.24541 0.0115,-0.50248 c 0.0428,-0.7981 0.0331,-1.94615 0.004,-3.30126 -0.0215,-2.73478 -0.26432,-6.36724 -0.83523,-9.94714 -0.53418,-3.60425 -1.37311,-7.11648 -2.14798,-9.736458 -0.17856,-0.651187 -0.37088,-1.238367 -0.53989,-1.786275 -0.16882,-0.547569 -0.32808,-0.99186 -0.44068,-1.356906 -0.24871,-0.769865 -0.38463,-1.174356 -0.38463,-1.174356 z"
inkscape:connector-curvature="0"
style="fill:#9d539f;stroke-width:0.05281736" />
<path
id="path2816-6-6"
d="m 435.87679,71.277954 c 0,0 -0.0503,0.458145 -0.1098,1.245095 -0.0366,0.414975 -0.087,0.872945 -0.12132,1.430905 -0.0345,0.55798 -0.0825,1.15893 -0.11496,1.85973 -0.1448,2.70315 -0.1046,6.31825 0.23527,9.88602 0.33984,3.56758 1.00835,7.14468 1.69117,9.77835 0.34832,1.29524 0.60833,2.42033 0.84815,3.15978 l 0.13566,0.46963 -4.99283,1.547456 c 2.98901,2.98462 6.13033,5.63807 9.40815,7.86088 0.29776,-3.93475 0.98334,-7.74652 1.97257,-11.319956 l -4.97915,1.50446 -0.13584,-0.46963 c -0.23982,-0.73944 -0.51332,-1.82155 -0.81848,-3.10313 -0.65348,-2.57682 -1.30632,-6.05408 -1.61668,-9.56502 -0.35334,-3.5246 -0.37789,-7.04004 -0.2466,-9.70021 0.0187,-0.65762 0.0668,-1.25858 0.10113,-1.81654 0.0345,-0.5578 0.0847,-1.01576 0.10765,-1.38774 0.0597,-0.786957 0.0962,-1.20192 0.0962,-1.20192 z"
inkscape:connector-curvature="0"
style="fill:#666666;stroke-width:0.05281736" />
<path
id="path2812-6"
d="m 440.04258,66.965442 c 0,0 0.15393,0.475742 0.39491,1.299828 0.13162,0.433221 0.28538,0.908977 0.44939,1.495194 0.16402,0.586393 0.35032,1.214959 0.54671,1.954359 0.7751,2.846423 1.6068,6.714141 2.16459,10.609361 0.55777,3.89521 0.82978,7.88601 0.86276,10.87378 0.005,1.4728 0.0473,2.74103 0.0146,3.5926 l -0.006,0.53636 4.74698,0.3503 c -1.90411,3.963206 -4.02069,7.613066 -6.36024,10.838576 -1.20453,-4.12066 -2.7196,-8.00925 -4.44349,-11.564366 l 4.72452,0.30797 0.006,-0.53636 c 0.0328,-0.85139 0.0132,-2.07728 -0.0268,-3.52429 -0.0452,-2.91964 -0.30694,-6.7998 -0.87694,-10.62688 -0.53566,-3.85268 -1.35709,-7.609759 -2.11009,-10.414 -0.17409,-0.696875 -0.36022,-1.325451 -0.52424,-1.91185 -0.164,-0.586217 -0.31794,-1.061957 -0.42728,-1.452829 a 140.03563,140.03563 0 0 0 -0.37243,-1.257324 z"
inkscape:connector-curvature="0"
style="fill:#e90909;stroke-width:0.05281736" />
<path
id="path2814-0"
d="m 427.73865,66.462421 c 0,0 -0.093,0.529879 -0.22594,1.443912 -0.0752,0.481292 -0.16812,1.011176 -0.25466,1.660272 -0.0863,0.649079 -0.19038,1.346742 -0.28795,2.16361 -0.39678,3.147922 -0.69291,7.389689 -0.6854,11.617009 0.008,4.22732 0.34309,8.51044 0.78104,11.69005 0.22763,1.56553 0.38303,2.91949 0.55387,3.81889 l 0.0922,0.5688 -5.13864,1.130426 c 2.71207,3.90654 5.60739,7.4458 8.67917,10.49894 0.66434,-4.57011 1.70507,-8.94317 3.0275,-12.995476 l -5.12096,1.08186 -0.0921,-0.5688 c -0.17086,-0.89957 -0.34377,-2.20497 -0.52974,-3.74843 -0.41364,-3.10915 -0.74278,-7.27325 -0.72631,-11.42992 -0.0251,-4.17874 0.27773,-8.301672 0.65682,-11.401018 0.0799,-0.768119 0.18394,-1.465777 0.2703,-2.114679 0.0865,-0.649273 0.17934,-1.179142 0.23697,-1.611872 0.13293,-0.914028 0.20807,-1.395319 0.20807,-1.395319 z"
inkscape:connector-curvature="0"
style="fill:#0e2db8;stroke-width:0.05281736" />
<path
id="path2816-6"
d="m 433.05878,70.801432 c 0,0 -0.0503,0.458145 -0.1098,1.245095 -0.0366,0.414974 -0.087,0.872946 -0.12132,1.430903 -0.0345,0.557977 -0.0825,1.158928 -0.11496,1.859734 -0.1448,2.70315 -0.1046,6.31825 0.23527,9.88602 0.33984,3.56758 1.00835,7.14468 1.69117,9.77835 0.34832,1.29524 0.60833,2.42033 0.84815,3.15978 l 0.13566,0.46963 -4.99283,1.547456 c 2.98901,2.98462 6.13033,5.63807 9.40815,7.86088 0.29776,-3.93475 0.98334,-7.74652 1.97257,-11.319956 l -4.97915,1.50446 -0.13584,-0.46963 c -0.23982,-0.73944 -0.51332,-1.82155 -0.81848,-3.10313 -0.65348,-2.57682 -1.30632,-6.05408 -1.61668,-9.56502 -0.35334,-3.5246 -0.37789,-7.04004 -0.2466,-9.70021 0.0187,-0.657619 0.0668,-1.258581 0.10113,-1.816543 0.0345,-0.5578 0.0847,-1.015757 0.10765,-1.38774 0.0597,-0.786956 0.0962,-1.201919 0.0962,-1.201919 z"
inkscape:connector-curvature="0"
style="fill:#04bd3d;stroke-width:0.05281736" />
<g
id="g12404"
transform="translate(189.55331,-199.78592)">
<path
id="circle268-7-0"
d="m 271.90352,225.26701 a 30.608457,30.608457 0 0 1 6.36669,42.81611 30.608457,30.608457 0 0 1 -42.81612,6.36669 30.608457,30.608457 0 0 1 -6.36668,-42.81612 30.608457,30.608457 0 0 1 42.81611,-6.36668 z"
style="opacity:0.12999998;stroke:#000000;stroke-width:7.46547174;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<path
id="circle2836-7-0"
d="m 276.49466,226.66956 a 32.898419,32.898419 0 0 1 -11.04911,45.19435 32.898419,32.898419 0 0 1 -45.19435,-11.04911 32.898419,32.898419 0 0 1 11.04914,-45.19435 32.898419,32.898419 0 0 1 45.19432,11.04911 z"
style="fill:#d9d98d;stroke:#878578;stroke-width:3.87027287;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<text
transform="rotate(1.2700671)"
id="text11431-5-2-4"
y="241.60732"
x="223.73181"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.10385895px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.35259652"
xml:space="preserve"><tspan
style="fill:#666666;stroke-width:0.35259652"
y="241.60732"
x="223.73181"
id="tspan11429-9-2-6"
sodipodi:role="line">[string]</tspan></text>
</g>
<g
inkscape:transform-center-y="-9.6473636"
inkscape:transform-center-x="7.3374513"
transform="matrix(0.18107734,0.00130906,0.01593509,0.23167384,379.42304,32.746213)"
id="g1482-7-0-1-0-3-9-2"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7-6"
inkscape:connector-curvature="0"
style="stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="M -1074.4393,218.2691 C -655.7613,162.8326 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5-1"
inkscape:connector-curvature="0"
style="fill:none;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
<g
inkscape:transform-center-y="-9.6473636"
inkscape:transform-center-x="7.3374513"
transform="matrix(0.18107734,0.00130906,0.01593509,0.23167384,371.14353,35.089473)"
id="g1482-7-0-1-0-3-9-2-8"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7-6-7"
inkscape:connector-curvature="0"
style="stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="M -1074.4393,218.2691 C -655.7613,162.8326 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5-1-9"
inkscape:connector-curvature="0"
style="fill:none;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
<g
inkscape:transform-center-y="-9.6473636"
inkscape:transform-center-x="7.3374513"
transform="matrix(0.18107734,0.00130906,0.01593509,0.23167384,364.26996,44.774944)"
id="g1482-7-0-1-0-3-9-2-2"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7-6-0"
inkscape:connector-curvature="0"
style="stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="M -1074.4393,218.2691 C -655.7613,162.8326 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5-1-2"
inkscape:connector-curvature="0"
style="fill:none;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
<path
id="path2814"
d="m 173.52166,67.819986 c 0,0 -0.093,0.529879 -0.22594,1.443912 -0.0752,0.481292 -0.16812,1.011176 -0.25466,1.660272 -0.0863,0.649079 -0.19038,1.346742 -0.28795,2.16361 -0.39678,3.147922 -0.69291,7.38969 -0.6854,11.617011 0.008,4.22732 0.34309,8.510441 0.78104,11.690048 0.22763,1.565526 0.38303,2.919492 0.55387,3.818891 l 0.0922,0.5688 -5.13864,1.13043 c 2.71207,3.90654 5.60739,7.4458 8.67917,10.49894 0.66434,-4.57011 1.70507,-8.94317 3.0275,-12.995479 l -5.12096,1.081859 -0.0921,-0.5688 c -0.17086,-0.899568 -0.34377,-2.204968 -0.52974,-3.748431 -0.41364,-3.109155 -0.74278,-7.273247 -0.72631,-11.429923 -0.0251,-4.178737 0.27773,-8.301669 0.65682,-11.401015 0.0799,-0.768119 0.18394,-1.465777 0.2703,-2.114679 0.0865,-0.649273 0.17934,-1.179142 0.23697,-1.611872 0.13293,-0.914028 0.20807,-1.395319 0.20807,-1.395319 z"
inkscape:connector-curvature="0"
style="fill:#0e2db8;stroke-width:0.05281736" />
<g
id="g12392"
transform="matrix(1.3930441,0,0,1.3930441,78.337665,-306.57395)">
<path
id="circle268-7-0-7"
d="m 93.273694,239.96336 a 21.972353,21.972353 0 0 1 4.57034,30.73565 21.972353,21.972353 0 0 1 -30.73565,4.57034 21.972353,21.972353 0 0 1 -4.570341,-30.73565 21.972353,21.972353 0 0 1 30.735651,-4.57034 z"
style="opacity:0.12999998;stroke:#000000;stroke-width:5.35910654;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<path
id="circle2836-7-0-6"
d="m 96.569454,240.97019 a 23.616208,23.616208 0 0 1 -7.93163,32.44287 23.616208,23.616208 0 0 1 -32.44287,-7.93163 23.616208,23.616208 0 0 1 7.93165,-32.44287 23.616208,23.616208 0 0 1 32.44285,7.93163 z"
style="fill:#d9d98d;stroke:#878578;stroke-width:2.77828455;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<text
transform="rotate(1.2700671)"
id="text11431-5-2-4-1"
y="253.09364"
x="64.649704"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.12448883px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.25311226"
xml:space="preserve"><tspan
style="fill:#666666;stroke-width:0.25311226"
y="253.09364"
x="64.649704"
id="tspan11429-9-2-6-3"
sodipodi:role="line">string</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,215 @@
<?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"
viewBox="0 0 595.3 189.5"
version="1.1"
id="svg15613"
sodipodi:docname="functor_programming_objects.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata15619">
<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="defs15617" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="2496"
id="namedview15615"
showgrid="false"
inkscape:zoom="2.2632155"
inkscape:cx="292.09809"
inkscape:cy="116.05051"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg15613" />
<g
id="g42748"
transform="matrix(1.5213308,-0.07988467,0.08179232,1.4676901,-217.03672,174.08098)" />
<ellipse
style="fill:#e6e7e8;stroke:none;stroke-width:2.21775842;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4"
cy="103.85719"
cx="184.75946"
transform="matrix(0.99862421,-0.05243749,0.05564228,0.99845077,0,0)"
rx="92.885521"
ry="89.62603" />
<g
id="g42748-8"
transform="matrix(1.5213308,-0.07988467,0.08179232,1.4676901,142.4102,159.7901)" />
<ellipse
style="fill:#e6e7e8;stroke:none;stroke-width:2.16419768;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="circle15601-9-4-4-1"
cy="119.02538"
cx="427.23254"
transform="matrix(0.99862421,-0.05243749,0.05564228,0.99845077,0,0)"
rx="90.642258"
ry="87.461487" />
<g
inkscape:transform-center-y="-7.9306638"
inkscape:transform-center-x="7.0770773"
transform="matrix(0.16875532,-0.00683721,0.0244076,0.23072636,341.93132,-6.0964568)"
id="g1482-7-0-1-0-3-9"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7"
inkscape:connector-curvature="0"
style="stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="M -1074.4393,218.2691 C -655.7613,162.8326 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5"
inkscape:connector-curvature="0"
style="fill:none;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
<g
inkscape:transform-center-y="-10.036943"
inkscape:transform-center-x="6.8113705"
transform="matrix(0.16247906,-0.01016704,0.0223352,0.29175085,348.09398,81.540409)"
id="g1482-7-0-1-0-3-9-5"
style="display:inline;opacity:0.95400002;fill:#dddddd;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 298.84692,219.75174 c 4.50048,-1.11094 9.19951,-2.10794 14.02668,-3.04881 -4.04495,-1.70563 -8.31549,-3.34171 -12.81219,-4.90893 -0.40756,2.77943 -0.49113,4.95944 -1.21449,7.95774 z"
id="path1478-7-9-0-19-0-7-4"
inkscape:connector-curvature="0"
style="stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
d="M -1118.5689,206.40608 C -699.89091,150.96958 -34.287636,168.429 303.99415,216.71262"
id="path1480-1-3-1-5-7-5-05"
inkscape:connector-curvature="0"
style="fill:none;stroke:#626262;stroke-width:11.10534096;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
</g>
<g
id="g12411"
transform="translate(195.71584,-207.43653)">
<g
transform="matrix(1.3930441,0,0,1.3930441,-13.087451,-516.67291)"
id="g12398">
<path
inkscape:connector-curvature="0"
style="opacity:0.12999998;stroke:#000000;stroke-width:5.35910654;stroke-miterlimit:10"
d="m 202.73415,608.54435 a 21.972353,21.972353 0 0 1 4.57033,30.73565 21.972353,21.972353 0 0 1 -30.73566,4.57034 21.972353,21.972353 0 0 1 -4.57033,-30.73566 21.972353,21.972353 0 0 1 30.73566,-4.57033 z"
id="circle268-6-9" />
<path
inkscape:connector-curvature="0"
style="fill:#dbdb8b;stroke:#878578;stroke-width:2.77828455;stroke-miterlimit:10"
d="m 206.64962,610.13577 a 23.616208,23.616208 0 0 1 -7.93163,32.44288 23.616208,23.616208 0 0 1 -32.44288,-7.93164 23.616208,23.616208 0 0 1 7.93164,-32.44287 23.616208,23.616208 0 0 1 32.44287,7.93163 z"
id="circle2818-6" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.12448883px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.25311226"
x="184.12337"
y="620.03595"
id="text11431-9"
transform="rotate(1.2700671)"><tspan
sodipodi:role="line"
x="184.12337"
y="620.03595"
style="fill:#666666;stroke-width:0.25311226"
id="tspan11815">[num]</tspan></text>
</g>
</g>
<g
id="g12404"
transform="translate(189.55331,-199.78592)">
<path
id="circle268-7-0"
d="m 271.90352,225.26701 a 30.608457,30.608457 0 0 1 6.36669,42.81611 30.608457,30.608457 0 0 1 -42.81612,6.36669 30.608457,30.608457 0 0 1 -6.36668,-42.81612 30.608457,30.608457 0 0 1 42.81611,-6.36668 z"
style="opacity:0.12999998;stroke:#000000;stroke-width:7.46547174;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<path
id="circle2836-7-0"
d="m 276.49466,226.66956 a 32.898419,32.898419 0 0 1 -11.04911,45.19435 32.898419,32.898419 0 0 1 -45.19435,-11.04911 32.898419,32.898419 0 0 1 11.04914,-45.19435 32.898419,32.898419 0 0 1 45.19432,11.04911 z"
style="fill:#d9d98d;stroke:#878578;stroke-width:3.87027287;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<text
transform="rotate(1.2700671)"
id="text11431-5-2-4"
y="241.60732"
x="223.73181"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.10385895px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.35259652"
xml:space="preserve"><tspan
style="fill:#666666;stroke-width:0.35259652"
y="241.60732"
x="223.73181"
id="tspan11429-9-2-6"
sodipodi:role="line">[string]</tspan></text>
</g>
<g
id="g12386"
transform="matrix(1.3930441,0,0,1.3930441,111.26859,-278.4171)">
<path
id="circle268-6-9-7"
d="m 70.348346,289.1314 a 21.972353,21.972353 0 0 1 4.57033,30.73565 21.972353,21.972353 0 0 1 -30.73566,4.57034 21.972353,21.972353 0 0 1 -4.57033,-30.73566 21.972353,21.972353 0 0 1 30.73566,-4.57033 z"
style="opacity:0.12999998;stroke:#000000;stroke-width:5.35910654;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<path
id="circle2818-6-2"
d="m 74.263816,290.72282 a 23.616208,23.616208 0 0 1 -7.93163,32.44288 23.616208,23.616208 0 0 1 -32.44288,-7.93164 23.616208,23.616208 0 0 1 7.93164,-32.44287 23.616208,23.616208 0 0 1 32.44287,7.93163 z"
style="fill:#dbdb8b;stroke:#878578;stroke-width:2.77828455;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<text
transform="rotate(1.2700671)"
id="text11431-9-8"
y="304.47513"
x="48.886883"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.12448883px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.25311226"
xml:space="preserve"><tspan
id="tspan11815-2"
style="fill:#666666;stroke-width:0.25311226"
y="304.47513"
x="48.886883"
sodipodi:role="line">num</tspan></text>
</g>
<g
id="g12392"
transform="matrix(1.3930441,0,0,1.3930441,78.337665,-306.57395)">
<path
id="circle268-7-0-7"
d="m 93.273694,239.96336 a 21.972353,21.972353 0 0 1 4.57034,30.73565 21.972353,21.972353 0 0 1 -30.73565,4.57034 21.972353,21.972353 0 0 1 -4.570341,-30.73565 21.972353,21.972353 0 0 1 30.735651,-4.57034 z"
style="opacity:0.12999998;stroke:#000000;stroke-width:5.35910654;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<path
id="circle2836-7-0-6"
d="m 96.569454,240.97019 a 23.616208,23.616208 0 0 1 -7.93163,32.44287 23.616208,23.616208 0 0 1 -32.44287,-7.93163 23.616208,23.616208 0 0 1 7.93165,-32.44287 23.616208,23.616208 0 0 1 32.44285,7.93163 z"
style="fill:#d9d98d;stroke:#878578;stroke-width:2.77828455;stroke-miterlimit:10"
inkscape:connector-curvature="0" />
<text
transform="rotate(1.2700671)"
id="text11431-5-2-4-1"
y="253.09364"
x="64.649704"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.12448883px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.25311226"
xml:space="preserve"><tspan
style="fill:#666666;stroke-width:0.25311226"
y="253.09364"
x="64.649704"
id="tspan11429-9-2-6-3"
sodipodi:role="line">string</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,11 +1,7 @@
---
layout: default
title: Natural Transformations
---
Natural transformations and advanced concepts
===
In this chapter, we will introduce the central concept of category theory. It is the concept of a morphism between functors or of *natural transformation*. Understanding natural transformations will enable us to define category equality and some other advanced concepts.
In this chapter, we will introduce the central concept of category theory. It is the concept of a morphism between functors or *natural transformation*. Understanding natural transformations will enable us to define category equality and some other advanced concepts.
Natural transformations are really is the heart of category theory - As a matter of fact, category theory was invented with the purpose of studying natural transformations. The importance of natural transformations is not obvious at first, and so before introducing them I like to talk about the body of knowledge that this heart maintains (I am good with methaphors... in principle.)
@ -124,29 +120,17 @@ Isomorphism is not hard to construct - given two sets, containing three objects
But most of these isomorphisms, are just random. In our studies we are only interested in structures that *make sense*. In category theory the abstract notion of making sense is captured by the naturality condition.
Free objects
===
https://math.stackexchange.com/questions/131389/what-are-free-objects
Adjunctions
===
https://github.com/adamnemecek/adjoint/
https://chrispenner.ca/posts/adjunction-battleship
-- Left adjoints preserve joins and right adjoints preserve meets.
-- Free/forgetful adjunctions are ones where the unit is Id.
Monads
===
Representable functors
===
@ -156,7 +140,6 @@ Yoneda Lemma
===
https://www.azimuthproject.org/azimuth/show/Applied+Category+Theory+Course#Course

View File

@ -0,0 +1,51 @@
Adjunctions
===
In this chapter we will continue with this *leit motif* that we developed in the previous two chapters - to begin each of them by introducing a new concept of equality between categories (and furthermore, for each new type of equality to be more relaxed than the previous one.)
We started the chapter about functors by reviewing *categorical isomorphisms*, which are invertable functions between categories.
Then in the chapter on *natural transformations* we saw categories that are equivalent up to an isomorphism.
And now we will relax the condition even more and will review a relationship that is not exactly an equality, , but it is not non-equality either. It is not two-way, but at the same time it is not exactly one-way as well. A relationship called *adjunction*.
As you can see, I am not very good at explaining, so I got some examples alligned. But before we proceed with them, we will go through some of the basic terminology.
Like equivalence, adjunction is a relationship between two categories. Like equivalence, it is composed of two functors.
However, unlike equivalence, an adjunction is not symmetric i.e. although the two functors are two way and we
$F \bullet G \cong id_{D}$
$G \bullet F \cong id_{C}$
$F \bullet G \to id_{D}$
$G \bullet F \to id_{C}$
Free-forgetful adjunctions
===
Formal concept analysis
===
Tensor-Hom adjunction
===
The tensor-hom adjunction is actually a codename for the curry-uncurry function that we saw earlier.
Adjunctions
===
https://github.com/adamnemecek/adjoint/
https://chrispenner.ca/posts/adjunction-battleship
-- Left adjoints preserve joins and right adjoints preserve meets.
-- Free/forgetful adjunctions are ones where the unit is Id.

View File

@ -84,10 +84,12 @@ window.MathJax = {
<div class="footer">
<div class="container">
<p>
<i>Made with
<a target="_blank" href="https://github.com/boris-marinov/jekyll-book-boilerplate">
Jekyll Book Boilerplate
</a>
<i>
Made with <a target="_blank" href="https://github.com/boris-marinov/jekyll-book-boilerplate"> Jekyll Book Boilerplate</a>.
Drawn in <a target="_blank" href="https://inkscape.org">Inkscape</a>.
Written with <a target="_blank" href="https://www.vim.org">vim</a>.
</i>
</p>

View File

@ -18,6 +18,7 @@ semilattice
Semilattice
semilattices
Semilattices
semigroup
meet-semilattice
meet-semilattices
poset
@ -86,6 +87,9 @@ monad
hom-set
Curry-Howard-Lambek
Curry-Howard
curry
uncurry
adjunction
Lambek
cartesian
Functor
@ -118,10 +122,12 @@ Kuratowski
De
Ockham
Ockham's
Cayley's
supersets
Unix
Latinized
disjunction
prev
subseteq
varnothing
@ -130,3 +136,13 @@ infty
endif
vee
lor
pmod
cong
mathrm
S1
S2
S3
Lehrer
Pythagoreans
Dimitrina
Georgieva