速いダイナミック述語
ダイナミック述語(dynamic、asserta、assertz、retractを参照してください)は、賢いインデクシングをするように実装されています。
ダイナミック述語を多く利用する顧客アプリケーションでは、MINERVAの今までのバージョンに比して2桁のパフォーマンス増加を達成しました。
MINERVAにおけるインデクシングについて: インデクシングは、リニアから一定時間に、指数時間から対数時間まで、データ集合へのアクセス速度をあげるいろいろな方法に対する一般的な言葉です。
MINERVAにおいては、3種類のデータがあります: コンパイルされた述語、ダイナミック述語と黒板です。
コンパイルされた述語の場合、「最初の引数インデクシング」が最初の引数が変数でない述語の集合のために使われます。 インデクシングは、述語の関数子とアリティおよび最初の引数の関数子について作用します。より深い項の部分については使われません。
ダイナミック述語では、MINERVAが価値があるとみなすときはいつでも、変数として決してアサートされない全ての引き数に対して「賢いインデクシング」がされます。 インデクシングは述語の関数子とアリティと、目標とされた引き数の関数子とに関して働きます、項のより深い部分は使われません。
黒板で保存されるデータの場合、「徹底的なインデクシング」はキーに対して行われます: より深い部分を含む全部の項が、インデクシングのための材料として使われます。
プログラミングのヒント:
1) インデクシングは、「変数ではない」データ・セットのために行われます。つまり重要な場所にある変数に対して作動されません。 以下のようなものをインデクシングすることによって:
a(1).
a(2).
a(X) :- X = undetermined. % catch-all case
スピードアップにはつながりません。 これは悪い例です。
2) インデクシングされたデータ・セットへのアクセスは、キーが実際に使われる時のみ速くなります。 以下を比較してください:
Data:
male(eric).
male(健太郎).
:
female(美香).
female(sonya).
:
Program:
% GOOD % BAD
?- male(charles). ?- male(X), X = 薫.