文系エンジニア、束論を学ぶ  #1 基本用語の整理

# ▶️はじめに

計算機科学において、順序集合関連の理論は、データ構造、アルゴリズム、プログラム分析、型システムなど、多くの領域で重要な役割を果たしています。

これらを自分の「🧑‍💻力」に組み入れていきたい。そのために、束論についての勉強をはじめました。
その勉強過程のノートになります。



## **束論 (Lattice Theory)とは？**

- **起源**:
    - 20世紀初頭に、主にリヒャルト・デーデキントとギャレット・バーコフによって形成
- **目的**:
    - 数学的構造の**順序関係をより詳細に理解するため**に開発された
    - 束論は、要素間の階層的な関係や、それらがどのように組み合わさり、相互作用するかを研究することで、数学的および論理的な構造の深い理解を可能にする
    - 後に、計算機科学においても、型理論やプログラム解析、データ構造の設計などに応用されるようになった

## 束論は計算科学でどのように活かされるの？

**1.型システムとプログラミング言語の設計**

多くの現代のプログラミング言語は、型システムの設計に束論を使用しています。例えば、JavaのジェネリックスやScalaの型システムでは、サブタイプ関係が束の概念に基づいてモデル化されています。これにより、コンパイラは型の互換性を正確に判断し、プログラムの安全性を向上させることができます。

**2.抽象解釈とプログラム解析**

抽象解釈は、プログラムの動作を高レベルでモデル化し、バグやセキュリティの脆弱性を特定する手法です。この分野で、束論はプログラムの状態空間を表現するのに使われます。例えば、FacebookのInferツールは、抽象解釈を使用して大規模なコードベースのバグを発見し、その過程で束論の概念を活用しています。

https://srz-zumix.blogspot.com/2021/12/facebook-meta-infer-github-actions.html


**3.データフロー解析**

コンパイラの最適化技術であるデータフロー解析では、束論がプログラムの各ポイントでの変数の可能な状態を表現するのに使われます。この技法は、プログラムの実行効率を向上させるために重要な役割を果たしています。例えば、デッドコード除去や変数の生存期間分析などがあります。

**4.並行計算と分散システム**

分散システムの設計では、束論が状態の一貫性を保証するために使われます。例えば、分散データベースシステムでは、異なるノード間でデータの状態が一貫していることを保証するために、束論に基づいたアルゴリズムが使われます。

**5.知識表現とオントロジー**

人工知能やセマンティックウェブの分野では、知識の階層的構造をモデル化するために束論が使用されます。オントロジーでは、異なる概念や属性間の関係を束として表現することで、より複雑な推論やクエリが可能になります。

# 前提知識の準備

## 🗼集合論、圏論、束論

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/383776d3-5176-958f-31e4-ae1efd19e88a.png)


### **集合論 (Set Theory)**

- **起源**: 集合論は、19世紀後半に、主にゲオルク・カントールによって確立
- **目的**: カントールは、実数や無限の概念をより良く理解するために集合論を開発しました。彼の研究は、無限集合の概念を精密化し、数学における無限の大小（カーディナリティ）を厳密に比較することを可能にしました。集合論はまた、数学の基礎を形成し、数、関数、数学的構造などの基本的な数学的対象を定義するフレームワークを提供しました。

### **圏論 (Category Theory)**

- **起源**: 1940年代にサミュエル・エイレンベルグとソーンダース・マックレーンによって開発
- **目的**: この理論は、異なる数学的構造（例えば、群、環、空間）間の広範な類似性を把握し、それらを統一的な視点から理解するために考案されました。圏論は、**異なる数学的体系間の対応関係を抽象的に捉え、それらの間の関係を一般化し、単純化する**ことを目的としています。

## 集合と圏論の対比

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/49fcb6ed-8ec7-b4e2-2453-77dfd2df804b.png)

**集合論**

- 集合論は対象を分離して考えることに重点を置いており、各要素は独立した存在として扱われます。この視点からは、個別の要素の性質、関係、演算などが注目されます。

**圏論**

- 圏論の構成は、オブジェクト間に射（矢印）が存在し、それらが関連づけられている
- オブジェクト自体はその内部構造を表すことなく、オブジェクト間の関係、つまり射(志向性)が重要視される。オブジェクト自体の詳細は抽象化され、それらの間の射（関数や変換）に焦点が当てられる

**束論**

- 束論は、順序付けられた集合内の要素間の関係性に焦点を置きます。特に、任意の二要素に対する最小上界（sup）と最大下界（inf）が定義されるような構造です。
- この理論では、個々の要素の独立性よりも、要素間の順序関係、つまりどの要素が他の要素よりも「大きい」または「小さい」かという関係が重要です。こうした関係性は、要素が形成する構造全体を理解するために必要な情報を提供します。

