このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/246
#  [1] 授業単元:プログラミングと実習2  
#  [2] 五目並べの石を並べる関数を作りる 
#  条件 
#  1.読み込み部分を関数化する。場所の指定は、行(row,大文字)、 
#    列(column,小文字)の順として連続した半角アルファベットとする。 
#    例:Aa↓,Gg↓(↓はEnter)とする。 
#    読み込んだ結果はA〜Zが0〜25,a〜zが0〜25とする 
#   出力例Bg 
#    row=1 
#    columnp=6 
#  3] 環境  
#   [3.1] OS:windowsXP  
#   [3.2] コンパイラ名とバージョン: Visual C++ 2008 Express  
#   [3.3] 言語:C言語  
#  [4] 期限:11月15日  
#  [5]その他の制限:アルファベットを整数値に変換して*rowp,*columnpに 
#          格納し*rowo,*columnpの値を評価するプルグラムを作る 
#   
#  どうかよろしくお願いします  
# 

'五目並べの石を並べる'(_盤面) :-
        盤面を用意する(_盤面),
        石を並べる([_],黒,_盤面).

盤面を用意する(_盤面) :-
        length(_盤面,19),
        findall(_,(
                    append(_,[L|_],_盤面),
                    length(L,19)),
                _盤面).

石を並べる(Ln,_石の色,_盤面) :-
        着手を得る(Ln,_手),
        着手を解析して盤面に石を配置する(_手,_石の色,_盤面),
        次の石の色(_石の色,_次の石の色),
        石を並べる([_|Ln],_次の石の色,_盤面),!.
石を並べる(_,_,_).

着手を得る(Ln,_手) :-
        length(Ln,_何手目),
        writef('着手を入力して下さい(終了するときは改行だけ)\n第%t手目 : ',[_何手目]),
        get_line(_手).

着手を解析して盤面に石を配置(_手,_石の色,_盤面) :-
        着手を解析して(_手,_行,_列),
        盤面に石を配置する(_何行,_何列,_石の色,_盤面).

盤面に石を配置する(_何行,_何列,_石の色,_盤面) :-
        length([_|Ln1],_何行),
        length([_|Ln2],_何列),
        append(Ln1,[L|_],_盤面),
        append(Ln2,[_石の色|_],L),!.

手の解析(_手,_何行,_何列) :-
        sub_atom(_手,0,1,_,_行を表す英大文字),
        sub_atom(_手,1,1,_,_列を表す英小文字),
        英大文字の何番目(_行を表す英大文字,_何行),
        英小文字の何番目(_列を表す英小文字,_何列),!.

英大文字の何番目(_行を表す英大文字,_何行) :-
        nth1(_何行,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_行を表す英大文字).

英小文字の何番目(_列を表す英小文字,_何列) :-
        nth1(_何列,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_列を表す英小文字).

次の石の色(黒,白).
次の石の色(白,黒).