知識情報処理演習の補足説明

						April 6, 2021
						Kazuko TAKAHASHI

Prolog は論理型言語であり,論理式をそのまま記述します.
以下に例を示します.
C のような手続き型言語や Java のようなオブジェクト指向言語とは
まったく異なる形をしていることがわかると思います.
この言語には if も for もありませんが,これらの機能は実現されています.

[プログラム例]

以下の例ではわかりやすくするために記述文法を少し変えています.
<- は「右辺ならば左辺」,& は「かつ」の意味です.

% [1] X,Y が祖先と子孫の関係になっているかを調べるプログラム
%      hijisan は tarao の祖先でもある

ancestor(X,Y) <- parent(X,Y).             
     % X が Y の親ならば X は Y の祖先である
ancestor(X,Y) <- parent(X,Z) & ancestor(Z,Y).
     % X が Z の親でかつ Z が Y の祖先ならば X は Y の祖先である

parent(hijisan,namihei).  % hijisan は namihei の親である
parent(namihei,sazae).
parent(fune,sazae).
parent(sazae,tarao).

% [2] 0 から N までの自然数の和 Total を求めるプログラム

sum(0,0).  
sum(N,Total) <- sum(N-1,SubTotal) & Total=SubTotal+N.

% [3] N 枚の円板をもつハノイの塔
%   引数の意味は以下の通り
%    1.何番目に大きな円板か  2.移動元の棒  3.移動先の棒  4.関係ない棒
%     5.移動順序  6.移動の履歴(スタック)
%   [H|T] は頭部が H,尾部が T のリスト構造を表す

hanoi-go(P) <- hanoi(3,a,b,c,P,[]).  % 3枚の場合の実行,P に解が得られる

hanoi(1,A,B,C,[to(A,B)|Zs],Zs).
hanoi(N,A,B,C,Xs,Zs) <-
  N>1 & N1=N-1 &
  hanoi(N1,A,C,B,Xs,[to(A,B)|Ys]) & 
  hanoi(N1,C,B,A,Ys,Zs).

[演習の特徴]

プログラミング演習のようにたくさんの問題を教科書を参考にして解くという
形ではありません.
演習で行うプログラムは数も少なく短いものが多いですが,
動作を理解していないとたった2行のプログラムでもまったく書けません.
プログラミング演習で自分の書いたプログラムの動きが追えなかった人には
非常につらいものになります.
逆に C や Java は苦手だった人でも Prolog と相性のよい人は結構います.

2項関係,再帰,リスト,単一化,後戻り(backtrack)など
情報科学やプログラミングで必要な基本概念が
実際に手を動かすことで非常によく理解できます.
論理回路,数理論理学,離散数理などが好きな人には
非常におもしろく感じられると言語だと思います.