## 🔬集合と束論の対比

- 集合論
    - 一般的な集合と要素の関係を扱います
    - 要素が集合に属するかどうかの関係を示します
- 束論
    - 順序付けられた集合内の要素の関係を扱います
    - 要素間の階層的な順序関係を示します

### 違いのまとめ

- **抽象化のレベル**:
    - 集合論は比較的具体的な概念を扱い、要素がどのように集合を形成するかに焦点を当てています。
    - 束論は要素間の相対的な位置や階層を重視します。
    
- **構造内の関係性**
    - 集合論では要素が集合に属するかどうかという二元的な関係を扱います
    - 束論では要素間のより複雑な階層的関係を扱います。
        - 束論においては、要素間には明確な順序があり、最小上界や最大下界といった概念が存在します。
    
- **応用分野**: 
    - 集合論はデータ構造やアルゴリズム、論理学などのより広範な分野に応用されます。
    - 束論は型理論やセマンティックス、特に順序付けや固定点理論に関連する計算機科学の特定の問題に応用されます。

- **数学的操作**: 
    - 集合論における操作は、和集合、交差、補集合などの基本的な集合操作です。
    - 束論における操作は、二つの要素の最小上界（join）と最大下界（meet）を見つけることに関連します。
    
## 🫖例えてみると..

### 集合論の日常的な例

- **図書館の本**:
    各本は図書館の「集合」の要素です。特定のジャンルの本（例えば、ミステリー小説）は、図書館全体の集合の中で、そのジャンルに属する本の「部分集合」を形成します。また、ある本が複数のジャンルにまたがる場合、それは複数の部分集合にまたがる要素と考えられます。


- **友人グループ**:
    あなたとあなたの友人は、特定の「集合」を形成します。共通の趣味を持つ友人同士のグループは、その集合の「部分集合」と見なすことができます。例えば、映画が好きな友人のグループ、スポーツを楽しむ友人のグループなどです。

### **束論の日常的な例**

- **組織の階層**:
    会社や組織の階層は束論の概念に似ています。各従業員は組織の要素であり、部署やチームは小さな「部分束」を形成します。マネージャーはその部署内の「最大要素」に当たり、インターンや新入社員は「最小要素」になるかもしれません。部門間の協力は、異なる部分束の要素間の関係と見なすことができます。
- **レシピの材料**:
    料理のレシピに使われる材料を考えるとき、それぞれの材料はレシピという「順序集合」の要素です。ある材料が他の材料を補完するとき、これらの組み合わせは「最小上界」を形成します。例えば、トマトとバジルはパスタソースの「最小上界」と考えられます。それぞれの材料は特定の風味の「最小要素」となり、組み合わせることで料理全体の味が形成されます。

### 🤔Q.束論は、集合の中でも順序集合についての話ですか？

<aside>
💡 A.束論は順序集合に関連していますが、単に順序集合についての話というよりは、より特化された代数的構造を持つ集合に焦点を当てた理論です

</aside>

束論は、数学の領域であり、特定の代数的構造を持つ集合に関する研究を行います。

束は、順序理論、代数学、そしてトポロジーにまたがる概念で、順序集合の特殊なタイプとして扱われます。束の理論は、集合の元が特定の代数的関係に従うような集合を扱い、これにより、集合内の要素間の関係がより豊かになります。

# 📖束論：基本となる用語

### 基礎

**順序集合 (Poset: Partially Ordered Set)**
- 集合において、ある二項関係（通常は「≤」と表される）が反射的、反対称的、推移的であるとき、その集合を順序集合または半順序集合と呼びます。順序集合では、すべての要素のペアについて必ずしも比較可能である必要はありません。

**反射性 (Reflexivity)**   
  - すべての要素が自身と比較可能である性質です。つまり、集合内の任意の要素 **`a`** について、**`a ≤ a`** が成り立ちます。

**反対称性 (Antisymmetry)**
- 二つの要素が互いに比較可能で、一方が他方より小さいか等しいとき、それらは実際に等しいとされる性質です。つまり、**`a ≤ b`** かつ **`b ≤ a`** ならば **`a = b`** です。
    
**推移性 (Transitivity)**
- ある要素が別の要素より小さいか等しく、その別の要素が第三の要素よりも小さいか等しいとき、最初の要素は第三の要素よりも小さいか等しいとされる性質ですつまり、**`a ≤ b`** かつ **`b ≤ c`** ならば **`a ≤ c`** です。

### 束の中の関係を表す

1. **上界と下界 (Upper and Lower Bounds)**
    - ある部分集合において、そのすべての要素よりも大きいか等しい要素をその部分集合の上界と言います。逆に、すべての要素よりも小さいか等しい要素を下界と言います。
