このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1268003943/134
#  麻雀の手牌が入力として与えられたとき、「待ち」を出力するプログラムを書いてください。 
#  - 字牌なし・萬子のみの想定、つまり、いわゆる「チンイツ」限定で結構です(プログラミングの本質的にはこの限定でまったく問題ないため) 
#  - 1〜9の数字13個からなる文字列を受け取り、できている順子・刻子・アタマを()、待ちの部分を[]でくくって出力してください 
#  - 面前かつ槓子は存在しない前提でOKです 
#  - ()[]の出力順は自由ですが、順序だけが違うものは同一視してください(例:111222を刻子2つで構成するとき、(111)(222)が(222)(111)に入れ替わるだけのものは同一解答とします) 
#  - 多面待ちのときも含めすべての待ちを出力してください 
#  - 待ちがないときは何も出力しないでください 
#   
#  出力例 
#  1112224588899 : 
#  単純なケースです。45を軸にする両面の待ちなので、(111)(222)(888)(99)[45]になります。 
#   
#  1122335556799 : 
#  “99”をアタマの両面か“55”“99”のシャボであるので、(123)(123)(555)(99)[67]、(123)(123)(55)(567)[99]、(123)(123)(99)(567)[55]が正解です。 
#   
#  1112223335559 : 
#  待ちは“9”単騎ですが、(123)(123)(123)(555)[9]と(111)(222)(333)(555)[9]の2つあります。 
#   
#  1223344888999 : 
#  1-4の“ノベタン”待ちですが、4をアタマにしての[23]待ちと、1単騎、4単騎で3個の答えになります。 
#   
#  1112345678999 : 
#  「九蓮宝燈」という役です。1〜9すべてが待ちになっています。これに正しく答えが出るのであれば、プログラムはほぼ正しいでしょう。 
#   
#  ttp://www.itmedia.co.jp/enterprise/articles/1004/03/news002_2.html 
# 
# 

上がり(_待ち牌,_現在の手牌,[_アタマ|_順子または刻子ならび]) :-
      整列([_待ち牌|_現在の手牌],_整列された上がり手配候補),
      アタマ(_アタマ,_整列された上がり手配候補,_アタマを取った残りならび),
      順子または刻子(_順子または刻子ならび,_アタマを取った残りならび,_).

刻子または順子([],[],[]).
刻子または順子([U|R1],L,R2) :- 順子(U,L,R3),刻子または順子(R1,R3,R2).      
刻子または順子([U|R1],L,R2) :- 刻子(U,L,R3),刻子または順子(R1,R3,R2).      

アタマ([A,A],[A,A|R],R). 
アタマ(_アタマ,[A,A,A,A|R1],[A,A|R2]) :- !,アタマ(_アタマ,R1,R2).
アタマ(_アタマ,[A,A,A|R1],[A|R2]) :- !,アタマ(_アタマ,R1,R2).
アタマ(_アタマ,[A|R1],[A|R2]) :- アタマ(_アタマ,R1,R2).

刻子([A,A,A],[A,A,A|R],R).
刻子(_刻子,[A,A,A,A|R1],[A|R2]) :- !,刻子(_刻子,R1,R2).
刻子(_アタマ,[A|R1],R2) :- 刻子(_アタマ,R1,R2).

順子([A,B,C],_手牌,_残りならび) :-
      append(L0,L,_手牌),append([A|R1],[B|R2],[C|R3],L),
      順子([A,B,C]),
      append(L0,R1,R2,R4),append(R4,R3,R).

順子([1,2,3]).
順子([2,3,4]).
順子([3,4,5]).
順子([4,5,6]).
順子([5,6,7]).
順子([6,7,8]).
順子([7,8,9]).

/*

上がり(_待ち牌,_現在の手牌,[_アタマ|_順子または刻子ならび]) :-
      整列([_待ち牌|_現在の手牌],_整列された上がり手配候補),
      アタマ(_アタマ,_整列された上がり手配候補,_アタマを取った残りならび),

アタマの候補(_手牌,_アタマ候補) :-

順子を構成する候補(_整列した手牌ならび,_待ち牌,_構成される順子,_残り牌) :-

刻子を構成する候補(_整列した手牌ならび,_待ち牌,_構成される刻子,_残り牌) :-

*/