このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/189
#  [1] 授業単元:配列の並び替え  
#  [2] 問題文(含コード&リンク):  
#  先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならO、後手なら@を表示して、3目並べを実現するプログラムを作成しなさい。 
#  操作は、先手・後手が交互に座標の数値を1ずつ与えるものとし、入力ミスは考えない。 
#  すでに指定済みの座標かどうかについては判定し、指定済みの座標を入力した場合は、「異常終了」と表示し、プログラムを終了することとする。 
#  この段階では、勝ち負けの判定も行わない。 
#  

'先手、後手の順番で、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),
        writef('%tの勝ちです\n',[_前の手番]),!.
3目並べを実現する(_前の手番,LL,_診断) :-
        \+(三目ならび完成(LL)),
        手番(_前の手番,_手番),
        座標値を与える(_手番,LL,_診断),
        3目並べを実現する(_手番,LL,_診断).

三目ならび完成([[_,_,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('異常終了\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).