2. **最小上界 (Supremum) と 最大下界 (Infimum)**
    - ある部分集合に対して、その上界の中で最も小さい要素を最小上界（supremum）またはjoinと言います。同様に、下界の中で最も大きい要素を最大下界（infimum）またはmeetと言います。

### 束の呼び方

1. **束 (Lattice)**
    - 任意の二要素について最小上界と最大下界が存在する順序集合を束と呼びます。束は、要素間の結合や交わりをより詳細に研究するための構造を提供します。
2. **完全束 (Complete Lattice)**
    - すべての部分集合が最小上界と最大下界を持つとき、その順序集合は完全束と呼ばれます。つまり、無限の要素の集合であっても、それらすべての要素に対するjoinとmeetが存在します。
3. **半束 (Semilattice)**
    - 半束は、集合とそれに属する二項演算（結合的かつ冪等的な演算）で構成されます。最も一般的なタイプは、上限半束（各ペアの最小上界を持つ）と下限半束（各ペアの最大下界を持つ）です。
    - 計算機科学では、データのマージや要素の集合の共通点を見つける際などに使用されます。

## 🫖例えてみると..
これらの性質をより身近な例で説明します。
- 反射性 (Reflexivity)
- 反対称性 (Antisymmetry)
- 推移性 (Transitivity)

**例**: 自己評価

自分自身を評価する際、自己評価は必ず自分自身に対して行われます。つまり、あなたはあなた自身に等しいということです。反射性はこの関係を数学的に表したもので、集合内のすべての要素 **`a`** に対して、**`a ≤ a`** となります。

**例**: 階級制度

軍隊の階級制度を考えてみましょう。もしAがBより上位の階級であり（A ≤ B）、BもAより上位の階級であるとする（B ≤ A）、これは矛盾しています。実際には、AとBは同じ階級であるということになります。反対称性は、もし二つの要素が互いに比較可能で、一方が他方より小さいか等しいと同時に逆も真であるならば、実際にはそれらは等しいということを示しています。

**例**: 社会的な繋がり

あるパーティーで、あなたが知っている人がいれば、その人が別の人を知っている場合、推移性により、あなたはその「友人の友人」を間接的に知っていることになります。つまり、あなたがアリスを知っていて（あなた ≤ アリス）、アリスがボブを知っているなら（アリス ≤ ボブ）、あなたは間接的にボブを知っていることになります（あなた ≤ ボブ）。推移性は、ある関係が一方向に継続している場合、それが連続していくことを示しています。

## 🫖例えてみると..
### **部屋の整理**

- **要素:** 物品（本、衣類、雑貨など）
- **関係:** 収納場所（棚、引き出し、クローゼットなど）
- **束の概念:** それぞれの物品は特定の収納場所に「属する」または「属さない」という二項関係により、収納の階層が形成されます。最小上界は「すべての物品を収納できる最も大きな場所」、最大下界は「特定の物品を収納できる最も小さな場所」に相当します。

```mermaid
graph TD
    A[部屋] --> B[本棚]
    A --> C[衣装ケース]
    A --> D[引き出し]
    B --> E[本]
    C --> F[衣類]
    D --> G[雑貨]
```


# 😴交わり(meet)、結び(join)を表したいのはなぜ？
交わり（meet）と結び（join）は束論における二つの基本的な操作であり、それぞれが順序集合内の要素間の最大下界と最小上界を表します。

これらの操作を表したい理由は、次のような点にあります：

1. **構造の理解**: 交わりと結びは、順序集合の構造をより深く理解するための手段を提供します。これにより、要素間の階層的な関係や、その関係がどのように全体の構造に影響を与えるかを把握することができます。
2. **情報の統合**: 複数の情報源や選択肢から一つの結論や解決策を導き出す場合、交わりと結びは異なる情報や要素を統合する方法を提供します。たとえば、異なる専門家の意見から最適な結論を得る際に役立ちます。
3. **固定点の探索**: 計算機科学において、プログラムのセマンティクスや型システムを分析する際に、交わりと結びは固定点を探すための重要なツールです。固定点は、ある関数に対してその関数を適用しても変わらない点を指し、多くの計算やアルゴリズムにおいて中心的な役割を果たします。
4. **問題解決**: 数学的または実践的な問題に対する解決策を見つける際に、交わりと結びは問題の制約を満たす解の範囲を特定するのに役立ちます。
5. **論理的推論**: 論理学において、交わりは論理的なAND（両方の命題が真の場合に真）、結びは論理的なOR（どちらかの命題が真の場合に真）に相当します。これらは論理的な推論や証明において基本的な操作です。

