Web ブラウザ上で動く Prolog の対話環境 (REPL) サイトを立ち上げた

ズバリ、表題のとおり、近代 Web ブラウザ上で動く Prolog の対話環境 (REPL) サイト **"Prolog on Browser"** を立ち上げました。
URL は下記です。

- https://jsakamoto.github.io/Prolog-on-Browser/
[![movie-001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58450/11dd4ec3-85b0-b2b4-602e-07ce0f650984.gif)](https://jsakamoto.github.io/Prolog-on-Browser/)

現時点では、まだちゃんとオフライン対応の仕込みをしていないため、インターネット接続がないと利用できませんが、サーバー側で Prolog が動いているのではなく、**Web ブラウザ上で Prolog インタープリタが動作**しています。

PWA 等でオフライン対応の実装を済ませたら、いちどロードした後はインターネット接続がない環境でも起動できるようになります。

# 動作の仕組み

## C# 製の Prolog インタプリター "CSharpProlog"

John C Pool 氏が 2006 年に個人的なプロジェクトとして、C# を使って Prolog インタプリターを開発しました。
それが「CSharpProlog」(a.k.a CSProlog) というライブラリです。
NuGet パッケージとして下記に公開されています。

- [NuGet Gallery | CSProlog](https://www.nuget.org/packages/CSProlog/)

この NuGet パッケージを利用することで、C# プログラムに Prolog インタプリター機能を搭載したり、Prolog によるルールエンジンを実装したりすることができます。

5年前の記事ですが下記に参考記事があります。

- [複雑な条件分岐にサヨウナラ。ルールエンジンとして Prolog を使って複雑な条件をシンプルにしてみた](https://devadjust.exblog.jp/22680601/)

"Prolog on Browser" では、この「CSharpProlog」を Web ブラウザ上で動作させることで、Prolog の対話環境 (REPL) を実現しています。

## Web ブラウザ上で C# による SPA 実装を実現する "Blazor"

[Steve Sanderson](https://twitter.com/stevensanderson) 氏が 2017 年に個人的なプロジェクトとして、[.NET の IL (中間言語) のインタプリター実装 (Chris Bacon 氏による)](https://github.com/chrisdunelm/DotNetAnywhere) を拾い上げ、これを Web ブラウザ内の WebAssembly 上で走らせることで、C# で SPA を書くことを実現しました。
それが Blazor WebAssembly というフレームワーク/SPA 実行環境です。

まだ正式プロダクトになる前の当時の投稿ですが、下記など参考になればと思います。

- [C# で Single Page Web Application が書ける Blazor が凄かった件](https://qiita.com/jsakamoto/items/20d4893f6c8cdb0356f6)

今は Microsoft の ASP.NET Core チームに正式に引き継がれ、2020年5月に正式バージョンとしてのリリースを果たしました。

"Prolog on Browser" では、Blazor WebAssembly を使って SPA として実装しています。
Blazor WebAssembly は、C# プログラム、というか、正確には .NET のアセンブリ( .dll) を Web ブラウザ上で動かせるわけなので、それで、前述の「CSharpProlog」も Blazor WebAssembly により Web ブラウザ上で実行されている次第です。

# 他の実装手段はなかったのか?

そもそも Prolog インタプリターの WebAssembly 実装が利用可能であれば、現状の "Blazor on Browser" サイトのような何段ものレイヤーを積み重ねたようなまどろっこしい実装は不要です。

ただ、自分の知れる範疇では、Prolog インタプリターの WebAssembly 実装についてはよくわからず仕舞いでいます。
しかしとりあえず「CSharpProlog」の取り扱いと、Blazor WebAssembly による SPA 開発については、自分にも一定の知識と経験がありましたので、それで手っ取り早く自分の実現できる手段で "Blazor on Browser" サイトを立ち上げてみた次第です。

# どうして "Prolog on Browser" サイトを立ち上げたのか?

[Qiita Prolog アドベントカレンダー 2020](https://qiita.com/advent-calendar/2020/prolog)に空きがあったので、何か投稿するネタとかないかなー、と考えて、それでふと、今回紹介の "Prolog on Browser" サイトの立ち上げを思いつきました。

それがいちばんの動機です :)

なお、今日現在公開中の "Prolog on Browser" サイト立ち上げまでには、余暇の時間を使って2日間かかりました。
今日に至るまでの Blazor WebAssembly の実装経験や、他のオープンソースコードの蓄積がありそこからの転用ができたので、その程度の実装期間で済んだ感じです。

# "Prolog on Browser" の今後

さて、こうしてどうにか "Prolog on Browser" サイトを公開開始はしたのですが、実のところ、未実装の機能や要件がたくさんあります。

本当は、「気軽な Prolog プログラミングの学習用にいかがですか?」と言いたいところです。
が、今日現在の "Prolog on Browser" の程度ではちょっと無理がありそうです。

だいたい、ブラウザを閉じたらそれまでに REPL に入力した Prolog プログラムは揮発してなくなります。

そもそも `consult()` (テキストファイルに記述された Prolog プログラムファイルを読み込むこと) すらできません。
機能がないというよりも、もともとは Web ブラウザ上での動作を想定していなかった Prolog インタプリター実装を動作させているので、`consult()` をはじめとした、入出力を伴う述語は、例外を発生させてクラッシュすることでしょう。

Prolog の学習用であれば、もう随分と昔から、そして今でも、[ideone.com](https://ideone.com/) などのような、インターネット上で Web ブラウザ経由で利用可能なオンライン環境が既にあります。

ということで、今日現在の "Prolog on Browser" は、技術実証としては面白いとは思いますが、実用は難しいことでしょう。

いっぽうで、"Prolog on Browser" を立ち上げた私本人ですが、他にもあれやこれやと手を広げすぎていて、この "Prolog on Browser" サイトのテコ入れに十分な時間を確保できませんw 😅

ということで、もしも物好きな方がいらっしゃれば、この "Prolog on Browser" を**ぜひ fork** していただき、ご自身でサイトを立て、**「Web ブラウザ上で動く Prolog の対話環境 (REPL) サイト」を実用的なレベルにまでご自身で育ててみる**のはいかがでしょうか。

"Prolog on Browser" のソースコード一式は基本的に C# (と HTML, CSS, 少々の JavaScript など) から出来ていて、下記 GitHub リポジトリにて、MIT License で公開しています。

- https://github.com/jsakamoto/prolog-on-browser

[.NET SDK](https://dotnet.microsoft.com/download) さえインストールされていれば OS 問わず、以下のコマンド実行で上記 Git リポジトリを clone して手元のローカル環境で実行できます。

```shell
$ git clone https://github.com/jsakamoto/Prolog-on-Browser.git
...
$ cd Prolog-on-Browser/PrologOnBrowser 
$ dotnet watch run
```
テキストエディタに Visual Studio Code を使えば、Ctrl+Shift+B でビルド、F5 で実行されるように構成済みです。

ということで、**"Prolog on Browser" の未来**は、~~物好き~~**高潔なる有志の方に託したい**と思います! 😁

# 余談

実は自分、Prolog プログラミングは、ほとんどできません 😱
Prolog でサクサクとプログラム書けるようになったらかっこいいのでは? と思っているのですが、挫折してばかりです。

_Learn, Practice, Share!_