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つずつ読み取ります。
現在位置を持つタイプの時は現在位置は次の要素に移ります。
- list、hashおよび 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 の組に限り、替えることができます。
一つ上に戻る
目次に戻る