このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/188
#  [1]C言語 
#  [2]hashについて 
#  問題文 http://ime.nu/www.dotup.org/uploda/www.dotup.org3723526.jpg 
#  [3]Linux  
#  [3.1]gcc C言語 
#  [4]木曜日6:00まで 
#  [5]宜しくお願いします… 
# 
#  
#  問題1. 整数データに対してハッシュ探索を行うことを考える。
#  (1) 1~50までの値の乱数を20回呼び出し、テーブル長が23のハッシュテーブル
#      にチェイン法によってデータを格納せよ。ここでハッシュ関数は(mod23)と
#      する。
#  (2) hash表の内容をすべて画面表示する関数print_hashを定義して、確認しな
#      さい。
#  (3) (2)によって格納されたデータに対して各i(1 =< i =< 50)のデータを探索し、見
#      つかる(or 見つからない)までにcheckしたデータ数を調べよ(最小・最大・平
#      均etc.)。
#  
#  問題2 文字列データに対してハッシュによる辞書を実装せよ。ただし、構造体の
#  メンバーにkeyだけでなくvalue(これも文字列)を追加する。keyを探索したとき
#  valueを返すようにする。ここでhash関数は、文字列内の各文字のアスキーコード
#  の和の(mod 23)とする。文字列の比較にはstrcmpを用いよ。このようなハッシュ表
#  は連想配列とも呼ばれる。

'文字列データに対してハッシュによる辞書を実装せよ。ただし、構造体のメンバーにkeyだけでなくvalue(これも文字列)を追加する。keyを探索したときvalueを返すようにする。ここでhash関数は、文字列内の各文字のアスキーコードの和の(mod 23)とする。'(_文字列) :-
        true.

'文字列データに対してハッシュによる辞書を実装せよ' :-
        between(1,23,N),
        assertz(hash(N,[])),
        N = 23.

'構造体のメンバーにkeyだけでなくvalue(これも文字列)を追加する'(_文字列) :-
        hash関数(_文字列,_key),
        retract(hash(_key,L)),
        asserta(hash(_key,[_文字列|L]])),!.

hash関数(_文字列,_key) :-
        findsum(Code,(
                    sub_atom(_文字列,_,1,_,_文字),
                    char_code(_文字,Code)),
                _コードの和),
        _key is (_コードの和 mod 23) + 1.

'keyを探索したときvalueを返すようにする'(_key,_文字列) :-
        hash(_key,L),
        member(_文字列,L).