このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/232
#  [1] 授業単元:配列の並び替え  
#  [2] 問題文(含コード&リンク):  
#  ../test/read.cgi/tech/1307166756/189のシステムを以下のように拡張する。  
#  指定済みの座標を入力した場合、「先手の負け」または「後手の負け」と表示する。  
#  全てのマスが埋まったら、「試合終了」と表示する。  
#  この段階でも、勝ち負けの判定も行わない。  

'先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならA、後手ならBを表示して、3目並べを実現する' :-
        length(LL,3),
        findall(L,(append(_,[L|_],LL),length(L,3)),LL),
        3目並べを実現する(後手,LL,_診断).

3目並べを実現する(_,_,_診断) :-
        \+(var(_診断)),!.
3目並べを実現する(_,LL,正常終了) :-
        打つところがない(LL),
        write('試合終了),!.        
3目並べを実現する(_前の手番,LL,正常終了) :-
        三目ならび完成(LL),
        writef('%tの勝ちです\n',[_前の手番]),!.
3目並べを実現する(_前の手番,LL,_診断) :-
        \+(三目ならび完成(LL)),
        手番(_前の手番,_手番),
        座標値を与える(_手番,LL,_診断),
        3目並べを実現する(_手番,LL,_診断).

打つところがない([]).
打つところがない([L|R]) :-
        全て変数(L),
        打つところがない(R).

すべて変数([]).
すべて変数([V|R]) :-
        var(V),
        すべて変数(R).

三目ならび完成([[_,_,A],[_,A,_],[A,_,_]]) :- \+(var(A)),!.
三目ならび完成([[A,_,_],[_,A,_],[_,_,A]]) :- \+(var(A)),!.
三目ならび完成([[A,A,A]|_]) :- \+(var(A)),!.
三目ならび完成([_,[A,A,A]|_]) :- \+(var(A)),!.
三目ならび完成([_,_,[A,A,A]]) :- \+(var(A)),!.
三目ならび完成(L) :-
        転置(L,L1),
        三目ならび完成(L1).

手番(先手,後手).
手番(後手,先手).

着手記号(先手,'O').
着手記号(後手,'@').

座標値を与える(_手番,LL,_診断) :-
        盤面表示(LL),
        writef('%t の手番です : \n',[_手番]),
        座標値を得る(_x,_y),
        座標値診断(_手番,_x,_y,LL),!.

座標値を得る(_x,_y) :-
        get_line(Line),
        split(Line,[' ',','],[_x,_y]),!.

座標値診断(_手番,_x,_y,LL,_診断) :-
        nth1(_y,LL,L),
        nth1(_x,L,V),
        var(V),
        着手記号(_手番,_記号),
        V = _記号,!.
座標値診断(_手番,_,_,_,異常終了) :-
        write('%tの負けです。\n',[_手番]),!.

盤面表示(LL) :-
        write('---------\n'),
        append(_,[[A,B,C]|R],LL),
        変数は空白に変換([A,B,C],[A2,B2,C2]),
        concat_atom([A2,B2,C2],'|',S),
        writef('|%t|\n',[S]),
        R = [],
        write('---------\n'),!.

変数は空白に変換([],[]).
変数は空白に変換([V|R1],[' '|R2]) :-
        var(V),
        変数は空白に変換(R1,R2).
変数は空白に変換([V|R1],[V|R2]) :-
        \+(var(V)),
        変数は空白に変換(R1,R2).