EpimorphismとMonomorphism

Category Theory for Programmersの2.1, 2.2の動画のノート

## 1.1, 1.2で説明されていた内容
### オブジェクトとMorphism
Morphismは矢印
オブジェクトは、Morphismの始まりと終わりを表すもの
オブジェクトやMorphismに構造や属性はなく、原子のようなもの。
![idb_f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/eb0e2a5b-9186-671b-29ee-5ea6bfc70ae1.png)

### Composition
![idb_f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/f448d98d-350f-b1b9-0939-050ba6f5b03b.png)

aからb, bからcの矢印が存在する時、
aからcへの矢印「g after f」が必ず存在する(。をafterと読む)

### Category
オブジェクトと、矢印たちとその合成を定義する。マッピングテーブルのようなもの。

### Identity
すべてのオブジェクトに、１つずつ、Identity Arrowが存在する。
Identity Arrowは、常にidと呼ばれる。
どの矢印とIdentity Arrowを合成しても、元の矢印になる。

![idb_f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/feea1709-b9cc-8564-4950-15c0bcf64093.png)

### Axiom
#### Left/right identity
矢印の左にあるIdentityをLeft identity
右側にあるIdentityをRight identityという。
この２つは違うもの。
Right identityの例
![idb_f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/ad9f364a-2352-0437-f9ca-236d2bf65ce8.png)

#### Associativity
```
h 。(g 。f) = (h 。g) 。f
```

### Isomorphism
Functions that are both:

- Injective 
- Surjective

Isomorphic functions are invertible

definition:

```
f 。g = id
g 。f = id
```

In Categorical language
e.g. f is an isomorphism if g exists

![idb_f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/e07c2d85-2343-f5df-3691-e710f1376562.png)

## Domain, Codomain, Image, etc
![idb_f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/7b7fcd61-a231-92bb-2e87-bf6ef2e39c9b.png)

![idb_f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/4eeca633-6b0e-0a80-4f81-92d452c7f31d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/2300b66f-a02b-649e-3e78-b304fcd701f4.png)

![idb_f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/961a899a-74cb-1265-f8cb-96024312cfe3.png)

## Epimorphism
SurjectiveはGreekでEpic。
カテゴリーセオリーではEpimorphism。セットセオリーと違って、要素を使って定義することはできない。
なので、Epimorphismを、関数同士の関係のみを使って定義する。

![idb_f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/0e340dc0-b03b-4294-7a77-c1190b4b5c45.png)

上の図のように、`f`がEpimorphismでないとき、`b`から`c`への関数が、`f`のイメージ外の要素について違う要素にマップする `g1`, `g2`として複数存在する余地がある。この場合にも、`f`のイメージからのマッピングについては同じなので`g1.f = g2.f` となる。

```math
\exists\  g_1,g_2,\  g_1 \ne g_2 \implies g1 \circ f = g2 \circ f
```


`f`がEpimorphismの場合には、`b`=`f`のイメージなので、`b`から`c`への関数が複数存在することは起こりえない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/4442070d-f82f-ff71-92b6-16c7dc1c391c.png)
なので`b`から`c`へのマッピング `g` は常に同じになる。これを使って、下のように`f`がEpimorphismであることを定義できる。

```math
\forall\  g_1,g_2,\  g1 \circ f = g2 \circ f \implies g_1 = g_2  

```

## Monomorphism
Injectiveは、GreekでMonic。
カテゴリーセオリーではMonomorphism。

![ct2-2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/a9c021d4-8bbf-6230-0b99-e4df727d9047.png)

Epimorphismと同じような感じで、オブジェクト群`c`上のオブジェクト`z`から、オブジェクト群`a`上のオブジェクト`x1`, `x2`への Morphism `g1`, `g2`を定義する。こうすると、`f。g1`と`f。g2`はどちらも、`z`を`y`にマップする。この場合に常に`g1 = g2`なれば`f`は Monomorphism。以下が定義。


```math
\forall g_1,g_2 \quad f \circ g_1 = f \circ g_2 \implies g_1=g_2
```

## 動画
Bartosz Milewski / Category Theory 2.1: Functions, epimorphisms
https://www.youtube.com/watch?v=O2lZkr-aAqk

Bartosz Milewski / Category Theory 2.2: Monomorphisms, simple types
https://www.youtube.com/watch?v=NcT7CGPICzo