LoginSignup
5
5

More than 5 years have passed since last update.

Prologについて

Last updated at Posted at 2017-11-30

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のコンパイラ

O-Prologはインタプリタだったのですが、コンパイラが作っているそうです。

GDIS-Prolog

自分も負けずと、OCamlでPrologを作ってみています。

Ubuntu 17.04

sudo add-apt-repository ppa:h-sakurai/gdis-prolog
sudo apt-get update
sudo apt install gdispl

などでインストールして使えます。

まとめ

簡単にPrologを紹介してみました。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5