このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/962
#  [1] 授業単元:プログラミング応用 
#  [2] 問題文(含コード&リンク):キューを用いて木の幅優先探索を行うプログラムを作成する 
#  http://nojiriko.asia/img/queue_tree.png 
#  http://water.eit.hirosaki-u.ac.jp/~slmizu/pa2010/kadai05.html 
#  

木(0,1,7).
木(1,2,5).
木(2,3,4).
木(3,-1,6).
木(4,-1,-1).
木(5,-1,6).
木(6,-1,-1).
木(7,8,10).
木(8,-1,9).
木(9,-1,-1).
木(10,-1,-1).

値(0,_).
値(1,_).
値(2,_).
値(3,_).
値(4,_).
値(5,_).
値(6,_).
値(7,_).
値(8,_).
値(9,_).
値(10,_).

キューを用いる幅優先探索(_キュー) :- キューは空である(_キュー),!.
キューを用いる幅優先探索(_キュー,_値) :-
        キューから要素を取り出す(_木,_キュー1,_キュー2),
        値を取り出す(_キュー2,_木,_値).

値を取り出す(_キュー,-1,_値) :-
        キューを用いる幅優先探索(_キュー,_値).
値を取り出す(_キュー,_木,_値) :-
        \+(_木 = -1),
        値(_木,_値).
値を取り出す(_キュー,_木,_値) :-
        キューを用いる幅優先探索(_キュー,_値).

木に値をセットする([],_キュー,_キュー).
木に値をセットする([A|R],_キュー1,_終了時のキュー) :-
        キューから要素を取り出す(_要素,_キュー1,_キュー2),
        retract(値(_要素,_)),
        assertz(値(_要素,A)),
        木に値をセットする(R,_キュー2,_終了時のキュー).

ならび要素をキューに追加する([],_キュー,_キュー).
ならび要素をキューに追加する([A|R],_キュー1,_キュー) :-
        キューに要素を追加する(A,_キュー1,_キュー2),
        ならび要素をキューに追加する(R,_キュー2,_キュー).

新しいキューを作る(X-X).
キューは空である(X-Y) :- X == Y.
キューに要素を追加する(_要素,X-[_要素|Y],X-Y).
キューから要素を取り出す(_要素,[_要素|X]-Y,X-Y).