Prologについて
この記事は Prolog Advent Calendar 2017 の 1日目に急遽書いたものです。
今年も終わりが近づいてますが、Prologについてのアドベントカレンダーがないので作ってみました。
Prologなんていまさら、、、。そんな人も多いと思いますが、結構面白いですよ。
ということで適当に紹介してみます。
たしかに、目新しいことは少ないかも知れませんが、Prologを使ったことある人なら多いハズ。もしよかったら、こんな使い方したゾ。みたいなお話を気軽にカレンダーに書いてくださる心優しい人がいたら嬉しいです。
インストール
brew swi-prolog
apt-get swi-prolog
yum swi-prolog
などでインストールできます。
hello world
% hello.pl
:- writeln('hello world'),halt.
$ swipl hello.pl
こんなので動きます。
意外とHaskellっぽい
述語は並べて書けるあたりはHaskellっぽさがあります。
fib(0,0).
fib(1,1).
fib(N,R) :- N1 is N-1,N2 is N-2, fib(N1,R1),fib(N2,R2), R is R1 + R2.
:- fib(10,R),writeln(R),halt.
ネストした関数は書けませんけど、いいんですw
言語作ってみよう。
PrologをつかえばDSLで以下のように簡単に言語が作れます:
eval(I,I) :- integer(I).
eval(A+B,R) :- eval(A,A_),eval(B,B_), R is A_ + B_.
eval(A-B,R) :- eval(A,A_),eval(B,B_), R is A_ - B_.
eval(A*B,R) :- eval(A,A_),eval(B,B_), R is A_ * B_.
:- eval(1+2*3,R),writeln(R),halt.
こんなので作れてしまいます。楽ちん!
リストも使えるぞ
リストの値を2倍にする:
add(A,B) :- B is A * 2.
:- maplist(add,[1,2,3,4,5],R),writeln(R),halt.
普通にmapがあります。
[2,4,6,8,10]
最近のSWI-Prologなら無名の述語も使える
:- maplist([A,B]>>B is A * 2,[1,2,3,4,5],R),writeln(R),halt.
こんなふうに書くこともできます。
Prologを作ってる人がけっこう熱い。
O-Prologはインタプリタだったのですが、コンパイラが作っているそうです。
自分も負けずと、OCamlでPrologを作ってみています。
Ubuntu 17.04
sudo add-apt-repository ppa:h-sakurai/gdis-prolog
sudo apt-get update
sudo apt install gdispl
などでインストールして使えます。
まとめ
簡単にPrologを紹介してみました。