このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1258158172/358
#  [1] 授業単元:Cプログラミング 
#  [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10178.txt
# 問題:実行結果が以下の通りになるようにプログラムを追加しなさい。 
# 現在のデータ:0/100 
# (1)プッシュ (2)ポップ (0)終了:1 
# データ:25 
# 0 25 
# 現在のデータ:1/100 
# (1)プッシュ (2)ポップ (0)終了:1 
# データ:36 
# 0 25 
# 1 36 
# 現在のデータ:2/100 
# (1)プッシュ (2)ポップ (0)終了:1 
# データ:45 
# 0 25 
# 1 36 
# 2 45 
# 現在のデータ:3/100 
# (1)プッシュ (2)ポップ (0)終了:2 
# ポップしたデータは45です。 
# 0 25 
# 1 36 
# 現在のデータ:2/100 
# (1)プッシュ (2)ポップ (0)終了: 

stack_size(100),

stack_operation(Stack1,Stack2) :-
    get_action(N),
    stack_operation(N,Stack1,Stack2).

stack_operation(0,Stack,Stack) :- !. 
stack_operation(1,Stack1,Stack) :-
    write('データ :'),
    get_integer(N),push(N,Stack,Stack2),
    print_stack_list(Stack2),
    get_action(N2),
    stack_operation(N2,Stack2,Stack).
stack_operation(2,Stack1,Stack) :-
    pop(A,Stack1,Stack2),
    write_formatted('ポップしたデータは%tです。 \n',[A]),
    print_stack_list(Stack2),
    get_action(N2),
    stack_operation(N2,Stack2,Stack).

get_action(N) :-
    write('(1)プッシュ (2)ポップ (0)終了:'),
    get_integer(N).

push(A,Stack,[A|Stack]) :-
    stack_size(Max),
    length([A|Stack],Len),
    Len =< Max,!.
push(A,Stack,Stack) :-
    stack_size(Max),
    length(Stack,Max),
    write('スタックが最大サイズを越えました。プッシュできません!!\n'),!.

pop(A,[A|Stack],Stack).
pop(A,[],[]) :- write('スタックは空です!!\n').

print_stack_list(Stack) :-
    stack_size(Max),
    print_stack_list(0,Max,Stack),
    write_formatted('現在のデータ : %t/%t\n',[N,Max]).

print_stack_list(N,Max,[]) :-
    write('stack empty!\n'),!..
print_stack_list(N,Max,_) :-
    N > Max,
    write('スタックの最大サイズに達しました\n') :- !.
print_stack_list(N,Max,[A|R]) :-
    write_formatted('%t %t\n',[N,A]),
    N2 is N + 1,
    print_stack_list(N2,Max,R).