このディレクトリの索引
#  リストからランダムにひとつずつ情報を取り出します。
#  ただし、一度取り出した情報は引かないこととします。
#  このような非決定性の述語を定義してください。
#  第一引数にリスト、第二引数に何番目の要素を引いたか、第三引数に取り出した要素,
#  最後の第四引数に取り出された要素以外の要素ならびを持つものとします。
#

ならびから重複せず乱順に取得(_ならび,_N番目,_取得要素,_残り要素) :-
        length(_ならび,_要素数),
        findall(N,for(1,N,_要素数),_要素番号候補),
        ならびから重複せず乱順に収集(_ならび,[],_要素数,L),
        append(_,[[_N番目,_取得要素]|_],L),
        length([_|L0],_N番目),
        append(L0,[_|R1],_ならび),
        append(L0,R,_残り要素).

ならびから重複せず乱順に収集(_,_,0,[]) :- !.
ならびから重複せず乱順に収集(_ならび,L,_残り要素数,[[_N番目,_取得要素]|R]) :-
        M is (random mod _残り要素数) + 1,
        list_nth(M,L,_N番目),
        length([_|L0],_N番目),
        append(L0,[_取得要素|_],_ならび),
        _残り要素数_1 is _残り要素数 - 1,
        ならびから重複せず乱順に収集(_ならび,[_N番目|L],_残り要素数_1,R).