2025年3月14日金曜日

三輪眞弘について生成AIに聞いてみた(3):「またりさま」のプログラムの作成(ChatGPTの場合)

  この記事では、「またりさま」の状態遷移規則をプロンプトとして説明し、ChatGPTにプログラムを生成させることに成功したので、その結果を報告します。

 プログラムの仕様を日本語で伝える必要があることから、プロンプトの書き方で試行錯誤をしましたが、何度か更新して、以下の指示で、chatGPT'(GPT-4o)に意図するプログラムを作成させることに成功しました。生成AIでは「やりたいことを伝えればプログラムを作ってくれる」ということが言われますが、簡単なものではあるものの、実際にそれができることの検証になっていると思います。

 ここでは双子兄をシミュレートするプログラムを作成することとして、初期値を指定し、双子兄の周期の長さからループの回数を一旦天下りに指定してプログラムを作成させた後、初期状態になったら停止するように指示しました。ここでは試行錯誤の過程は割愛し、最後の2つのプロンプトとそれに対する回答を示します。また、最終版の実行結果を最後に示します。

 ChatGPTは、三輪さんの作品の特徴の説明については、所謂「幻覚・ハルシネーション(Hallucination)」を惹き起こしてしまいましたが、プログラム作成の課題についてはきちんとこなす能力があることが確認できました。プログラムの自動生成というのは永らく「夢の技術」だったわけですが、実用的な商用プログラム開発に適用できるかどうかは別として、研究としての水準では、その夢の実現が現実的なものになりつつあることを認識させられました。なお、同一の課題に対して、Gemini, Claudeも対応できることを確認済ですが、そちらは機会があれば別途ご報告することにします。

(2025.3.14, 15)

*     *     *

プロンプト:「8個の[0,1]変数x1~x8について、x1とx2、x2とx3,...x8とx1というように隣り合った変数間で排他的論理和の計算を順番にします。x1とx2の計算結果でx2を更新してからx2とx3の計算をするというように順番に計算をします。変数の値の変化を表示するプログラムを作って下さい。計算は63回繰り返します。初期値は[0,0,0,1,0,1,0,1]とします。」

ChatGPT(2025.3.13)

了解です!
8個の [0,1] 変数 x1~x8 に対して、隣り合う変数同士の排他的論理和(XOR)を順番に計算し、途中で値を更新しながら進めていくシミュレーションですね。
計算は63回繰り返し、初期値は [0, 0, 0, 1, 0, 1, 0, 1] です。
それでは、Pythonでシンプルなコードを書きます!

# 初期値
x = [0, 0, 0, 1, 0, 1, 0, 1]

# 63回繰り返し
for step in range(1, 64):
    print(f"Step {step}: {x}")  # 現在の値を表示

    # 一時的に新しい値を保持するのではなく、順番に更新
    for i in range(8):
        a_index = i
        b_index = (i + 1) % 8  # 次の要素(最後は循環)
        # XORの結果をb_indexの要素に更新
        x[b_index] = x[a_index] ^ x[b_index]

# 最終状態も表示
print(f"Step 64: {x}")

説明

  • x[a_index] ^ x[b_index] で排他的論理和(XOR)を計算。
  • x[b_index] に結果を代入するので、順番に値が更新されていきます。
  • b_index = (i + 1) % 8 にして、x8 の次は x1 へ循環させています。
  • 各ステップで現在の値を表示しています。

もっとカスタマイズや結果の視覚化もできるけど、こんな感じで大丈夫?
何か追加することがあれば教えて!

*     *     *

プロンプト: 「初期状態に戻ったらループを停止するようにしてください。」

ChatGPT(2025.3.13)

了解です!
「初期状態に戻ったらループを停止」という条件を追加しますね。

初期状態に戻ったらループを止めるように改良したコードはこちらです👇

# 初期値
initial_state = [0, 0, 0, 1, 0, 1, 0, 1]
x = initial_state.copy()

# 初期状態を表示
print(f"Step 0: {x}")

# 最大63回繰り返す(それ以内にループが見つかれば停止)
for step in range(1, 64):
    # 隣同士のXORを順番に計算してbを更新
    for i in range(8):
        a_index = i
        b_index = (i + 1) % 8
        x[b_index] = x[a_index] ^ x[b_index]
    
    # 現在の状態を表示
    print(f"Step {step}: {x}")

    # 初期状態に戻ったか確認
    if x == initial_state:
        print(f"初期状態に戻ったので、{step}回目で停止します。")
        break
else:
    print("63回繰り返しても初期状態には戻りませんでした。")

改良点

  • initial_state と x を比較して、初期状態に戻ったら break でループを抜けます。
  • for...else を使って、63回すべて終了しても戻らなかった場合のメッセージも表示します。
  • 最初の状態(Step 0)も表示。

これでループの検出もばっちり!
動作確認してみて、他に追加や変更あれば遠慮なくどうぞー😊

*     *     *

