記事公開時(2026年6月3日)、どういう訳かTau Prologの公式サイトにつながりません。
Wayback Machineを使えばマニュアルを見る事は出来ますが、公式サイトからjsファイルを落とすことは出来ません。Githubの公式リポジトリを参照してください。
また、Tau Prologの今後の開発状況には注意を払う必要があるかもしれません。
Tau Prologとは
Tau Prologとは論理型言語PrologのJavaScript実装です。
なぜTau Prologを使用するのか
Prologで作りたいGUIソフトを思いついた事がきっかけでした。最初はXPCEというSWI PrologのネイティブGUIライブラリを使用するつもりでした。しかしユーザガイドを読み進めてみるとなんだか微妙......Prologの書き方ではありますが、論理型の理念に基づいていないのです。そもそも論理型との相性が悪そうな分野なので仕方ないのでしょう。以下に紹介ページとユーザガイドを貼っておきます。
XPCE: the SWI-Prolog native GUI library
Programming in XPCE/Prolog
そこまでしてProlog内で完結させなくてもなー、と思いWebアプリ化する事にしました。一部の処理をPrologに任せる感じです。そこで見つけたのがTau Prologでした。以下はそれぞれ公式サイトとリポジトリです。
Tau Prolog: A Prolog interpreter in JavaScript
GitHub - tau-prolog/tau-prolog
とりあえず使ってみる
Tau Prologの公式サイトのGet startedボタンから簡易的なチュートリアルに飛べます。今回はその内容から特に重要そうな所を追っていきたいと思います。
ファイルのダウンロード
- サイト上部のDownloadsを選択しダウンロード画面に移る
- 必要な部分にチェックを入れる(本記事ではNode.jsは使用しない)
- Downloadをクリック
- 生成されたtau-prolog.jsが別タブで出される
- .jsファイルをプロジェクトのディレクトリなどに保存(
Ctrl-sで保存すると楽)
また、リポジトリのmodulesのところから必要な物を選んでダウンロードする事も出来ます。
ロードする
以下の様に指定します。
<script type="text/javascript" src="tau-prolog.js"></script>
ロード確認用htmlファイルの全文は以下の様になりました。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Tau Prolog test</title>
<script type="text/javascript" src="tau-prolog.js"></script>
</head>
<body>
<h1>Tau Prolog test</h1>
</body>
</html>
リポジトリから必要なモジュールをとってきた場合は、そのjsファイルをひとつひとつ読み込めば良い様です。但し、その場合はcore.jsを始めに読み込む必要があります。以下は例。
<script type="text/javascript" src="tau-prolog/core.js"></script>
<script type="text/javascript" src="tau-prolog/lists.js"></script>
セッション
セッション指向
Tau Prolog は セッション指向です。セッションとは、複数のプログラムやモジュールを解析・読み込みしたり、ゴールやクエリを送信したりするための単位です。新しいセッションを作成するために、pl.create関数があります。
pl.create
var session = pl.create();
pl.create関数は、新しいセッションを作り、オプション引数として limitを受け取ることができます。limitは、インタプリタが実行できる 解決ステップ(resolution steps) の最大数を制限するものです。
インタプリタがnullを返した場合、limitに達したが、まだ解が見つからなかった、という事を意味します。同じクエリを繰り返すと、Tau Prologはnullを返した地点(choice point)から探索を再開します。デフォルトの limit は 1000 です。
まとめ
以上、公式の簡易チュートリアルから大事そうな場所を確認していきました。下書きのまま放置していたせいで、本当に需要の無い記事になってしまったかもしれませんが、今後はより詳しい使い方を確認しながら、サンプルを作っていこうと思っています。
