このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 128代目 #607 # 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で 考えてください. #   (住所録,商品の在庫,図書,ワールドカップの勝敗....) #  以下の要件を示します. # # 1. ファイルからデータを読み込む機能をつけること # 2. データは4つ以上の項目を保持させること. #  (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上) # 3. 並び替えの機能をつけること.また並び替える項目が指定できること. # 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わせることができること. #  (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始まる 等) # 5. データは半角英数字(英語やローマ字)で扱ってよい # 6. データの追加ができること. # 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に合致したデータを削除できること. # 8. 追加・削除した結果をファイルに保存できること. 鍵項目位置(書籍名,prolog関連書籍(_書籍名,_,_,_,_,_,_,_),_書籍名). 鍵項目位置(副書籍名,prolog関連書籍(_,_副書籍名,_,_,_,_,_,_),_副書籍名). 鍵項目位置(著者名,prolog関連書籍(_,_,_著者名,_,_,_,_,_),_著者名). 鍵項目位置(翻訳者名,prolog関連書籍(_,_,_,_翻訳者名,_,_,_,_),_翻訳者名). 鍵項目位置(発行年月日,prolog関連書籍(_,_,_,_,_発行年月日,_,_,_),_発行年月日). 鍵項目位置(出版社名,prolog関連書籍(_,_,_,_,_,_出版社名,_),_出版社名), 鍵項目位置(書籍コード,prolog関連書籍(_,_,_,_,_,_,_書籍コード),_書籍コード). 項目名を指定しての参照(_述語名/_引数の数,_項目名ならび,_値ならび) :- length(L,_引数の数), P =.. [_述語名|L], findall(_項目値,( call(P), member(_項目名,_項目名ならび), 鍵項目位置(_項目名,P,_項目値)),_値ならび). 項目名を指定して節構造ならびの参照(_項目名ならび,_節構造ならび,_値ならび) :- member([_頭部,_本体],_節構造ならび), findall(_項目値,( call(_本体),/* このアサーションを実行するかが大問題 */ member(_項目名,_項目名ならび), 鍵項目位置(_項目名,_頭部,_項目値)),_値ならび). データベースへの登録(_ファイル) :- reconsult(_ファイル). データベースへの追加(_項) :- assertz(_項). データベースからの削除(_項) :- retract(_項). データベースの保存(_述語名/_引数の数,_保存ファイル名) :- tell(_保存ファイル名), listing(_述語名/_引数の数), told. 節定義の並べ替え(_述語名/_引数の数,_鍵項目,上昇順) :- 上昇順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), forall(member([H,B],_上昇順に整列された節構造ならび),assertz((H :- B))). 節定義の並べ替え(_述語名/_引数の数,_鍵項目,下降順) :- 下降順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), forall(member([H,B],_上昇順に整列された節構造ならび),assertz((H :- B))). 上昇順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび,_節構造ならび,_鍵付加き節構造ならび), 上昇順整列(_鍵付加き節構造ならび,_上昇順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_上昇順に整列された鍵付き節構造ならび,_上昇順に整列された節構造ならび),!. 下降順節構造(_述語名/_引数の数,_鍵項目,_下降順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび,_節構造ならび,_鍵付加き節構造ならび), 下降順整列(_鍵付加き節構造ならび,_下降順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_下降順に整列された鍵付き節構造ならび,_下降順に整列された節構造ならび),!. 節構造ならびの取得(_述語名/_引数の数,_節構造ならび) :- length(L,_引数の数), H =.. [_述語名|L], findall([H,B],clause(H,B),_節構造ならび),!. ならびの先頭に鍵項目を付加(_,[],[]) :- !. ならびの先頭に鍵項目を付加(_鍵項目ならび,[[_頭部,_本体]|R1],[_鍵付き節構造|R2]) :- findall(_値,(member(_鍵,_鍵項目ならび),鍵項目位置(_鍵,_頭部,_値)),L), append(L,[_頭部,_本体],_鍵付き節構造), ならびの先頭の鍵項目を除去(_鍵項目ならび,_鍵付き節構造ならび,_節構造ならび) :- length(_鍵項目ならび,_除去する項数), ならびの先頭N個の鍵項目を除去(N,_鍵付き節構造ならび,_節構造ならび). ならびの先頭N個の鍵項目を除去(N,[L1|R1],[L2|R2]) :- append(L0,L2,L1), length(L0,N), ならびの先頭N個の鍵項目を除去(N,R1,R2). 上昇順に整列(L1,L2) :- 整列(上昇,L1,L2). 下降順に整列(L1,L2) :- 整列(下降,L1,L2). 整列(_,[],[]) :- !. 整列(_上昇または下降,[X|Xs],Ys) :- 配分(_上昇または下降,Xs,X,Littles,Gigs), 整列(_上昇または下降,Littles,Ls), 整列(_上昇または下降,Bigs,Bs), append(Ls,[X|Bs],Ys). 配分(_,[],Y,[],[]) :- !. 配分(上昇,[X|Xs],Y,[X|Ls],Bs) :- X @=< Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(上昇,[X|Xs],Y,Ls,[X|Bs]) :- X @> Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,[X|Ls],Bs) :- X @>= Y,!,配分(下降,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,Ls,[X|Bs]) :- X @< Y,!,配分(下降,Xs,Y,Ls,Bs). 鍵項目位置定義(述語名,_項目名ならび) :- length(_項目名ならび,Len), between(1,Len,N), list_nth(N,_項目名ならび,_項目名), 変数文字列の生成(Len,N,項目名,_項目変数文字列,_変数文字列), concat_atom(['鍵項目位置(',_項目名,述語名,'(',_変数文字列,')',_項目変数文字列,')'],S), parse_atom(S,1,P,V), assertz_with_names(P,V), N = Len,!. 変数文字列の生成(N,Len,項目名,_項目変数文字列,_変数文字列) :- M is N - 1, length(L1,M), all(L1,'_'), M2 is Len - N, length(L2,M2), all(L2,'_'), atom_concat('_',項目名,_項目変数文字列), append(L1,[_項目変数文字列|L2],L), concat_atom(L,',',_変数文字列). all([],_). all([A|R],V) :- all(R,V).