o3-mini-highにPrologインタプリターを作らせてみた
はじめに
先週2月1日土曜日(日本時間)、OpenAIの最新モデルであるo3-miniシリーズがいよいよリリースされました。o3には高速なo3-miniと、特にSTEM分野で高い性能を発揮するo3-mini-highがあり、後者についてはTwitter(X)で今までよりも大きなプログラムを「一回で」出してくれるということで早くも話題になっています。
筆者も自分の専門分野について、あるいはプログラム生成に使ってみて「修正指示なしに」1000行程度の動くコードを一発で出してくれることに驚きました(分野によりますが)。今回はプログラミング言語屋さんらしく、Prologというプログラミング言語のインタプリターをJavaScriptで書いてもらうという課題を与えてみました。
Prologとは
Prolog(Programming in Logicの略)は、1970年代に開発された論理型プログラミング言語です。命令型プログラミングとも関数型プログラミングとも異なり、Prolog(あるいは論理型プログラミング)は「何をするか」を論理的な事実や規則として記述し、「どのように解くか」は内部の推論エンジンに委ねます。たとえば、以下のような形で知識を表現します。
- 事実(fact)
例:
parent(taro, hanako).
→ 「太郎は花子の親である」という事実を表現。
- 規則(rule)
例:
sibling(X, Y) :- parent(Z, X), parent(Z, Y), X \= Y.
→ 「XとYが兄弟であるためには、同じ親Zを持ち、かつXとYが異なる存在でなければならない」という規則を定義。
- クエリ(query)
例:
?- sibling(hanako, jiro).
→ 「花子と次郎が兄弟関係にあるか」を問うクエリ。内部で定義された事実と規則に基づいて、Prologは論理推論を行い、解答を導き出します。
このように、Prologは論理的な知識の記述と(バックトラックによる)自動推論という特徴を持ち、20世紀後半の人工知能、自然言語処理、エキスパートシステムなどの分野で活用されてきました(近年は残念ながら影が薄いですが、個人的には今だからこそLLMの力を補う形で「論理型」の力が生きる部分があるのではと考えています)。
そんなPrologインタプリターですが、簡単なものであれば数百行で作成できる一方で、バックトラックと単一化(ユニフィケーション)と呼ばれる処理を実装をするのは意外に難しいです。実際、GPT-4oやClaude 3.5 Sonnetに実装させたときは一発だとバグあり実装しか出してくれませんでした。
o1に対してはPrologの抽象構文木をあらかじめ与えるなど注意深くやれば一発でできなくもないが、うっかりするとバグが入り込むというのが正直な感想です(o1 proは試してないので、ひょっとしたら一発でできるかもしれません)。
o3-mini-highにPrologインタプリタを書かせる
とりあえずシンプルに作らせてみましょう。プロンプトは以下です:
JavaScriptで動くPrologインタプリターを作ってください。ブラウザ上で実行できるようにHTMLを使って、見栄えはCSSなどで整えてください。
これに対して、o3-mini-highは数十秒の思考過程を経て、このようなHTMLを出力してくれました。
成果物はこちらから試せます。
これを実行したのが以下で、parentとgrandparentの「定義だけ」から、susanの孫はjohnであることを回答できています。
ここでは解が一つだけですが、以下の「maryはbillの親である」という事実を追加すると、
parent(mary, bill).
次のように解候補を複数生成してくれます。
このように解が複数あるときでも、うまく探索できるのがPrologの強みです。
正直、この実装は最低限のもので、フルセットのPrologには足りないものがたくさんありますし、エラー処理もいい加減ではありませんが、これが「一発で」出てくる域まで達したか……と思うと少し感慨深くもあります。
おわりに
というわけで、出たばかりのo3-mini-highを使ってProlog(のサブセット)を実装してみました。他にも簡単なAI付き将棋(800行程度)を生成してくれたり、1000行くらいまでのプログラムならボン出ししてくれることも多い印象です。
o3-mini-highを使うにはChatGPT Plus(月額$20)に入る必要があるので、お安くはありませんが、個人的にはそれに十分見合った楽しみと、時間コストの削減を得られているという実感があります。
皆さんももし興味があれば是非触ってみてください。
Discussion