雑記帳

ChatGPT に Haskell で書かれたアッカーマン関数の構成式の解説をお願いしてみたら... 【技術革新】

アッカーマン関数は、 Haskell の Prelude 標準モジュールの関数だけを使った次のようなシンプルなコードで書き下すことができます。
((!!).iterate(curry(uncurry id.(((<*>).fmap(,))((!!).uncurry iterate.(((<*>).fmap(,))fst$const 1))$succ.snd)))$succ)
...とはいえ、このコードはどういった議論を経てやってきたのでしょうか?
もちろんちゃんとした数学を追いかけながら書き下したコードなのですが、圏論や関数型プログラミングと呼ばれるものにあまり馴染みがないと、その辺の咀嚼が難しく感じてしまうかもしれません。
でも安心してください。
今の時代ネット環境さえあれば、莫大な量のデータが放り込まれた素敵な道具 (LLM) に誰でもフリーでアクセスできてしまいます。
ということで、わからなければ Gemini なり ChatGPT なり DeepSeek なりに質問文を入力するだけで、全て解決できてしまうわけです。
わからないことを理解するなんてことのために、わざわざ時間をかけて頭を悩ませるなんて愚の骨頂。
この時代に頭を使うなんていう、意識高い系みたいなダサいことは一切やめましょう。
では、今回は「そのコードについての説明も並行して含めていただいた、明確な引数をアッカーマン関数に適用して得られる値 A(4,1) が実際にどうなるのかの予想」、つまり以下の Haskell コードの詳しい説明をサクッと ChatGPT に生成してもらっちゃいましょう。
((!!).iterate(curry(uncurry id.(((<*>).fmap(,))((!!).uncurry iterate.(((<*>).fmap(,))fst$const 1))$succ.snd)))$succ) 4 1
出力は以下の通り。
※ 画像に表示されているコードと上記のコードは微妙に異なりますが、それらのコードの間に "本質的な" 違いは全くないので、意味の方をしっかりと完璧に捉えている前提の LLM からの出力が、それらの最適化の前後で大胆に変わるはずがないことは敢えて言うまでもないですよね。
スクリーンショット
スクリーンショット
スクリーンショット
スクリーンショット
スクリーンショット
スクリーンショット
よくわからない記述もありますが、はっきりとしているのは最終的な A(4,1) の結果が
  • 実際の結果: 65533
  • ChatGPT の推測値: 4
という感じになっていること。
そうなると、少し不正確な推測値を導いてしまった途中の文字列から意味を見出す作業というものが持つ重要性はやはり薄れてしまうので、いっそのことそれらは「よくわからない記述」のままにしておくことが最も妥当であると考えしまっても大丈夫でしょうか。
まとめ
タグをご覧の通り、いつもの茶番ネタ記事でした。
とはいえ、この記事を通じて「自分のわからない内容を LLM 経由で得られるコンパクトにまとめ上げられた文字列を用いて勉強することの強み」がわかってくれる人が少しでも増えるといいな。
余談
実のところ、最初はちゃんと誤った記述について漏れなく丁寧に説明する記事を書いていたのだけど、「そのわからないところを真偽がわからないまま鵜呑みにするスリル」が LLM を使って勉強する醍醐味の1つであることに気付き、同時にその行為はそれを台無しにしてしまうことに繋がることも理解したので結果自重することになりました。
それにしても友人至上主義者の僕からすると、こういった道具が準備されてしまったことで、大切な関係になるかもしれない相手との交流のきっかけの1つが実質的に排除されてしまった現代の空気の読める子どもたちってね...