Prolog 写経記 まとめ

そんなわけで (どんなわけで?),無事に写経を終えたわけなので,簡単にまとめを.
まず,いい意味で一番衝撃だったのはこれ.

delete(X, List1, List2) :-
	conc(L1, [X|L2], List1),
	conc(L1, L2, List2).

リスト List1 から要素 X を削除するのですが,それをリストの連結でやってしまうというこの定義.
宣言的っていうのはこういうことか!?
という衝撃を受けましたねぇ.うーん,これには本当にびっくりした.


もう一つ挙げるなら,先日写経したばかりのこれ.

:- op(900, fx, if).
:- op(850, xfx, then).
:- op(800, xfx, else).
if P then Q :-
	if_then_else(
		Q = (R else S),
		if_then_else(P, R, S),
		if_then(P, Q)).

if_then(P, Q) :-
	call(P), !,
	call(Q).
if_then(_, _).

if_then_else(P, Q, _) :-
	call(P), !,
	call(Q).
if_then_else(_, _, R) :-
	call(R).

これは全然宣言的じゃないのですが,ずっと「Prolog って不自由だなぁ」と思っていた自分の認識が間違っていて,アイディア次第でいくらでも強力なことができるんじゃないかと考え直すきっかけになりました.


一方で激しく落胆したのはこれ.

random(Min, Max, Num) :-
	integer(Min),
	integer(Max),
	Min =< Max,
	retract(seed(S)),
	Num is S mod (Max - Min + 1) + Min,
	NewSeed is (125 * S +1) mod 4096,
	asserta(seed(NewSeed)), !.

seed(7).

Prolog データベースをグローバル変数のように使ってしまうというこのコードには本当に落胆しました.
Prolog ではこういうことが一般的だとか不可避なのであれば,Prolog なんて捨ててもいいかなと思ったくらい.
逆に,Prolog でもっとうまく乱数を扱うにはどうすればいいのか,いろいろ考えるきっかけになったので違う意味ではありがたい存在だったかも.
この乱数についてはエントリを改めて書いてみたいと思います.


ともあれ (JW),お世話になりました>「Prolog ユーティリティライブラリ (isbn:4303717002)」