このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1291471791/651
#  [1] 授業単元: プログラミング  
#  [2] 問題文: 
#  配列によるスタックを実現する。出来るだけ簡単なアルゴリズムで 
#  ポップとプッシュの操作が可能なプログラムを作れ。正し配列は100要素 
#  程度とする。 
#   
#  
% PSI のKL0言語のデータ管理命令を使ってみる。

:- op(600,fx,push).

'配列によるスタックを実現する。出来るだけ簡単なアルゴリズムでポップとプッシュの操作が可能なプログラムを作れ。正し配列は100要素' :-
        new_heap_vector(_HeapVector,100),
        スタック操作コマンド(_HeapVector,0).

スタック操作(_,満杯) :- !.
スタック操作(_,空) :- !.
スタック操作(_HeapVector,_スタックポインタ) :-
        write('? '),
        get_line(Line),
        atom_to_term(Line,Term,_),
        スタック操作コマンド(_HeapVector,_スタックポインタ,Term,_診断),
        スタック操作(_HeapVector,_診断).

スタック操作コマンド(_HeapVector,_スタックポインタ,push(_要素),_実行後スタックポインタ) :-
        push(push(_HeapVector,_要素,_スタックポインタ,_実行後スタックポインタ),
        write_formatted('%t >> \n',[_要素]),!.

スタック操作コマンド(_HeapVector,_スタックポインタ,pop,_実行後スタックポインタ) :-
        pop(_HeapVector,_スタックポインタ,_実行後スタックポインタ,_要素),
        write_formatted('%t << \n',[_要素]),!.

push(_HeapVector,_要素,100,満杯) :- !.
push(_HeapVector,_要素,_実行前スタックポインタ,_実行後スタックポインタ) :-
        set_vector_element(_HeapVector,_実行前スタックポインタ,_要素),
        _実行後スタックポインタ is _実行前スタックポインタ + 1.

pop(_HeapVector,0,_実行後スタックポインタ,空) :- !.
pop(_HeapVector,_実行前スタックポインタ,_実行後スタックポインタ,_要素) :-
        set_vector_element(_HeapVector,_実行前スタックポインタ,_要素),
        _実行後スタックポインタ is _実行前スタックポインタ - 1.

%% リストによるStackの処理 %%

push(_挿入要素,_現在のスタック,_挿入後のスタック) :-
        _挿入後のスタック = [_挿入要素|_現在のスタック].

pop(_現在のスタック,_取り出し要素,_取り出し後のスタック) :-
        _現在のスタック = [_取り出し要素|_取り出し後のスタック],!.
pop([],[],[]).