2007年9月24日月曜日

Prolog入門.結構忘れてるなぁ.

Prologをさわりたくなったから,やってみたってかんじなんだけど,研究のほうでもPrologのソース読まなきゃならなそうだから,リハビリもかねてるw

そのPrologって言語の解説は,エントリ末尾の参考文献などでどうぞ♪(ぉ

処理系は,MacPortsで,GNU Prologをインストール.
$ sudo port -c install gprolog


とりあえず,起動,Hello, world!,終了の手順.
$ gprolog
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- write('Hello, world!').(write述語をつかって,標準出力への出力を行う.)
Hello, world!(出力された♪)

yes(成功ってな意味.)
| ?- halt.(halt述語で終了させる.)
$


まずは,階乗を計算するプログラム.再帰再帰♪
/* factorial.pl */
factorial(0, 1).
factorial(X, Y) :- X > 0, X1 is X - 1, factorial(X1, Y1), Y is Y1 * X.


はい,2行!かなり簡潔.その意味は,
/* factorial.pl */
0!は1である.
X!はYである.このことは.X > 0,X1 = X - 1,X1! = Y1とすると,Y = Y1 * Xと置き換えられる.

というかんじ.

実行結果は次のとおり.
$ gprolog
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- ['factorial.pl'].
compiling /Users/takuya/Documents/Programming/Prolog/factorial.pl for byte code...
/Users/takuya/Documents/Programming/Prolog/factorial.pl compiled, 3 lines read - 926 bytes written, 14 ms

(1 ms) yes
| ?- factorial(10, X).

X = 3628800 ?

yes
| ?- halt.
$


そして,例によってFizzBuzz.ただ書いてもおもしろくないから,どんなふうに思考して作ったかを書いていく.

まず,最初に1から100までただ数字を出力するプログラムを書いてみた.
/* fizzbuzz.pl */
fizzbuzz :- fizzbuzz(1).
fizzbuzz(101).
fizzbuzz(N) :- write(N), nl, N1 is N + 1, fizzbuzz(N1).


これは,いたって簡単.あとは,3と5で割りきれるときにFizzBuzz,3で割りきれるときにFizz,5で割りきれるときにBuzz,そうでないときに数字を出力するようにすればいいので,次のようになる.
/* fizzbuzz.pl */
fizzbuzz :- fizzbuzz(1).
fizzbuzz(101).
fizzbuzz(N) :- N mod 3 =:= 0, N mod 5 =:= 0,
write('FizzBuzz'), nl, N1 is N + 1, fizzbuzz(N1).
fizzbuzz(N) :- N mod 3 =:= 0,
write('Fizz'), nl, N1 is N + 1, fizzbuzz(N1).
fizzbuzz(N) :- N mod 5 =:= 0,
write('Buzz'), nl, N1 is N + 1, fizzbuzz(N1).
fizzbuzz(N) :- N mod 3 =\= 0, N mod 5 =\= 0,
write(N), nl, N1 is N + 1, fizzbuzz(N1).


実行結果は省略ね.

もっとクールな方法がありそうだけど,だいたいこんなかんじ.いきおいで書けば,とりあえず動くwこの思考プロセスを楽しいと感じた人は,ぜひPrologなどの宣言型言語をやってみてほしい.それにしても,ぜんぜん入門じゃないねw

参考文献:
http://www.geocities.jp/m_hiroi/

0 件のコメント: