prolog言語仕様の一部しか実装していませんが、一応動くものができたので公開してみます。(v10以降の)Node.jsが必要です。github.comPrologとは論理型プログラミング言語の一つです。論理学をプログラミング言語に落とし込んだようなもので、「ある論理式の集合からある論理式が導けるか」みたいなものが判定できます。広げて、(論理式内に自由変数を導入し)「論理式の集合が与えらたとき、その中の各自由変数をどのような項で代入するとゴールとなる論理式が導けるか」というクエリの処理が可能です。Wikipediaの記事が恐ろしいほど詳しいです。使われる処理系としてSWI-Prologがあります。使い方npmパッケージとして公開しています。以下のようにして使えます。以下のようなファイルをrules.plとして保存します。足し算の定義や掛け算の定義、自然数の定義などが書いてあります。nat(X).以下のような形で使用できます。足し算してみたり、掛け算してみたり、自然数の集合を取得してみたり、足し算と掛け算の2つ式を連立方程式としてその解を求めたり、ということをしています。finished実装についてパーサ特にライブラリは使わずに、自分で簡単なものを実装してみました。LR構文解析器などを作っても良かったのですが、比較的文法が単純なことから、正規表現などをつかってゴリゴリやってしまっています。完璧ではないはずです。Applicationのようにして定義しています。次のようなクラスも用意しています。Term[])によって、単一化ができるようになっています(自由変数への項の代入を表すSubstitutionクラスを返します)。メインとなるのがSpaceクラスで、これはルールの集合とファクトの集合です。Goal[])によって、その空間内での探索が始まります。これは基本的には「自由変数から項へのマッピング」の列を返します。...]のようなものを返します。これは無限列になることがしばしばあるため、イテレータを返すようにしています。SWI-PrologなどはDFSですが今回はキューを用いてBFSでやってみています。無限ループに陥るゴールの集合が少し変わります。自分はこちらのほうが直感的な気がします。CLIインターフェイスについては特にユーザーランドのライブラリなどは用いず、Node.jsコアのreadlineモジュールを利用しました。Ctrl-Cのキャプチャなど、案外いろいろなことができます。ユーザーからのインプットを受け取り、次のようなことをします。ファイルの読み込みが要求されたらそのファイルを開いてルールとゴールを追加するクエリ(ゴールの集合)が入力されたらそれに対する答え(自由変数から項へのマッピング)を一つずつ(すべての探索が終了するかCtrl-Cが押されるまで)出力するソースコードこちらで公開しています。なにか質問や疑問、バグなどあれば教えていただけると嬉しいです。特徴まとめAWSを使っている人全員が触ったことがあるであろうS3。(1)リンクホームページfeedレビューのまとめスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。