1. 現実の離散化:コンピュータの世界へ
現実世界(第2部)が連続的な時間と確率の海であるのに対し、コンピュータの世界は離散的です。
「もしも」がコンピュータの中で機能するためには、現実の連続的な現象を離散的な状態へと**モデル化(離散化)**する必要があります。
1.1 状態遷移としての「もしも」
コンピュータにおける「もしも」は、**状態遷移(State Transition)**として記述されます。
システムは有限の状態 の集合を持ち、入力 によって次の状態 へと遷移します。
ここで、if文はこの遷移関数 の一部を条件付きで実行する機構です。
if condition:
execute_action_A()
else:
execute_action_B()この構造は、論理値(真/偽)に基づいて、実行パスを分岐させます。
1.2 決定論的ifと非決定論的if
古典的なコンピュータ(チューリングマシン)において、if文は決定論的です。
条件が真であれば、常に同じアクションが実行されます。
しかし、現代のプログラミングでは、非決定論的ifも存在します。
- 確率的if: ランダムな値に基づいて分岐(例:モンテカルロ法)。
- 並列if: 複数のスレッドが同時に条件を満たす場合の競合。
本書では、主に決定論的ifを扱いますが、AIの文脈では非決定論性が重要になります。
2. 抽象化と「もしも」の階層
プログラミングにおいて、「もしも」は階層的に構成されます。
2.1 低レベルif: ハードウェアの分岐
CPUの命令セットアーキテクチャ(ISA)レベルでは、if文は**分岐命令(Branch Instruction)**として実装されます。
JMP(Jump): 無条件分岐JE(Jump if Equal): 条件付き分岐
このレベルでは、「もしも」はメモリ上のアドレスへのジャンプ先を決定する物理的な信号です。
2.2 高レベルif: 論理構造の構築
高レベル言語(Python, C++, Javaなど)では、if文は複雑な論理式として記述されます。
この抽象化により、プログラマーは物理的な分岐の詳細を意識せず、**意図(Intent)**として「もしも」を記述できます。
2.3 関数型プログラミングと「もしも」
関数型プログラミングでは、if文は**パターンマッチング(Pattern Matching)**として表現されることが多いです。
case x of
Just val -> doSomething val
Nothing -> doNothingこれは、if-else文よりも、データ構造そのものに対する「もしも」の適用として捉えられます。
3. 無限ループと停止性問題
「もしも」の構造において、最も重要な問題の一つが**停止性(Halting Problem)**です。
アラン・チューリングは、任意のプログラムが停止するかどうかを一般に判定するアルゴリズムは存在しないことを証明しました。
3.1 「もしも」が永遠に続く場合
while True:
if condition:
breakこのコードは、condition が真になるまで永遠にループします。
「もしも」が条件を満たさない場合、その「もしも」は永遠に実行されません。
3.2 実用的な「もしも」
現実のシステムでは、タイムアウトや最大反復回数によって、「もしも」の探索範囲を制限します。
これは、第6章で述べた予測可能時間のプログラミング的な実装です。
4. 第7章のまとめ:計算可能な「もしも」
第7章では、仮想的ifの基礎であるプログラミングにおけるif文について解説しました。
「もしも」は、現実の連続性を離散化し、決定論的な分岐として実装されます。
しかし、この「もしも」は、人間が明示的にルールを記述したものです。
では、ルールを人間が記述せず、データから「もしも」を自動生成できるのでしょうか?
それが、次の章で扱うアルゴリズムと機械学習の領域です。