このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/752
#  ../test/read.cgi/tech/1312201995/748,../test/read.cgi/tech/1312201995/751 
#  レスありがとうございます。 
#  オプションは無視していいです。すみませんでした。 
#  ・双方向循環リストの長さ(ダミーノードを除く)を求める関数 
#  ・双方向循環リストへの「一番先頭への挿入」と「削除」(削除ノードを直接指定)を出きる関数 
#  ・それらの関数を用いてのjosephusの問題を解くプログラムを作れという問題です。 
#   
#  よろしければよろしくお願いします。 
# 
# 

'双方向循環リストへの「一番先頭への挿入」と「削除」(削除ノードを直接指定)を出きる述語'(_挿入または削除,_値) :-
        append(_,[_挿入または削除|_],[挿入,削除]),
        '双方向循環リストへの一番先頭への挿入または削除ノードを指定しての削除'(_挿入または削除,_値).

'双方向循環リストへの一番先頭への挿入または削除ノードを指定しての削除'(挿入,_値) :-
        retract(先頭ノード(_先頭ノード)),
        retract(双方向循環リスト(_先頭ノード,_次のノード)),
        retract(双方向循環リスト(_ひとつ前のノード,_先頭ノード)),
        asserta(双方向循環リスト(_値,_先頭ノード)),
        asserta(双方向循環リスト(_ひとつ前のノード,_値)),
        asserta(先頭ノード(_値)),!.
'双方向循環リストへの一番先頭への挿入または削除ノードを指定しての削除'(削除,_値) :-
        retract(先頭ノード(_値)),
        assertz(先頭ノード(_次のノード)),
        retract(双方向循環リスト(_値,_次のノード)),
        retract(双方向循環リスト(_ひとつ前のノード,_値)),
        assertz(双方向循環リスト(_ひとつ前のノード,_次のノード)),!.
'双方向循環リストへの一番先頭への挿入または削除ノードを指定しての削除'(削除,_値) :-
        先頭ノード(_値),
        retract(双方向循環リスト(_値,_次のノード)),
        retract(双方向循環リスト(_ひとつ前のノード,_値)),
        assertz(双方向循環リスト(_ひとつ前のノード,_次のノード)),
        retract(先頭ノード(_値)),
        assertz(先頭ノード(_次のノード)),!.
'双方向循環リストへの一番先頭への挿入または削除ノードを指定しての削除'(削除,_値) :-
        \+(先頭ノード(_値)),
        retract(双方向循環リスト(_値,_次のノード)),
        retract(双方向循環リスト(_ひとつ前のノード,_値)),
        assertz(双方向循環リスト(_ひとつ前のノード,_次のノード)),!.