>>215

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

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

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

カードを雑に併合(1,_カードの束_1,_カードの束_2,_カードの束) :-
    _重なる枚数 is truncate(random(4) * 0.4 + 1),
    length(L,_重なる枚数),
    append(L,R1,_カードの束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,_カードの束),!.