MINERVA superseeded IF/Prolog.
Please see
http://www.ifcomputer.co.jp/MINERVA
for details.
We discontinued to sell IF/Prolog Dec 31. 2003.
For current customers, we continue to provide
professional support for IF/Prolog until Dec 31, 2008.
一般的に、モジュールのボディには、モジュールの機能の実装に必要な任意の述語定義を含めることができます。モジュールが他のモジュールを参照するときの方法に影響を与える、ボディ内でだけ現われることができるような指令もいくつかあります。これらがどのように働くのかを理解するためには、アトムの参照がどうのようにモジュールに割り当てられるのかを考慮する必要があります。
もし、モジュールがある関数子を述語として定義しているならば、この関数子に対するすべての参照は、現在のモジュール名によって修飾されているかのように、自動的にローカルとして考えられます。もちろん、もしそうしたいなら、commonや他のモジュール名によって修飾することもでき、その場合はこれが優先されます。その他のすべての関数子に対する参照は、commonで修飾されているかのように、大域的名前空間を参照しているものとされます。これも、特定のモジュール名あるいは現在のモジュールを意味するselfという特別な名前で修飾することができます。
デフォルトの名前付けルールが不便である2つのケースのためにそれぞれ指令があります。モジュールの実装が、他のモジュールで定義された述語を利用することがあります。これは、モジュールボディに、以下の指令を含むことによって可能になります。
?- import(foo2).
これにより、モジュールfoo2からエキスポートされるすべての述語が、現在のモジュールで利用でき、修飾せずに参照することができます(commonを参照するのと同様のルールです)。これの別の形として、他の述語のサブセットをインポートするためのものがあります。
?- import(foo2,[bar/1, bar/2]).
デフォルトの名前付けのもう一つの例外は、モジュールがローカルな「データ」を使っている場合です。つまり、ここでのローカルな「データ」とは、述語ではないがモジュールに対してローカルで外部からアクセスできない関数子です。
?- hidden([Local_bar/4]).
上の指令は、local_bar/4への参照を、モジュール全体を通してselfで修飾されているかのように、ローカルなものに強制します。
もちろん、オペレータ指令は、モジュールヘッドだけではなく、モジュールボディにあらわれても構いません。この場合、オペレータの定義はエキスポートされず、モジュールのボディの構文解析のためだけに使われます。
モジュールボディは、
?- predicate([bar/1, bar/2]).
のようにして、関数子を述語として明示的に定義をすることも可能です。
これにはいくつかの効果があります。第1に、このようにして指定した関数子は、上で述べたようなモジュールにおける名前の決定の際、ローカルな述語の名前であると考えることができます。 第2に、述語の節がない場合でも、述語はもはや「未定義」の状態ではありません。ですから、節がない述語が呼び出された場合に生じる例外処理は起こらず、呼び出しが単に失敗するだけです。第3に、コンパイラは述語を動的なものとして扱うので、assertやretractでの修正が可能です。これら効果を持つので、指令predicateは、修正可能なデータベースとして使われるであろうローカルな述語を導入するために使用します。
|