kprolog K-Prolog Compiler Version 6.0

データベース機能

ヒープ領域への副作用として
アトム×整数 → 値
アトム×項  → 値
の結合ができるデータベース機能です。 利用できるデータベースの構造は
配列
リスト
ハッシュによる集合
Bツリーによる集合
ハッシュによる辞書
Bツリーによる辞書
です。


データベースのイメージ

配列(array)
N個の位置をもつ箱。位置を指定して値を操作する。値の初期値は変数。

リスト(list)
始端、終端と現在位置で値を操作する。順に値を読みとれる。

ハッシュによる集合(hash)
値がランダムに入っている箱。値が入っているかどうかだけがわかる。

Bツリーによる集合(tree)
標準順序でソートされている値の木。値が入っているかどうかは調べられるほか、 順次アクセスをすれば昇順に値を読みとれる。

ハッシュによる辞書(keyedhash)
キーと値の組がランダムに入っている箱。キーを指定して値を読みとれる。

Bツリーによる辞書(keyedtree)
キーと値の組がキーの標準順序でソートされている。 キーを指定して値を読みとれるほか、 順次アクセスをすればキーの昇順で値を読みとれる。

箱や木の大きさは、自動的に適当な大きさに変化します。 データの理論的な容量は、hash,keydhashの場合約39万件、それ以外では無制限です。 実際的にはヒープ領域のサイズが容量を制限します。


データベースの生成と消去

データベースを生成するには  db_create(db名, db属性) を使います。
arrayのとき db_create(db名, array(N))
N要素の配列を用意します。実際には配列に限界はないので、N以上の インデックスでもアクセス可能ですが、極端に大きさが違うと効率が 悪くなります。 配列の添字は整数で0以上の値を指定します。
listのとき db_create(db名,list)
Prologのリストよりもメモリ効率の良いリストを実現します。リ ストは、始端、終端、現在位置の3点でアクセスできます。
hashのとき db_create(db名,hash(N))
Nエントリの閉ハッシュを作ります。ハッシュ表の大きさは再ハッシュ により自動的に変わっていくので、Nとしては表に入れる予定数を適 当に選んでください。
treeのとき db_create(db名,tree(N))
Nエントリの葉を持つBツリーをつくります。葉とは、値を入れるため の小さな箱で、Nとしては6か14が適当な値です。
keyedhashのとき db_create(db名,keyedhash(N))
Nエントリの閉ハッシュによる辞書をつくります。hashと同様に再 ハッシュは自動的に行います。
keyedtreeのとき db_create(db名,keyedtree(N))
Nエントリの葉を持つBツリーによる辞書をつくります。

データベース全体を消すには、 db_abolish(db名) を使います。


値の書き込み

db_put(db名,値)     または、
db_put(db名,キー,値)   で行います。
arrayのとき
キーとして添字を指定します。
listのとき
キーとしてlist_first、list_last 又は list_current を指定します。 値が入るのは、list_first のときリストの始端、 list_last のとき終端で、list_current のとき現在位置の次です。 現在位置は、書き込んだ値のところに移ります。
hashまたはtreeのとき
キーの指定はありません。値がデータベースに格納されます。同じ値があ れば、データベースの中では1つになります。
keyedhashまたはkeyedtreeのとき
キーとして任意の変数でない項を指定できます。データベースの中には、 昇順にソートして格納されます。同じキーがあれば、値のところが書き 換わります(古い値は失われます)。


値の読み取り

db_get(db名,値)      または
db_get(db名,キー,値)  で行います。
arrayのとき
キーとして添字を指定します。
listのとき
キーとして list_first、list_last または list_current を指定します。 それぞれ始端、終端、現在位置のところの値を読みとります。
hashまたはtreeのとき
値のみを指定します。その他がデータベースに格納されていなければ failします。
keyedhashまたはkeyedtreeのとき
指定のキーに対応する値を読みとります。キーがデータベース中に存在し なければ、failします。


値の消去

db_delete(db名,値)    または
db_delete(db名,キー)    で行います。
arrayのとき
キーとして添字を指定します。値を消去した結果、その位置の値は変数になります。
listのとき
キーとして list_first、list_last、list_current を指定します。 それぞれ、始端、終端、現在位置のところの値を消去します。 現在位置のところの値を消去した場合、現在位置は次の位置に移ります(現在位置が終 端と一致しているときは、新しい終端の位置になります)。
hashまたはtreeのとき
値を指定して、その値をデータベース中から消去します。
keyedhashまたはkeyedtree
指定のキーに対応するキーと値の組をデータベースから消去します。


逐次読み取り

データベースの内容を最初から順に全部読み取ることができます。まず、
   db_rewind(db名)
により、データベースの現在位置を先頭に位置づけます。
   db_next(db名,キー,値)
で、データベースのキーと値を後戻りにより1つずつ読み取ります。 現在位置を持つタイプの時は現在位置は次の要素に移ります。
listhashおよび treeのとき
キーは返されません。
array のとき
値が格納されている位置のみ添字の昇順に読み取ります。
list のとき
始端から順に読み取ります。
hash および keyedhash のとき
ランダムに読み取ります。
tree および keyedtree のとき
値またはキーの標準順序による昇順に読み取ります。
[例]

   18: ?- db_rewind(mydb),db_next(mydb,Key,Value).
   Key = asako,
   Value = 111-4567 ;
   Key = hiruko,
   Value = 111-8901 ;
   Key = yoruko,
   Value = 111-2345


その他のユーティリティ

データベースの別名をつくるには、  
   db_reference(db名、別名)
を使います。db名はすでに存在するデータベースがなければなりません。 別名で指定するアトムがdb名の別名となります。別名をつくると、 内容が同一のデータベースについて、現在位置が別々に管理されます。

データベースがどのように定義されているかを知るには、

   db_whatis(db名, db属性)
により、db名を指定して、そのデータベースの属性を知ることができます。

データベース全体をファイルに書き出したり、それを再び読み込むためには、

   db_writeall(db名)
   db_readall(db名)
を使います。 それぞれ現在のファイル出力、ファイル入力に対し、 データベースを適当な項の形で書き出しまたは読み取ります。
db_readall(db名) のdb名で指定するデータベースは存在していなければなりません。 また、読み取った値は、順次上書きされます。 したがって、書き込んだときと同じ状態に復元するためには、 読みとるときにデータベースは空でなければなりません。
なお読み取るときのデータベースの属性は書き込んだときの属性と hash-tree、keyedhash-keyedtree の組に限り、替えることができます。


一つ上に戻る 目次に戻る