この節では、モジュール化における問題をIF/Prologがどのように解決しているかを説明します。Prologにおける名前付けは、すべてアトムに基づいています。アトムは、述語名、関数名、グローバル変数名として使われます。そこで、IF/Prologでは、アトムが現われる毎に、アトムが属するモジュールと結び付けて考えます。これにより、すべてのアトムの集合(Prologの名前空間)をいくつかの副空間に分割します。異なるモジュールで導入されたアトムが互いに同じ名前を持っていても、モジュールの名前によって区別され、名前の衝突の問題を回避することができます。このことは、Prolog項においては、アトムは同じモジュールに属している時にのみ単一化されることを意味します。
後述するように、多くの場合、アトムを参照するときモジュール名を明示的に指定する必要はありませんが、必要があれば、アトムを以下のように完全に指定することができます。
モジュール名:アトム名
アトム名は、モジュール名により修飾されると言えます。関数、述語呼び出し、定義などのアトムが現われるところでは、どこでも修飾することが可能です。
これによって、共同で作業している複数のプログラマは、衝突のないようにモジュールの名前を選ばなければならなくなるわけですが、これは大きな問題にはなりません。というのも、モジュールの数は、通常比較的少なく、プログラマ達は少なくともモジュールレベルではよく打合せをせざるを得ないはずだからです。
すべてのモジュールでしばしば使用される標準的な述語やシンボルのための特別な名前空間が用意されていますので、これを使用すると便利です。この大域的な空間にあるアトムは、すべてのモジュールで共有され、次のようにして参照することができます。
common:アトム名
もし、このアトムが現在のモジュールで定義されていない場合、あるいは「現在」のモジュールが存在しない場合は、
atomname
と単に書くだけで、この大域的な空間にあるアトムを参照できます。これによって、他の標準的なPrologシステムやIF/Prologの旧バージョンとの互換性を持たせることができます。モジュール名を全く参照しないプログラムは、common空間で動作することになるからです。
以上のことをまとめておきましょう。IF/Prologの名前空間は、「浅い階層(1レベルの深さ)」として構成され、以下のような構造を持っています。
common / | \ / | \ module1....... module2
この階層構造は、common空間にある名前は、自動的に他のモジュールに継承されるが、逆には継承されないという関係を意味しています。以下では、モジュール間での名前の参照と共有に関する他のメカニズムを説明します。
| scroll to top |
|