このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1247438792/196
# [1] 授業単元:プログラミング論 
# [2] 問題文:入力ストリームから読み込んだ文字列を、データベースに格納する前に 
# スタックに一時的に格納するプログラムを作成する 
# このときデータをまとめたデータ文字列を一つずつスタックへプッシュしたり 
# ポップしたりする過程が分かるプログラムを作成する。 
# なおスタックを実現するライブラリはスタックのための別のヘッダにまとめる 
# 
# [プログラムの例] 
# 入力ストリームから読み込んだデータ文字列をスタックへプッシュしたり 
# ポップしたりするたびにデータベースに格納された全データを表示する。

t516(Instream,Stack1,Stack2) :-
    get_code(Instream,Code),
    t516(Instream,Code,Stack1,Stack2).

t516(Instream,-1,Stack1,Stack2) :-
    t516_popall(Stack1,Stack3,[],L),
    atom_codes(Atom,L),
    assertz(database(Atom)),!.
t516(Instream,10,Stack1,Stack2) :-
    t516_popall(Stack1,Stack3,[],Codes),
    atom_codes(Atom,Codes),
    assertz(database(Atom)),
    get_code(Instream,Code),
    t516(Instream,Code,Stack3),!.
t516(Insteam,A,Stack1,Stack2) :-
    push(A,stack1,Stack3),
    get_code(Instream,B),
    t516(Instream,B,Stack3,Stack2).

t516_popall(Stack,Stack,X,X) :- empty(Stack),!.
t516_popall(Stack1,Stack2,Y,X) :-
    pop(A,Stack1,Stack3),
    t516_popall(Stack3,Stack2,[A|Y],X).

empty([]) :- write('stack empty :: []\n\n').

push(A,Stack,[A|Stack]) :- write_formatted('push:%t :: %t --> %t\n',[A,Stack,[A|Stack]]).

pop(A,[A|Stack],Stack) :- write_formatted('pop:Pop :: %t --> %t Pop=%t\n',[[A|Stack],Stack,A]).