ディスカッション (11件)
Prologの基礎をポケモンの例を使って分かりやすく解説します。論理プログラミング特有の考え方や、事実とルールの定義方法をポケモン図鑑のような直感的なアプローチでマスターしましょう。
最初は戸惑ったけど、最後の方になって、例としてポケモンを選ぶのが、Prologがいかに問題を解決できるかを示す上で実はかなりうまくいっていることに気づいた。ちょっとどこかで試してみたい気分。
ポケモンのようなゲームで、特定のアルゴリズム(論理プログラミング、ニューラルネット、線形計画法など)を使って参加者が競い合うような公開トーナメントってあるのかな?
Joe Armstrongが最初のErlangの実装をPrologで書けたっていうのは、今でも信じられないほど驚かされる。ソースコードのコピーをもらっておけばよかった。
大学時代、PrologとLispを教えるコースは「エンジニアのための人工知能」って名前だったな。
すごくいいね!Scryer Prologの議論の中で、AlexがPrologコードの改良案や考慮事項をいくつか共有していて、メタプログラミングを使ってより汎用的な関係を自動生成する方法なんかも提案されているよ:https://github.com/mthom/scryer-prolog/discussions/3221 。続きの記事も楽しみにしている!あと、Alexによる「factgraph.pl」もかなり面白いプログラムだね:https://github.com/alexpetros/factgraph.pl 。これはIRS Fact GraphをPrologで実装したもので、「法をコードとして扱う(Law as Code)」の応用事例だよ。
このユースケースすごくいいね。Magic the Gatheringでも同じようなものを実装したくなった。scryfallを使うのは大好きだけど、Commanderみたいな絶えずカードプールが増え続けるエターナルフォーマットでデッキを組むなら、記述的なルールに基づいたCLIファーストなアプローチの方がずっと効率的だと思う。今はキーワード検索でどうにかしてるんだけどね。
「解の末尾が 'or false' で終わることを気にしないでください。これは探索アルゴリズムの仕組みによるもので、ソルバーがこれ以上の解を探そうとして失敗しただけです。なぜ時々こうなるのか完全に理解しているわけではありませんが、想定通りの挙動です」
これについては『The Power of Prolog[1]』で解説されていたと思う。Prologの回答はターミナルへのテキスト出力ではなく、有効なPrologターム(データ/コード)なんだ。だから、コードと同じように「OR」として「;」が使われる。回答の (x ; y ; false) は「クエリに対する回答はx、またはy、それ以外には見つからなかった」という意味。もし僕より詳しくて上級者なら、これをメタプログラミングに使って、結果を推論したり、LISP的なデータとしてコードを書き換えたりできるはず。
Prologシステムは可能な場合、探索せずに正しい回答へジャンプする最適化を行う(例えば事実やルールに対するデータベーススタイルのインデックスなど)。そういうケースでは、最初の回答を表示した後に探索すべきコードが残っていないから、ユーザーに「残りのコードからさらに解を探すか?」と促す必要もなく、結果として「探索終了、これ以上見つからず」を意味する「false」も表示されないんだ。
もしこれがあなたの記事なら、learns_priority/3 にタイプミスがあるよ。「move_priority #> 0」は「P #> 0」であるべき。
次のようにクエリを実行します:
(SQLコードブロック)
うーん、これって代わりにこう書けないかな?
(SQLコードブロック)
ポケモンの世界観をよく知らないんだけど、誰かPrologを使ってポケモンについて説明してくれない?