kprolog K-Prolog Compiler Version 6.0

入口点定義ファイル

入口点定義ファイルは、入口点定義の列から成ります。入口点定義は、 次のいずれかの形の行です。
{bool} 関数名(引数型、引数型、…).
C言語の関数をPrologの述語から使用するために その関数名と引数の型を定義します。
{bool} 関数名.
引数を持たないC言語の関数をPrologの述語から使用するために 関数名を定義します。
-関数名(引数型、引数型、…).
C言語の関数から呼び出されるPrologの述語を定義します。
-関数名.
C言語の関数から呼び出される引数を持たないPrologの述語を定義します。
引数型は最大40個まで指定できます。

これらの行は、Prolog の項として読まれますから、 関数名に使用できる文字には制限があります。 関数名がそのままではアトムとして認識されない場合は、' で囲って 引用アトムにして下さい。

[例]
   '_exit'(int).

関数名の前に bool を書いた場合は、関数値の非0/0 に 従って述語を成功/失敗させることを指示します。無指定の場合、 述語は出力引数の単一化が成功する限り、関数値によらず成功します。


C言語関数の引数型の指定

引数型としては下表の型が指定できます。

ここで、'入力'とは、Cの関数の入口で値を持っている引数です。
'出力'とは、ポインタを渡すことにより、値を返してくる引数です。
'配列'とは、ポインタを渡すことにより値を渡し、または返してくる引数で す。
限界指定を指定した場合、実行時に引数が変数である時には、 指定の限界の大きさの配列と対応する複合項が作られます。 無指定の時は実行時に複合項のアリティで決定します。
返値限界指定とは、限界指定の一般形で引数として渡した配列のうち、使用 した部分の大きさを整数出力で返してくる場合に有効で、結果として配列の 使用した部分に対応する複合項が作られます。

文字列出力、漢字列出力は、それぞれCの関数にバッファのポインタを渡し、 そのなかに書き込まれた文字列を返すものです。漢字列は漢字コードを含む文字 列と考えますが、長さは漢字としての文字数です。

文字列入力、漢字列入力の長さに限界はありません。 文字列入力、漢字列入力は、Prologの文字列を C言語の文字列に変換した結果へのポインタを渡します。

任意型は、実行時に型を指定するもので、 int(式)、float(式)、char(文字列)、kanji(漢字列)に対し、それぞれ、 入力のときは int、float、[char]、[kanji]、 出力のときは *int、*float、*char、*kanjiとして扱います。 任意型出力の引数には、引数ごとに実行時に512バイトのバッファが確保されています。 バッファの容量を定義時に明示的に指定することもできます。任意型には、配列は用意されていません。

項型を指定すると、Prologの項そのものを扱うことができます。 入力の場合はC言語の関数に項がわたります。出力の場合、 引数に代入された項をProlog言語側の引数と単一化します。 項をC言語の関数の中で扱うためのAPIが提供されています。

浮動小数点数は、配列の場合は単精度、配列でない場合は倍精度で扱います。 一般に、引数はC言語の関数に渡される時に値が評価され、 Prolog に返ってきた時に、単一化で値を結びつけます。
表の中で、Nは2次元配列の2番目の限界を表す整数、 I、Jは配列限界を表す整数、または整数式、 または~K(Kは整数)の形です。~Kのとき、Kは引数番号で、 その引数の内容が配列限界とみなされます。Kとして指定する引き数は、Kを 参照する引き数よりも前になければなりません。 Sは整数でバッファ容量のバイトサイズを指定するものです。


int
整数入力
*int
整数出力
[int]
整数配列(1次元)
[int]/[I]
整数配列(1次元限界指定付)
[int][I,J]
整数配列(1次元返値限界指定付)
[int(N)]
整数配列(2次元)
[int(N)]/[I]
整数配列(2次元限界指定付)
[int(N)]/[I,J]
整数配列(2次元返値限界指定付)
float
浮動小数点入力
*float
浮動小数点出力
[float]
浮動小数点配列(1次元)
[float]/[I]
浮動小数点配列(2次元)
[float]/[I,J]
浮動小数点配列(1次元限界指定付)
[float(N)]
浮動小数点配列(1次元返値限界指定付)
[float(N)]/[I]
浮動小数点配列(2次元限界指定付)
[float(N)]/[I,J]
浮動小数点配列(2次元返値限界指定付)
*char
文字列出力(511バイトまで)
*char/[I]
最大長指定付文字列出力
*char/[I,J]
最大、内容長指定付文字列出力
[char]
文字列入力
[*char]
文字列入力配列
*kanji
漢字列出力
*kanji/[I]
最大長指定付漢字列出力
*kanji/[I,J]
最大、内容長指定付漢字列出力
[kanji]
漢字列入力
[*kanji]
漢字列入力配列
*
ポインタ入力
*(*)
ポインタ出力
?
任意型入力
*(?)
任意型出力
*(?)/S
容量指定付任意型出力
term
項入力
*term
項出力


Prolog述語の引数型の指定

引数型としては下表の型が指定できます。

ここで、'入力'とは、Cの関数からPrologの述語に値を渡すべき引数です。
'出力'とは、Prologの述語が値を返してくる引数です。
配列の場合、配列限界を指定しない時は2が仮定されます。

対応するPrologの述語が呼び出されるとき、 入力に当たる引数はPrologの項に変換されて述語の引数と単一化されます。 出力にあたる引数は変数のままです。 述語は決定的に実行され、 成功したならば出力にあたる引数をC言語の表現に変換したのち、

を関数の引数の示す領域に格納します。 後者の場合、配列などの内容は次のC言語インタフェースの使用までの 間だけ有効ですからインタフェースを呼び出した関数はなるべく早い機会に 内容を確保しなければなりません。 インタフェース関数の関数値は述語の成功/失敗に従って非0/0です。


int
整数入力
*int
整数出力
[int]/[I]
整数配列入力(1次元限界指定付)
[int(N)]/[I]
整数配列入力(2次元限界指定付)
*[int]
1次元整数配列出力
*[int(N)]
2次元整数配列出力
float
浮動小数点入力
*float
浮動小数点出力
[float]/[I]
浮動小数点配列入力(1次元限界指定付)
[float(N)]/[I]
浮動小数点配列入力(2次元限界指定付)
*[float]
1次元浮動小数点配列出力
*[float(N)]
2次元浮動小数点配列出力
[char]
文字列入力
*[char]
文字列出力
[kanji]
漢字列入力
*[kanji]
漢字列出力
*
ポインタ入力
*(*)
ポインタ出力
term


一つ上に戻る 目次に戻る