MINERVAのパッケージ機構は、大規模なプログラムの構築の際に 開発者が余分な努力をすることなく、以下を達成できる メカニズムを提供しています。
プログラムの大規模化、複数のプログラマによる共同開発、メンテナンスの必要性 及びソフトウェアエンジニアリング手法により、 プログラムを管理可能な独立性の高いモジュールに分けることが望まれています。
MINERVAは、複数の異なるネームスペースの提供および知的なロードスキーマにより これを可能にしています。MINERVAでは、動的にロード可能なモジュールを 実装し、かつコンパイラによる厳格で静的なチェックを行なっています。
これにより、小さく、迅速にロードされ、かつ、頑健性の高いプログラムの作成が 可能になりました。
MINERVAコンパイラminervacは、各*.minのMINERVAソースファイルに対して、 モジュールインタフェース仕様を持つ *.mpk MINERVAパッケージファイルと、 *.mbc MINERVAバイナリコードファイルの二つのファイルを生成します。
プログラムは、指令packageにより他のパッケージにアクセス することができます。
そのプログラムで定義されていず、packageの指令によりアクセス 可能ではない述語が明確に呼び出された場合、 コンパイラは、エラーメッセージを出します。
デフォルトでは、プログラムはすべての述語をエクスポートします。
アンダスコア('_')によって始まる述語は、*.mpkファイルには エクスポートされません。このため、他のパッケージからは アクセスできません。
同じ名前/アリティを有する述語がいくつかのパッケージから エクスポートされると、最初にロードされたパッケージの述語のみが呼び出され、 他のパッケージの述語は隠されます。
パッケージは、ディレクトリの中で探索され、それから minervaの-spパラメータで与えられたシーケンスに応じて 探索されます。
複数回関連付けられたパッケージも、一度しかロードされません。
別れているパッケージのネームスペースは別々になっています。
"aaa"のパッケージはaaa/1、aaa1/1, aaa2/1をエクスポートしますが、 _aaa3/3はエクスポートしません。
% file: aaa.min"bbb"のパッケージは、"aaa"からエクスポートされたすべての述語と bbb/1をエクスポートしますが、 _aaa3/3はエクスポートしません。aaa(C) :- aaa1(A), aaa2(B), '_aaa3'(A,B,C).
aaa1(1). aaa2(2).
'_aaa3'(A,B,C) :- C is A + B.
bbb/1の定義は、"bbb"の_aaa3/3を使用しています。"aaa"の_aaa3/3は "bbb"にはアクセス可能ではありません。
% file: bbb.min :- package(aaa)."ccc"は、"bbb"と"bbb"から再帰的に"aaa"をアクセスすることが できます。"ccc"は、aaa/1をエクスポートします。 もし、"ccc"がまずロードされる場合、?- ccc(X)の結果はX=1です。 これは、"aaa"のaaa/1の定義は、"ccc"にはアクセス可能ですが、 "ccc"のaaa/1の定義によって、隠されてしまうためです。bbb(C) :- aaa1(A), aaa2(B), '_aaa3'(A,B,C).
'_aaa3'(_,_,ccc).
% file: ccc.min :- package(bbb).ccc(C) :- aaa(C).
aaa(1).
プログラミングの場合には、以下をお勧めします。