このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1260922392/22
# 次のゲームを考える
# ・二人のプレイヤーA、Bにそれぞれ持ち点m点を与える
# ・コイントスをして表が出たらAからBへ、裏が出たらBからAへ、1点渡す
# ・コイントスをくりかえして先に持ち点がなくなったほうが負け
#
# 一個の自然数mをキーボード入力から読み取ってこのゲームをたとえば1000ゲーム繰り返して、
# 平均何回のコイントスで勝負がつくか、シュミレーションして求めるプログラムを作成してください。
# ただしコイントスを10000回繰り返しても勝負がつかない場合があるかもしれないので、それは回数オーバーとして別にカウントしてください。
# 

一個の自然数mをキーボード入力から読み取ってこのゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負がつくか、シュミレーションして求める(_平均コイントス数) :-
    催促付き整数入力('A,Bが持つコイン数を入力してください :',M),
    このゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負がつくか(1,M,_無効ゲーム数,_平均コイントス数),!.

このゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負がつくか(M,_無効ゲーム数,_平均コイントス数) :-
    このゲーム(1,M,_有効コイントス総数,_無効ゲーム数),
    \+(_無効ゲーム数 = 1000),
    _平均コイントス数 is _有効コイントス総数 / (1000 - _無効ゲーム数).

このゲーム(N,_,0,0) :- N > 1000,!.
このゲーム(N,_,Sum1,Sum2) :-
    コイントスシミュレーション(M,M,_トス数),
    N2 is N + 1,
    このゲーム(N,_,Sum11,Sum2),
    Sum1 is Sum11 + _トス数,!.

表が出たらAからBへ、裏が出たらBからAへ、1点渡す(表,A1,B1,A2,B2) :- A2 is A1 - 1,B2 is B1 + 1,!.
表が出たらAからBへ、裏が出たらBからAへ、1点渡す(裏,A1,B1,A2,B2) :- B2 is B1 - 1,A2 is A1 + 1,!.

コイントスをくりかえして先に持ち点がなくなったほうが負け(0,_,'Aの負け').
コイントスをくりかえして先に持ち点がなくなったほうが負け(_,0,'Bの負け').