kprolog K-Prolog Compiler Version 6.0

プログラム

Prolog言語のプログラムは一般に読取り項の列から成ります。 プログラムを構成する読取り項の列はファイルに作成し、 それをインタプリタに読み込ませることによって実行できるようになります。 また、コンパイルしてロードモジュールに組み込むこともできます。

プログラムのファイルに書くものは述語の定義と種々の宣言からなります。 もちろんコメントは任意のところに書けます。

述語の定義

述語とは、実際の計算アルゴリズムを記述する単位で、 節と呼ばれる形式の項を並べたものです。 述語にはこの他に組込み述語外部述語があります。
    節.
    節.
    ・
    ・
    ・
  節は、頭部本体部からなり、
    頭部 :- 本体部.
または、
    頭部.
の形です。
頭部や本体部は、ゴールと呼ばれる項から成ります。 ゴールは複合項 またはアトムです。頭部は1つのゴールから成り、 1つの述語を構成する節の頭部は同じ名前アリティを持ちます。 これらを述語の名前やアリティと呼ぶことがあります。 また、ある述語を指定するときに"名前/アリティ"と表記する場合があります。
[例]述語のアリティ

   reverse(X,Y) :- reverse(X,[],Y).
   reverse([],N,N).
   reverse([E|L],M,N) :- reverse(L,[E|M],N).

   これは、reverse/2 と reverse/3の2つの述語の定義です。
名前が同じでも、アリティが違えば異なる述語として扱います。 述語どうしの相対的な位置関係は任意ですが、 述語の中の節の順序はアルゴリズムを記述する上で重要です。 なお、1つの述語の中では節の順序は意味がありますが、節の間に他の述語の 節や宣言が入っていてもかまいません。
[例] 述語の混在

   capital(usa,washington).   population(usa,22000).
   capital(japan,tokyo).      population(japan,11000).
   capital(china,peking).     population(china,118000).
本体部は、ゴールを "," などの制御子 で区切って並べたものです(ゴール列)。 ","でゴールを区切って並べると、ゴールを述語として順に実行することを意味します (関数や手続きを呼び出すことに相当します)。
[例] ","で区切られた本体部を持つ述語

   subset([X|Y],Z) :- member(X,Y),!,subset(Y,Z).
   subset([],Z).

member(X,Y)と ! や subset(Y,Z)はそれぞれゴールです。

本体部のゴールには、述語の呼び出しの形を書きます。 呼び出される述語はそのゴールが実行されるまでに定義されていなければなりません。
上例の2番目の節には本体部がありません。この形の節を単位節と呼ぶことがあ ります。単位節は、true のみを本体部とする節と意味は同じです。true は、 組込み述語で何もしない述語です。

[例]

   subset([],Z).            と
   subset([],Z) :- true.   は意味は同じ。

宣言

宣言とは、プログラムを読み込むとき又はコンパイルするときに 実行されるべき種々の指令のことで、次の形をしています。

	:- 命令.

宣言には、ファイルの中での位置によって意味が異なるものと、 任意の位置に置けるものとがあります。

宣言として使用される命令の代表的なものは、

:- module M. /* モジュール宣言 */
:- public P. /* 公開宣言 */
:- dynamic P. /* 動的宣言 */
:- compile_option(OptionList)./* コンパイルオプション */
:- op(Prio,T,F)./* 演算子宣言 */
:- -File.  /*ファイル組込み宣言 */
:- [File]. /*ファイル組込み宣言 */
です。

モジュール宣言は、プログラムの中の述語のスコープ規則に 関する指定であり、次のモジュール宣言またはファイルの終わりまでに 定義される述語がそのモジュールに所属することを宣言しますから、 プログラムの中での位置が重要です。 一つのモジュールには普通、まとまった機能の集まりとなる述語群を記述します。

公開宣言は、指定の述語がモジュールの外から実行できるように するための宣言で、モジュールの中であれば指定の述語の前後どこにでも置けます。 通常は、見やすいようにモジュール宣言の直後か、述語の定義の直前に書きます。

動的宣言はコンパイル時に有効な宣言で、コンパイルされる述 語の中で呼び出されるインタプリトされる述語をコンパイラに通知します。 動的宣言された述語は、コンパイルされるモジュール内に 配置できますが、call/1によってインタプリタを通して実行されます。

コンパイルオプションは コンパイル時に有効で、compile組込み述語と同じオプションリストを指定 できます。

演算子宣言は、指定の記号の演算子としての働きを定義しますから、 その記号が使用されるよりも前に書かれなければなりません。 モジュール宣言の直後に書くのがよいでしょう。

ファイル組込み宣言は、指定のファイルを読み込むことを指示しています。 これもファイルの先頭に書く方が望ましいでしょう。


一つ上に戻る 目次に戻る