このディレクトリの索引
#  
#  与えたリストをシャッフルするshuffle/2を実装してください。
#  
#  ?- shuffle([a,b,c], X).
#  X = [b,a,c];
#  false
#  

shuffle(_カードの束,_切られたカードの束) :- shuffle([_,_,_,_,_],_カードの束,_切られたカードの束).

shuffle([],_カードの束,_カードの束) :- !.
shuffle([_|Ln],_カードの束,_切られたカードの束) :-
        概ね分割する(_カードの束,_カードの束_1,_カードの束_2),
        カードを雑に併合(1,_カードの束_1,_カードの束_2,_カードの束_3),
        shuffle(Ln,_カードの束_3,_切られたカードの束).

概ね分割する(_カードの束,_カードの束_1,_カードの束_2) :-
        _分割数1 is random(7) + 22,
        length(_カードの束_1,_分割数1),
        append(_カードの束_1,_カードの束_2,_カードの束),
        カードを雑に併合(_カードの束_1,_カードの束_2,_カードの束_3),

カードを雑に併合(1,_カードの束_1,_カードの束_2,_カードの束) :-
        _重なる枚数 is truncate(random(4) * 0.4 + 1),
        length(L,_重なる枚数),
        append(L,R,_カードの束_1),
        カードを雑に併合(2,R,_カードの束_2,_カードの束_3),
        append(L,_カードの束_3,_カードの束),!.
カードを雑に併合(2,_カードの束_1,_カードの束_2,_カードの束_3) :-
        _重なる枚数 is truncate(random(4) * 0.4 + 1),
        length(L,_重なる枚数),
        append(L,R2,_カードの束2),
        カードを雑に併合(1,_カードの束_1,R,_カードの束_3),
        append(L,_カードの束_3,_カードの束),!.
カードを雑に併合(_,_カードの束_1,_カードの束_2,_カードの束) :-
        append(_カードの束_1,_カードの束2,_カードの束),!.