GDIS Prolog はコンパクトであることを目標にした Prolog インタプリンタです。
GDIS とは Goals Database Index Stack の略です。 インタプリタはゴール、データベース、インデックス、スタックの状態マシンとして構築されています。
実装は非常にコンパクトですが、小さいながらも、インストールして気軽に使うことが出来ます。
他の言語の作成にコントリビューションする際の、ドキュメントの整備や、貢献の仕方なども分かりやすくまとめたいと思います。
VSCode プラグインを作るのも目標の1つです。簡単なPrologのプログラムをデバッグできれば便利なはずです。
- 小さなプログラム
- OCaml による綺麗な実装
- OCamlYacc による構文解析と下降型演算子順位法によるユーザー定義演算子
Ubuntu 17.04
sudo add-apt-repository ppa:h-sakurai/gdis-prolog
sudo apt-get update
sudo apt install gdispl
source build
apt install ocaml
make
sudo make install_
examples/hello.pl
:- writeln('hello world'),halt.
gdispl examples/hello.pl
hello world
sudo make uninstall
- 久しぶりにバージョンだけ変更
- 18.04で登録できたら嬉しい
- 挙動おかしいところのバグFix
- アリティ/0のcall呼び出しが失敗するバグの対策。
- couslut/2の呼び出しのProlog化を進めた。
\/1
を\+/1
に修正。- current_predicate/1 を追加。
- cousult/2 は current_predicate/1 を使って
macro_run/1
があったらmacro_run/1
を呼ぶように変更。 - 組み込み述語のテーブルのリファレンスを使って拡張するように書き換え。
- opconvert/2 を追加。
- consult/2の組み込み述語をread/2 と述語 consult/2 に分離する。
- repeatのバグ修正
todo 以下の挙動がおかしい
- :- A =.. B, writeln(B).
- パーサのリファクタリング
- prolog.ml は vm.ml と vm_builtin.ml の2つに分割しました。
- db.ml を vm_db.ml に変更しました。
- デバッガ実装に備えて、stepは1ステップだけ実行するようにしました。
- consult/2をステップ実行可能にするために書き換えています。
goal_expansion
をexpand_term
述語で呼び出すようにしました。
- コメントアウトされていたテストコードをマクロを使ったものに書き換えました。
- リファクタリング
- =../2 (univ) を追加
- goal_expansion/2 を追加
- rtg.pl を追加
- append/3 を追加
- var/1 を追加
- foldl のバグ修正
- DB登録時のバグ修正(copy_termを登録時にするようにしてレベルを下げた)
-
term_expansion/2 マクロを以下のように使うことができるようになりました:
:- op(1200,xfx,--). term_expansion(A--B,B:-A). integer(I) --%---------- (E-Int) eval(I,I). eval(E1,I1), eval(E2,I2), I is I1+I2 --%------------------------------------- (E-Int) eval(E1+E2,I). :- eval(1+2+3,R),writeln(R). :- halt.
-
ユーザー定義演算子をop/3 で以下のように定義して使うことができるようになりました:
:- op(600,xfy,add). :- op(500,xfy,mul). eval(I,I) :- integer(I). eval(A add B, I) :- eval(A,A_),eval(B,B_), I is A_ + B_. eval(A mul B, I) :- eval(A,A_),eval(B,B_), I is A_ * B_. :- eval(1 mul 2 add 3 add 4 mul 5,I),writeln(I),halt.
以下のコマンドで試してみることが出来ます:
$ gdispl examples/op.pl 25
-
-v オプションで以下のようにバージョン情報の表示をするようになりました:
$ gdispl -v GDIS Prolog version 0.1.2
-
--help オプションのヘルプ表示は以下のようにアラインを合わせて綺麗に表示するようになりました:
$ gdispl --help Usage: gdispl [options] file... Options: -t Set trace mode -v Display version infomation -lib libpath Set libraries path -help Display this list of options --help Display this list of options
- 演算子の優先順位を変更可能にするために独自拡張機能を一旦なくしました。
- 構文解析は1文ごとに処理して、リストを返さなくしました。
- パーサは演算子の組み換えができる構造に変わりました。
Ubuntu 17.04 で以下のコマンドでインストールできるようになりました。
sudo add-apt-repository ppa:h-sakurai/gdis-prolog
sudo apt-get update
sudo apt install gdispl
- PPA 登録テスト
- PPA 登録テスト
- 複数の:-/1述語で問題なく動作するように
- nop/0 を true/0 に変更
- forall/2 を追加
- reverse/2 を追加
- retract/1 を追加
- asserta/1 を追加
- retractall/1 を追加
- リスト表示バグ修正
- '\'/1 を追加
- リストのライブラリを追加
- member/2 を追加
- call/1 を追加
- maplist/2,maplist/3,maplist/4 を追加
- foldl/4 を追加
- GDIS Prolog 仕様 を追加
- ライブラリリファレンス を追加
- README を修正
- examples/eval3.pl を修正
- examples/lambda.pl を追加
- docs/README.md にBNF定義を追加
- testファイルを追加
- 空白行が続いた時の構文解析の仕様変更
- README を修正
- Scala版とProlog版をlabディレクトリに移動
- test ディレクトリ名を examples に変更
- examples/eval3.pl を修正
- make install make uninstall を追加しました。
- OCaml版を正式に採用することにしてディレクトリ配置を変更しました。
- TODOリストはissue listに移動させました。
- develop ブランチを切ってそちらで開発を進めてから、masterにmergeすることにしました。
- 久しぶりに更新。 integer/1 述語を追加しました。
- バージョン管理するようにしました。
MIT License