実行結果: 

Step 0: [0, 0, 0, 1, 0, 1, 0, 1]

Step 1: [1, 0, 0, 1, 1, 0, 0, 1]

Step 2: [1, 1, 1, 0, 1, 1, 1, 0]

Step 3: [1, 0, 1, 1, 0, 1, 0, 0]

Step 4: [1, 1, 0, 1, 1, 0, 0, 0]

Step 5: [1, 0, 0, 1, 0, 0, 0, 0]

Step 6: [1, 1, 1, 0, 0, 0, 0, 0]

Step 7: [0, 0, 1, 1, 1, 1, 1, 1]

Step 8: [0, 0, 1, 0, 1, 0, 1, 0]

Step 9: [1, 0, 1, 1, 0, 0, 1, 1]

Step 10: [0, 1, 0, 1, 1, 1, 0, 1]

Step 11: [1, 1, 1, 0, 1, 0, 0, 1]

Step 12: [0, 0, 1, 1, 0, 0, 0, 1]

Step 13: [1, 0, 1, 0, 0, 0, 0, 1]

Step 14: [0, 1, 0, 0, 0, 0, 0, 1]

Step 15: [0, 1, 1, 1, 1, 1, 1, 0]

Step 16: [0, 1, 0, 1, 0, 1, 0, 0]

Step 17: [1, 1, 1, 0, 0, 1, 1, 1]

Step 18: [1, 0, 1, 1, 1, 0, 1, 0]

Step 19: [0, 1, 0, 1, 0, 0, 1, 1]

Step 20: [0, 1, 1, 0, 0, 0, 1, 0]

Step 21: [1, 1, 0, 0, 0, 0, 1, 1]

Step 22: [1, 0, 0, 0, 0, 0, 1, 0]

Step 23: [1, 1, 1, 1, 1, 1, 0, 0]

Step 24: [1, 0, 1, 0, 1, 0, 0, 0]

Step 25: [0, 1, 0, 0, 1, 1, 1, 1]

Step 26: [1, 1, 1, 1, 0, 1, 0, 1]

Step 27: [1, 0, 1, 0, 0, 1, 1, 0]

Step 28: [1, 1, 0, 0, 0, 1, 0, 0]

Step 29: [0, 0, 0, 0, 0, 1, 1, 1]

Step 30: [1, 0, 0, 0, 0, 1, 0, 1]

Step 31: [0, 1, 1, 1, 1, 0, 0, 1]

Step 32: [1, 1, 0, 1, 0, 0, 0, 1]

Step 33: [1, 0, 0, 1, 1, 1, 1, 0]

Step 34: [0, 1, 1, 0, 1, 0, 1, 1]

Step 35: [1, 1, 0, 0, 1, 1, 0, 1]

Step 36: [0, 0, 0, 0, 1, 0, 0, 1]

Step 37: [0, 0, 0, 0, 1, 1, 1, 0]

Step 38: [1, 0, 0, 0, 1, 0, 1, 1]

Step 39: [1, 1, 1, 1, 0, 0, 1, 0]

Step 40: [0, 0, 1, 0, 0, 0, 1, 1]

Step 41: [1, 0, 1, 1, 1, 1, 0, 1]

Step 42: [1, 1, 0, 1, 0, 1, 1, 0]

Step 43: [0, 0, 0, 1, 1, 0, 1, 1]

Step 44: [0, 0, 0, 1, 0, 0, 1, 0]

Step 45: [0, 0, 0, 1, 1, 1, 0, 0]

Step 46: [1, 0, 0, 1, 0, 1, 1, 1]

Step 47: [0, 1, 1, 0, 0, 1, 0, 1]

Step 48: [0, 1, 0, 0, 0, 1, 1, 0]

Step 49: [1, 1, 1, 1, 1, 0, 1, 1]

Step 50: [0, 0, 1, 0, 1, 1, 0, 1]

Step 51: [0, 0, 1, 1, 0, 1, 1, 0]

Step 52: [0, 0, 1, 0, 0, 1, 0, 0]

Step 53: [0, 0, 1, 1, 1, 0, 0, 0]

Step 54: [1, 0, 1, 0, 1, 1, 1, 1]

Step 55: [1, 1, 0, 0, 1, 0, 1, 0]

Step 56: [1, 0, 0, 0, 1, 1, 0, 0]

Step 57: [0, 1, 1, 1, 0, 1, 1, 1]

Step 58: [0, 1, 0, 1, 1, 0, 1, 0]

Step 59: [0, 1, 1, 0, 1, 1, 0, 0]

Step 60: [0, 1, 0, 0, 1, 0, 0, 0]

Step 61: [0, 1, 1, 1, 0, 0, 0, 0]

Step 62: [1, 1, 0, 1, 1, 1, 1, 1]

Step 63: [0, 0, 0, 1, 0, 1, 0, 1]

初期状態に戻ったので、63回目で停止します。


0 件のコメント:

コメントを投稿