## 📓固定点とは？
固定点（fixed point）は、ある関数に対してその関数を適用しても変化しない点を指します。
数学的には、関数 $f$ に対して、ある値 $x$ が $f(x) = x$ を満たすとき、$x$ は $f$ の固定点です。

計算機科学において、固定点は以下のような様々な分野で重要な役割を果たします。
固定点はプログラムの挙動を正確に分析し、最適化するための基本的なツールとして使用されています。

- **再帰的関数の評価**
    - 再帰的な関数やプログラムにおいて、特定の入力に対する出力がその入力と同じになる状態が固定点です。これは再帰的な関数が終了条件に到達する点を決定するのに使用されます。
- **プログラム解析と最適化**
    - コンパイラにおけるデータフロー解析や最適化アルゴリズムでは、プログラムの各ポイントでの変数の状態を計算するために固定点の概念が使用されます。これにより、プログラムが安全で効率的であることを保証するのに役立ちます。
- **型システムとセマンティクス**
    - 型システムの理論では、型の推論や検査のプロセスを理解するために固定点の概念が用いられます。また、プログラムのセマンティクス（意味論）をモデル化する際にも固定点が重要な役割を果たします。
- **抽象解釈**
    - プログラムの動作を抽象的に解釈する際に、そのプログラムの振る舞いを表す抽象状態が固定点として捉えられます。これにより、プログラムの動作がどのように進化するかを分析し、バグや脆弱性を特定するのに役立ちます。

### 🍵日常生活における固定点の例
- **温度調節**
    - 部屋の温度が設定温度より低い（または高い）場合、エアコンやヒーターは作動して部屋の温度を上げ（または下げ）ます。部屋の温度が設定温度に達すると、エアコンやヒーターは停止し、部屋の温度は固定点に到達します。
- **貯金の目標**
    - 例えば、あなたが1,000,000円を貯金することを目標に設定した場合、この金額は固定点となります。貯金額が目標額に到達すると、目標を達成したと見なされます。

これらの例では、固定点はある目標や条件が達成された状態を表しており、その点に到達するまでのプロセスや調整が行われます。日常生活の中で私たちはしばしば、このような固定点を意識的に設定し、それに向かって行動を調整しています。


## 🍵例えてみる
交わり（meet）と結び（join）を具体例を用いて説明します。

### **1. 社会的階層と組織図**

社会的な構造や会社の組織図は、束論の「順序集合」に例えることができます。

- 組織内のある2人の**A**と**B**について
- 両者はそれぞれのチームを持っていますが、上層部での会議では共に部下の意見を代表します。
- ここで、**A**と**B**の共通の上司を**C**とした場合、**C**は**A**と**B**の「最小上界（join）」と表せます。

$$
A ≤ C,
B ≤ C
$$

ここで **C** は **A** と **B** の最小上界（join）として表され、すなわち **A** と **B** の上位に位置する人物として表現されています。これにより、**C** が **A** と **B** の意見や決定を代表して上層部の会議で発言することができることを意味しています。

```mermaid
graph TD
  A[マネージャー A] -->|上司| C[上司 C]
  B[マネージャー B] -->|上司| C[上司 C]
```

### **2. レシピと料理の材料**

料理のレシピは、材料の「最小上界」を見つける過程として表すことができます。

- オムレツ**O**を作るには卵**E**、牛乳**M**、塩**S**が必要です。
- オムレツという料理**O**は、これらの材料の結び（join）です。
- レシピにおいてこれらの材料の組み合わせが最も重要です。

$$
E ∨ M ∨ S = O
$$

- **∨**は結び（join）を意味し、**E**、**M**、**S**の任意の組み合わせがオムレツ**O**を作るための最小の必要条件を満たします。

```mermaid
graph TD
  E[卵 E] -->|join| O[オムレツ O]
  M[牛乳 M] -->|join| O[オムレツ O]
  S[塩 S] -->|join| O[オムレツ O]
```

### **3. 意思決定のプロセス**

意思決定のプロセスでは、異なる選択肢が交わり（meet）と結び（join）を通じて最終的な決定に至ります。

- 例えば、新しい車を購入する際に燃費の良さ**F**、安全性**S**、価格**P**を考慮するとします。
- ある車**C**がこれらの要件を満たす場合、**C**はこれらの要素の交わり（meet）です。

$$
F ∧ S ∧ P = C
$$

- **∧**は交わり（meet）を意味し、**F**、**S**、**P**の各要素が満たされる点が車**C**の選択となります。

```mermaid
graph TD
  F[燃費の良さ F] -->|meet| C[車 C]
  S[安全性 S] -->|meet| C[車 C]
  P[価格 P] -->|meet| C[車 C]
```

### 以上 随時追記していきます...