このディレクトリの索引

# 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/624 # # [1] 授業単元:リスト構造体 # [2] 問題文(含コード&リンク): # enqueue()とdequeue()を用いて実行結果が # # Please input E(登録) or D(削除): E # Input number and name: 8 Nakamura # Please input E(登録) or D(削除): E # Input number and name: 3 Saito # Please input E(登録) or D(削除): D # Number=8 Name=Nakamura # Please input E(登録) or D(削除): D # Number=3 Name=Saito # Please input E(登録) or D(削除): D # No Data! # Please input E(登録) or D(削除): E # ・ # ・ # ・ # のように動作するプログラムを作成せよ # :- dynamic(キュー/2). 'enqueue()とdequeue()を用いて実行' :- start_queue, 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). 要求の取得(_要求) :- write('Please input E(登録) or D(削除) or q(終了) : '), 行入力(_要求),!. 'enqueue()とdequeue()を用いて実行'(q) :- !. 'enqueue()とdequeue()を用いて実行'('E') :- enqueue, fail. 'enqueue()とdequeue()を用いて実行'('D') :- dequeue, fail. 'enqueue()とdequeue()を用いて実行'(_) :- 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). start_queue :- キューの生成(一時的). enqueue :- write('Input number and name: '), 'Input number and name'(_number,_name), キューへの追加(一時的,[_number,_name]). 'Input number and name'(_number,_name) :- 区切り入力([' ',','],[_number,_name]). dequeue :- キューからの取り出し(一時的,_項), dequeue診断(_項,_診断), writef('%w\n',[_診断]). dequeue診断([],' No Data!') :- !. dequeue診断([_number,_name],_表示文字列) :- concat_atom(['nunmber = ',_number,' name = ',_name],_表示文字列). キューの生成(_キューの名前) :- キュー(_キューの名前,_), writef('%wというキューは既に存在します。登録できません。\n',[_キューの名前]),!. キューの生成(_キューの名前) :- asserta(キュー(_キューの名前,[])). キューからの取り出し(_キューの名前,_取り出した項) :- retract(キュー(_キューの名前,[_取り出した項|R])), asserta(キュー(_キューの名前,R)),!. キューからの取り出し(_キューの名前,[]). キューへの追加(_キューの名前,_追加する項) :- retract(キュー(_キューの名前,_キュー)), append(_キュー,[_追加する項],_追加されたキュー), asserta(キュー(_キューの名前,_追加されたキュー)). キューを空にする(_キュー名) :- retract(キュー(_キューの名前,_)), asserta(キュー(_キューの名前,[])). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 区切り入力(_区切り文字列ならび,_区切られた文字列ならび) :- 行入力(_行), 区切り文字列によって区切る(_行,_区切り文字列ならび,_区切られた文字列ならび). 区切り文字列によって区切る(_文字列,_区切り文字列ならび,[_前文字列|R]) :- sub_atom(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび), 区切り文字列によって区切る(_後文字列,_区切り文字列ならび,R),!. 区切り文字列によって区切る(_文字列,_,[_文字列]). 区切り文字列によって区切る('',_,[]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % % キューは引数内の論理変数として重リストを使って定義し、 % それを更新しながら持ちまわるのが普通だが、 % ここでは愚直に、キューを述語としてassertし、reatract/assertを % 繰り返して値を出入りさせる述語群を定義してみた。 %