# 圏論でのステートマシン ステートマシンの構造 - 状態の集合 $S$ - 入力の集合(アルファベット) $\Sigma$ - 遷移関数 $\delta: S \times \Sigma \to S$ - 初期状態 $s_0 \in S$ - (必要に応じて)受理状態の集合 $F \subseteq S$ 圏論でのステートマシンの捉え方 - (a) 状態遷移を射と見る - 各状態を**対象(object)**として、 - 各入力に対応する遷移を**射(morphism)**とみなす。 - これにより、ステートマシンを**小さな圏(small category)**と見なせる。 - (b) オートマトンを圏の圏として考える - 状態遷移システムを、**自由圏(free category)**として定式化できる。 - 例えば、アルファベット $\Sigma$ による遷移を生成元とする有向グラフから自由圏を作り、そこに関手を定義して実際の動作を表現する。 - (c) 状態遷移を関手として考える - ステートマシンの振る舞いは、ある入力文字列の圏(たとえば自由モノイド $\Sigma^*$)から状態遷移の圏への関手とみなせる。 - これは「入力の列 → 状態の遷移の列」という構造保存的マッピングである。 まとめ | **観点** | **圏論での対応** | | -------------------- | ------------------------------------------------ | | 状態 | 対象(Object) | | 遷移 | 射(Morphism) | | 入力系列 | モノイド(自由圏) | | ステートマシン全体 | 関手(Functors)または圏 | | 状態遷移の論理的挙動 | ナチュラルトランスフォーメーションやコアルゲブラ | ## システム開発への応用 | **圏論概念** | **システム開発での意味** | | ------------------ | ---------------------------------------------- | | **対象 (Object)** | 状態・データ型・画面など | | **射 (Morphism)** | 処理・変換・イベント遷移など | | **関手 (Functor)** | モデル間の写像、状態から画面への写像など | | **自然変換** | モデルバージョン間の変換、差分の表現など | | **圏の合成性** | 部分システムの結合やモジュール化の理論的裏付け | ## Haskellで圏論的ステートマシンを表現する 1. 型による状態の表現 ```haskell -- 状態(対象) data State = Draft | Review | Published deriving (Show, Eq) -- イベント(射) data Event = Submit | Approve | Reject deriving (Show, Eq) ``` 2. 遷移関数(射の合成)を定義 ```haskell -- 遷移関数:状態 × イベント → Maybe 状態(合成可能かどうか) transition :: State -> Event -> Maybe State transition Draft Submit = Just Review transition Review Approve = Just Published transition Review Reject = Just Draft transition _ _ = Nothing -- 合成不可能な射(無効な遷移) ``` 3. 遷移の合成を使ってトレース ```haskell -- 入力イベント列に対する遷移をたどる runTransitions :: State -> [Event] -> Maybe State runTransitions = foldl (\acc e -> acc >>= (`transition` e)) . Just ``` ```haskell -- 実行例 main :: IO () main = do let events = [Submit, Approve] let result = runTransitions Draft events print result -- Just Published ``` 4. 圏論的な構造を抽象化(拡張) さらに、状態遷移の構造を型クラスで一般化しておくと、再利用性が高まる。 ```haskell class CategoryLike s e where transition' :: s -> e -> Maybe s ``` ```haskell instance CategoryLike State Event where transition' = transition ``` 5. モナドとの相性:履歴付きのトレース ```haskell type Trace = [(State, Event)] runTrace :: State -> [Event] -> Maybe (State, Trace) runTrace = go [] where go acc s [] = Just (s, reverse acc) go acc s (e:es) = case transition s e of Just s' -> go ((s, e):acc) s' es Nothing -> Nothing ``` まとめ | **圏論概念** | **Haskellでの対応** | | ----------- | ------------------------------------------- | | 対象(object) | `State`(データ型) | | 射(morphism) | `Event` + `transition :: s -> e -> Maybe s` | | 合成 | `foldl` と `>>=` による逐次適用 | | 恒等射 | 自明な `id :: State -> State`(何も起こらない) | | 合成可能性 | `Maybe` でモナディックに検証 | | 圏 | 明示的に定義しなくても、実装が圏論的意味論に従っている | UI の画面遷移を「状態=画面」「操作=射(イベント)」として圏論的にモデル化することもできる。