>>221
一番自然なコードは

shuffle_n(0,_,_リスト,_リスト) :- !.
shuffle_n(_n,_カードの枚数,_入力リスト,_出力リスト) :-
    shuffle(_入力リスト,_切られたリスト),
    _n_1 is _n - 1,
    shuffle_n(_n_1,_カードの枚数,_切られたリスト,_出力リスト).

shuffle(_カードの枚数,_入力リスト,_出力リスト) :-
    _乱数値1 is random(_カードの枚数) + 1,
    _乱数値2 is random(_カードの枚数) + 1,
    交換(1,[_乱数値1,_乱数値2],V1,V2,_入力リスト,_出力リスト).

交換(N,_交換位置リスト,V1,V2,[A|R1],[A|R2]) :-
    \+(member(N,_交換位置リスト)),
    N2 is N + 1,
    交換(N2,_交換位置リスト,V1,V2,R1,R2),!.
交換(N,_交換位置リスト,V1,V2,[A|R1],[V2|R2]) :-
    var(V1),
    V1 = A,
    N2 is N + 1,
    交換(N2,_交換位置リスト,V1,V2,R1,R2),!.
交換(_,_,V1,V2,[A|R],[V1|R]) :-
    var(V2),
    V2 = A,!.