このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1263824755/683
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク): http://ime.nu/ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10530.zip 
# ポーカープログラム 
# # 1,二つのクラス(Card,Deck)が与えられていて、 
# game1.hとgame1.cppのプラグラムを書け。 
# このプログラムはデッキから5枚配る事を1回とし、 
# その中に何回ペアまたはフラッシュ(同じ手札に同じマークが5枚揃う事)が 
# あるかの10000回の統計であり、以下を表示させること 
# 
# 何回の統計か 
# そのうち何個の手札がペアを持つか 
# そのうち何個の手札がフラッシュを持つか 
# ペアは全体の何%か 
# フラッシュは全体の何%か 
# 
# 無作為化する為に以下を必ず含める事 
# stand(unsigned)time(NULL); 
# 
# #2,新しいクラスhand(hand.hとhand.cpp)と、これを実行させる為の 
# game2.hとgame2.cppを書け。 
# これはカードの配布、ペア・フラッシュの確認、そしてデッキにカードを戻す為の 
# プログラムである。 
# 

ペアまたはフラッシュの出現度数(_回数,_ペアの度数,_フラッシュの度数) :-
    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),!.

一枚のカードを作る(N,U) :-
    M is N mod 13,
    M2 is (N - 1) // 13,
    数字カード・絵カード(M,U1),
    カードの種類(M2,U2),
    concat_atom([U1,U2],U),!.

数字カード・絵カード(1,'A') :- !.
数字カード・絵カード(10,'T') :- !.
数字カード・絵カード(11,'J') :- !.
数字カード・絵カード(12,'Q') :- !.
数字カード・絵カード(0,'K') :- !.
数字カード・絵カード(N,N).

カードの種類(0,s) :- !.
カードの種類(1,h) :- !.
カードの種類(2,d) :- !.
カードの種類(3,c) :- !.

トランプを切るようにならびを切る(0,_要素数,L,L) :- !.
トランプを切るようにならびを切る(N,_要素数,L,X) :-
    M1 is (random mod _要素数) + 1,
    M2 is (random mod _要素数) + 1,
    \+(M1=M2),
    swap_nth(M1,M2,L,L1),
    N2 is N - 1,
    トランプを切るようにならびを切る(N2,_要素数,L1,X),!.
トランプを切るようにならびを切る(N,_要素数,L,X) :-
    トランプを切るようにならびを切る(N,_要素数,L,X),!.

swap_nth(M,N,L1,L2) :-
    list_nth(M,L1,A),
    list_nth(N,L1,B),
    swap(A,B,L1,L2),!.

swap(A,B,L,LX) :-
    append(L1,[A|L2],[B|L3],L),
    append(L1,[B|L2],[A|L3],LX),!.
swap(A,B,L,LX) :-
    append(L1,[B|L2],[A|L3],L),
    append(L1,[A|L2],[B|L3],LX),!.