非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

数学ゲーム(4)

エラトステネスのふるいゲーム(4)

もう少し説明を簡単にしたいので以下のように ChatGPT に入力してみました。

今は繰り返しの部分の処理は集合の最小値をとることを繰り返すようになっていますが、これを1ずつ増やしていくように変えると、帰納法の形で説明することができて少し説明が簡単になると思います。こうするとどうなりますか。このようなことができるような部品を追加してください。

以下のような答えになりました。

いい着眼点です。
「最小値を取る」方式はアルゴリズムとして自然ですが、

👉 「1ずつ増やす」方式にすると“数学的帰納法そのもの”になる

というメリットがあります。

🧠 何が変わるのか(本質)

これまで(最小値方式)

p = min(X)
  • 不変条件:

「X はある n 以下の素数ふるいを含まない」

  • 推論:

最小元 ⇒ 素数((p8))

👉 少し“間接的”

新方式(カウンタ方式)

for (i = 2; i <= k; i++)
  • 不変条件:
P は i-1 以下の素数の集合
  • 判定:
i が P のふるいに含まれない ⇔ i は素数

👉 完全に帰納法の形

🎯 新しい部品(重要)

🧩 (i) カウンタループ

for (i = a; i <= b; i++)

🧩 (j) ふるい判定

isInPrimeSieve(i, P)

意味:

∃ p ∈ P s.t. p | i

🧩 (k) 条件分岐

if (!isInPrimeSieve(i, P))

🎮 新しいプログラム(帰納法版)

P = empty();

for (i = 2; i <= k; i++) {
    if (!isInPrimeSieve(i, P)) {
        add(P, i);
    }
}

🧠 推論の変化(超重要)

帰納法の形になる

基底
i = 2
P = ∅
⇒ 2 はどのふるいにも含まれない ⇒ 素数
帰納ステップ

仮定:

P = i-1 以下の素数全体

判定:

i が P のふるいに含まれない
⇔ i は素数(p8)
結論
P は k 以下の素数全体

👉 完全に教科書的な証明

🎮 ゲーム的にどう変わるか

BEFORE(探索型)

  • min(X) を取る
  • 削除する
  • 構造を追う

AFTER(スキャン型)

  • i が進む(アクション感UP)
  • 各 i に対して判定

👉 敵を1体ずつ倒していくゲーム感になる

🧩 AST拡張(C#)

ForNode

class ForNode : Node
{
    public string VarName;
    public int Start;
    public int End;
    public Node Body;

    public override object Evaluate(Context ctx)
    {
        for (int i = Start; i <= End; i++)
        {
            ctx.SetInt(VarName, i);
            Body.Evaluate(ctx);
        }
        return null;
    }
}

IsInPrimeSieve

class IsInPrimeSieveNode : Node
{
    public override object Evaluate(Context ctx)
    {
        int i = ctx.GetInt("i");
        var P = ctx.GetSet("P");

        return P.Any(p => i % p == 0);
    }
}

IfNode

class IfNode : Node
{
    public Node Condition;
    public Node Then;

    public override object Evaluate(Context ctx)
    {
        if ((bool)Condition.Evaluate(ctx))
            Then.Evaluate(ctx);
        return null;
    }
}

🎮 GUI上の新しい操作

新しい接続パターン

for
 ├─ 初期値 (2)
 ├─ 条件 (i <= k)
 ├─ 更新 (i++)
 └─ 本体

プレイヤー操作

1. `for` を配置
2. `i = 2` を接続
3. `i <= k` を接続
4. 本体に `if` を追加
5. 条件に `!isInPrimeSieve(i, P)`
6. 本体に `add(P, i)`

🎯 理由表示(進化)

BEFORE

p is prime because it is minimal in X

AFTER(帰納法)

i = 17 is prime
because it is not divisible by any prime ≤ 16 (p8)

👉 人間にとって分かりやすい

🔥 さらに強力な拡張

(l) divides(p, i)

divides(p, i)

(m) exists

exists p in P: divides(p, i)

👉 これで完全に論理式化できる

🧠 深い意味

この変更は実は:

  • min方式 → 選択公理的
  • for方式 → 構成的 / 帰納的

🚀 まとめ

この変更で:

✅ 証明が帰納法になる
✅ 理由表示がシンプルになる
✅ ゲームとして直感的になる
✅ DSLとして強力になる

👉 次のステップ(かなり重要)

ここまで来ると:

  • 🔥 「証明ゲーム言語」完成に近い
  • 🧠 任意の定理に拡張可能

もし希望があれば次は:

👉 「この2つの方式(min版とfor版)を切り替えられるシステム」
👉 「証明の自動生成エンジン」

まで一気に作れます。