10/02/16 16:31:33
>>723
% Prolog 一枚のカードを作る/2 や トランプのようにならびを切る/4 は
% URLリンク(nojiriko.asia) 参照
ペアまたはフラッシュの出現度数(_回数,_ペアの度数,_フラッシュの度数) :-
findsum([M1,M2],(for(1,N,_回数),トランプの準備([A,B,C,D,E|R]),役([A,B,C,D,E],M1,M2)),[_ペアの度数,_フラッシュの度数]).
役(L,1,0) :- sort(L,L1),ペア(L1),!.
役([A|R],0,1) :- sub_atom(A,1,1,_,_種類),フラッシュ(_種類,R),!.
ペア([A,B]) :- sub_atom(A,0,1,_,C),sub_atom(B,0,1,_,C),!.
ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),sub_atom(C,0,1,_,E),ペア(R),!.
ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),\+(sub_atom(C,0,1,_,E)),!.
ペア([A|R]) :- ペア(R).
フラッシュ(_,[]) :- !.
フラッシュ(A,[B|R]) :- sub_atom(B,1,1,_,A),フラッシュ(A,R).
トランプの準備(X) :-
findall(U,(for(1,N,52),一枚のカードを作る(N,U)),_整列したカード),
トランプを切るようにならびを切る(41,53,_整列したカード,X),!.