論理的な思考能力が発現し、Prologに関心を抱くお年頃

前々から私は「NLPが好きだ、NLPと結婚したい、いや、むしろNLPになりたい!」みたいなことを言っていました。そしてPrologという言語は、NLPを行うために作られた言語らしいです。しかし私にとってPrologNLPは、今のところ関係ありません。と言いますのも、NLPとは全く別の興味で、Prologをはじめてみました。まだよく理解していない部分も多いのですが、間違いなくおもしろいです。


「手続き型」「ナントカ指向」「関数型」などではなく、「論理型」と呼ばれています。他の言語でバックトラックの機能を持ったものを知らないのですが、少なくともPrologが本家なのでしょう。最初のうちは思いついたアルゴリズムを、再帰を用いたコードにするのが難しいと感じますが、慣れてくると、むしろ自分の思考がPrologに近寄るのだと思います。私はそんな境地にはまだ程遠いけど。

サンプルコード

ユークリッドの互除法のコードを紹介しておこうと思います。以下に示すのは、再帰的に2数の最大公約数を求めるアルゴリズムの完全なソースコードです。ちなみにGCDとはGreatest Common Measure、すなわち最大公約数のことだそうです。

コード
% euclid 

% 節1
% XとXの最大公約数はXである
 gcd(X,X,X).

% 節2
% X>Y, X1 = X-Y, X1とYの最大公約数がZならば、XとYの最大公約数はZである。
 gcd(X,Y,Z) :-
	 X > Y,
	 X1 is X - Y,
	 gcd(X1,Y,Z).

% 節3
% Y > X, Y1 = Y-X, XとY1の最大公約数がZならば、XとYの最大公約数はZである。
 gcd(X,Y,Z) :-
	 Y > X,
	 Y1 is Y - X,
	 gcd(X,Y1,Z).
解説

最初の節は終了条件です。XとXの最大公約数はXという意味です。例えば3と3の最大公約数は3です。
次の節は、X > Yだった場合の再帰です。
最後の節は、X < Yだった場合の再帰です。

簡単な文法

  • コメントは%から始まる
  • ピリオドで文末
  • 全ての文は真か偽かで評価される
  • カンマは論理積
変数について
  • prologの変数は、数学の変数と同じで、特定の値に対する記号である
  • gcd(21,14,X). と入力した場合、これに当てはまるXを探し、見つかったら真となる
ソースファイルについて
  • 拡張子はpl
  • hoge.plというファイルを読み込む場合、[hoge]. と打つ