このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/617
#  
#  結び番号(-1,-2, ... -n) によって区別された結び(ならび)の操作。
#  


結び目(-1,-1,_).

先頭に結び目を加える(_結び番号,_要素) :-
        新しい結び目を得る(_結び番号,_新しい結び目),
        retract(結び目(_結び番号,_次の結び目,_)),
        asserta(結び目(_新しい結び目,_次の結び目,_要素)),
        assertz(結び目(_結び番号,_新しい結び目,_)).

末尾に結び目を加える(_結び番号,_要素) :-
        新しい結びを得る(_新しい結び目),
        retract(結び目(_末尾の結び目,_結び番号,_末尾の要素)),
        asserta(結び目(_末尾の結び目,_新しい結び目,_末尾の要素)),
        asserta(結び目(_新しい結び目,_結び番号,_要素)).

先頭の結び目を取り除く(_結び番号) :-
        retract(結び目(_結び番号,_先頭の結び目,_)),
        retract(結び目(_先頭の結び目,_次の結び目,_要素)),
        asserta(結び目(_結び番号,_次の結び目,_)).

末尾の結び目を取り除く(_結び番号,_ならび,_末尾の要素,_末尾の要素を除いたならび) :-
        retract(結び目(_末尾の結び目,_結び番号,_末尾の要素)),
        retract(結び目(_末尾の一つ前の結び目,_末尾の結び目,_末尾の一つ前の要素)),
        asserta(結び目(_末尾の一つ前の結び目,_結び番号,_末尾の一つ前の要素)).

n番目の要素を表示(_結び番号,_n,_n番目の要素) :-
        結び目(_結び番号,_最初の結び目,_),
        n番目の要素を得る(1,_n,_最初の結び目,_n番目の要素).

n番目の要素を得る(_n,_n,_n番目の結び目,_n番目の要素) :-
        結び目(_n番目の結び目,_,_n番目の要素),!.
n番目の要素を得る(_n_1,_n,_n_1番目の結び目,_n番目の要素) :-
        _n_1 < _n,
        結び目(_n_1番目の結び目,_n_2番目の結び目,_n番目の要素),
        _n_2 is _n_1 + 1,
        n番目の要素を得る(_n_2,_n,_n_2番目の結び目,_n番目の要素).

n番目の要素を取り除く(_結び番号,_n,_n番目の要素) :-
        結び目(_結び番号,_最初の結び目,_),
        n番目の結び目を取り除く(1,_n,_最初の結び目).        

n番目の結び目を取り除く(_n,_n,_n番目の結び目) :-
        retract(結び目(_n番目の結び目,_n_2番目の結び目,_n番目の要素)),
        retract(結び目(_n_1番目の結び,_n番目の結び目,_n_1番目の要素)),
        asserta(結び目(_n_1番目の結び,_n_2番目の結び目,_n_1番目の要素)),!.
n番目の結び目を取り除く(_n_1,_n,_n_1番目の結び目) :-
        _n_1 < _n,
        結び目(_n_1番目の結び目,_n_2番目の結び目,_),
        _n_2 is _n_1 + 1,
        n番目の結び目を取り除く(_n_2,_n,_n_2番目の結び目,_n番目の要素).

n番目の結び目を挿入(_結び番号,_n,_n番目の要素) :-
        結び目(_結び番号,_最初の結び目,_),
        n番目の結び目を挿入(1,_n,_最初の結び目,_n番目の要素).

n番目の結び目を挿入(_n,_n,_現在のn番目の結び目,_n番目の要素) :-
        retract(結び目(_n_1番目の結び目,_現在のn番目の結び目,_n_1番目の要素)),
        新しい結び目(_新しい結び目),
        asserta(結び目(_新しい結び目,_現在のn番目の結び目,_新しい要素)),
        asserta(結び目(_n_1番目の結び目,_新しい結び目,_n_1番目の要素)),!.
n番目の結び目を挿入(_n_1,_n,_n_1番目の結び目,_n番目の要素) :-
        _n_1 < _n,
        結び目(_n_1番目の結び目,_n_2番目の結び目,_),
        _n_2 is _n_1 + 1,
        n番目の結び目を挿入(_n_2,_n,_n_2番目の結び目,_n番目の要素).

新しい結び目(_新しい結び目) :-
        _新しい結び目 is (random(40000)+1) * (random(40000)+1),
        \+(結び目(_新しい結び目,_,_)),!.
新しい結び目(_新しい結び目) :-
        新しい結び目(_新しい結び目).