このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1248012902/815
#  【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/915.txt#  【 形態 】1. Javaアプリケーション(main()で開始) 
# 
# しりとりゲームをするプログラム
# 第一段階ーShiritori.javaを次に掲載する。
#      これをEclipseに入力する
#    ー与えられた単語の可否を判定するためのクラスReferee.javaを作成する
# 
# 第二段階ーReferee.javaをしりとりのルールにのっとった判定をさせるように改善
# 
# 第一段階のRefereeの使用
# ・直前に入力された単語の末尾の文字を記憶するchar型のフィールド
#    lastChar
# ・次の単語がどの文字で始まらなければならないかをchar型で返すメソッド
#       mustBeginWith()
# ・引数として与えられた単語の可否を判定し、可ならtrueを返すとともにlastCharを更新し、否ならfalseを返すメソッド
#    isOK(String newWord)
# とりあえずは何でもかんでも「可」とするように作る

馬名しりとり :-
    write('最初の馬名は :'),
    get_line(_語1),
    sub_atom(_語1,0,1,_,_最初の文字),    
    馬名しりとり(_最初の文字,_語1,_語,[]).

馬名しりとり(_次の文字,_語,_語,_) :-
    \+(sub_atom(_語,0,1,_,_次の文字)),
    write_formatted('ゲームオーバー %t-%t はしりとりになっていません\n',[_次の文字,_語]),
    fail,!.
馬名しりとり(_次の文字,_語,_語,_履歴) :-
    member(_語,_履歴),!,
    write_formatted('ゲームオーバー %tは既出です\n',[_語]),
    fail.
馬名しりとり(_次の文字,_語,_,_) :-
    五代血統書(_語),
    fail.
馬名しりとり(_次の文字,_語,_語,_履歴) :-
    sub_atom(_語,0,1,_,_次の文字),
    write_formatted('%t-%t\n',[_次の文字,_語]).
馬名しりとり(_,_語1,_語,_履歴) :-
    馬名しりとりルール(_語1,_次の文字1),
    write('次の馬名は :'),
    get_line(_語2),
    馬名しりとり(_次の文字1,_語2,_語,[_語1|_履歴]).

馬名しりとりルール(_語,_次の文字) :-
    sub_atom(_語,Len,1,0,ン),
    Len2 is Len + 1,
    sub_atom(_語,0,Len2,_,_語2),
    馬名しりとり次の文字(_語2,_次の文字).
馬名しりとりルール(_語,_次の文字) :-
    sub_atom(_語,Len,1,0,ー),
    Len2 is Len + 1,
    sub_atom(_語,0,Len2,_,_語2),
    馬名しりとり次の文字(_語2,_次の文字).
馬名しりとりルール(_語,_次の文字) :-
    sub_atom(_語,Len,1,0,_次の文字),!.


% *** user: jbis / 2 ***
五代血統書(_馬名) :-
    jbis(_馬名,L),
    五代血統表表示(L).

jbis(_馬名,_血統書) :-
    このサイトの馬名はSJISが使われている(_馬名,_馬名sjis),
    'url述語表現'(_馬名sjis,URL1),
    '%27を切り取る'(URL1,URL2),
    concat(['http://www.jbis.or.jp/navi_search/?sid=horse&keyword=',URL2],URL),
    jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび),
    馬名による血統検索(_血統サイトの正確なURLならび,_血統書).

jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび) :-
    w3c(URL,X),
    concat_atom(X,X2),
    sjis2euc(X2,X3),
    split(X3,['\n','\r'],X4),
    findall(URL2,( member(A,X4),
                この行には検索対象の馬名が存在する(A,_馬名),
                血統サイトの正確なURLを構成する(A,URL2)),_血統サイトの正確なURLならび),
    !.

馬名による血統検索(_血統サイトの正確なURLならび,_血統書) :-
    member(URL,_血統サイトの正確なURLならび),
    w3c(URL,X),
    取れたならびすべての行をEUCに変換(X,_EUC行ならび),
    findall(_先祖馬名,(
                 member(_馬名を含む行,_EUC行ならび),
                 血統書の中の馬名を切り取る(_馬名を含む行,_先祖馬名)),
            _血統書).

このサイトの馬名はSJISが使われている(_馬名,_馬名sjis) :-
    euc2sjis(_馬名,_馬名sjis),!.

'%27を切り取る'(URL1,URL2) :-
    replace_all(URL1,'%27','',URL2),!.

取れたならびすべての行をEUCに変換(Y,Y4) :-
    concat_atom(Y,Y2),
    sjis2euc(Y2,Y3),
    split(Y3,['\n','\r'],Y4),!.

この行には検索対象の馬名が存在する(_行,_馬名) :-
    sub_atom(_行,_,_,_,'cell-br-no sort-02'),
    split(_行,['','(',')','>'],L),
    馬名は最後の二要素のうちのどちらかにある(L,_馬名),!.

馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名],L),!.
馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名,_],L),!.

血統サイトの正確なURLを構成する(_行,URL) :-
    split(_行,['"'],L),
    append(_,[U,_],L),
    concat_atom(['http://www.jbis.or.jp',U,'pedigree/'],URL),!.

血統書の中の馬名を切り取る(_行,_先祖馬名) :-
    先祖馬名を含む行はmaleという文字列を含む(_行),
    sub_atom(_行,Start,Len,_,''),
    sub_atom(_行,0,Start,_,_行1),
    split_patern_1(_split_patern_1),
    split(_行1,_split_patern_1,L),
    last(L,_先祖馬名),!.

先祖馬名を含む行はmaleという文字列を含む(_行) :- sub_atom(_行,_,_,_,male),!.

血統クロス(_馬名,_クロスならび) :-
    jbis(_馬名,L),
    length(L1,31),length(L2,31),append(L1,L2,L),
    積集合(L1,L2,_積集合),
    血統クロス(_積集合,L1,L2,_クロスならび).

血統クロス([],L1,L2,[]) :- !.
血統クロス([H|R1],L1,L2,[[_世代1,_世代2]|R2]) :-
    list_nth(N,L1,H),
    list_nth(N1,L2,H),
    N2 is N1 + 31,
    第何世代か(N,_世代ならび1),
    min(_世代ならび1,_世代1),
    第何世代か(N2,_世代ならび2),
    min(_世代ならび2,_世代2),
    血統クロス(R1,L1,L2,R2).

第何世代か(N,_世代ならび) :-
    findall(_世代,(
         五代血統表表示テーブル(_五代血統表表示テーブル),
         member(N,_五代血統表表示テーブル),
         list_nth(_世代,_五代血統表表示テーブル,N)),_世代ならび).

五代血統表表示(L) :-
    五代血統表表示テーブル(L1),
    五代血統表一行表示(L,L1),
    fail.
五代血統表表示(_).

五代血統表一行表示(_,[]) :- wr('\n'),!.
五代血統表一行表示(L,[N|R]) :-
    \+(N=0),
    list_nth(N,L,_馬名),
    wr('%t',[_馬名]),
    五代血統表一行表示(L,R),!.
五代血統表一行表示(L,[0|R]) :-
    wr('%15s',[' ']),
    五代血統表一行表示(L,R),!.

% *** user: 五代血統表表示テーブル / 1 ***
五代血統表表示テーブル([0,0,0,0,5]).
五代血統表表示テーブル([0,0,0,4,0]).
五代血統表表示テーブル([0,0,0,0,6]).
五代血統表表示テーブル([0,0,3,0,0]).
五代血統表表示テーブル([0,0,0,0,8]).
五代血統表表示テーブル([0,0,0,7,0]).
五代血統表表示テーブル([0,0,0,0,9]).
五代血統表表示テーブル([0,2,0,0,0]).
五代血統表表示テーブル([0,0,0,0,12]).
五代血統表表示テーブル([0,0,0,11,0]).
五代血統表表示テーブル([0,0,0,0,13]).
五代血統表表示テーブル([0,0,10,0,0]).
五代血統表表示テーブル([0,0,0,0,15]).
五代血統表表示テーブル([0,0,0,14,0]).
五代血統表表示テーブル([0,0,0,0,16]).
五代血統表表示テーブル([1,0,0,0,0]).
五代血統表表示テーブル([0,0,0,0,20]).
五代血統表表示テーブル([0,0,0,19,0]).
五代血統表表示テーブル([0,0,0,0,21]).
五代血統表表示テーブル([0,0,18,0,0]).
五代血統表表示テーブル([0,0,0,0,23]).
五代血統表表示テーブル([0,0,0,22,0]).
五代血統表表示テーブル([0,0,0,0,24]).
五代血統表表示テーブル([0,17,0,0,0]).
五代血統表表示テーブル([0,0,0,0,27]).
五代血統表表示テーブル([0,0,0,26,0]).
五代血統表表示テーブル([0,0,0,0,28]).
五代血統表表示テーブル([0,0,25,0,0]).
五代血統表表示テーブル([0,0,0,0,30]).
五代血統表表示テーブル([0,0,0,29,0]).
五代血統表表示テーブル([0,0,0,0,31]).
五代血統表表示テーブル([0,0,0,0,36]).
五代血統表表示テーブル([0,0,0,35,0]).
五代血統表表示テーブル([0,0,0,0,37]).
五代血統表表示テーブル([0,0,34,0,0]).
五代血統表表示テーブル([0,0,0,0,39]).
五代血統表表示テーブル([0,0,0,38,0]).
五代血統表表示テーブル([0,0,0,0,40]).
五代血統表表示テーブル([0,33,0,0,0]).
五代血統表表示テーブル([0,0,0,0,43]).
五代血統表表示テーブル([0,0,0,42,0]).
五代血統表表示テーブル([0,0,0,0,44]).
五代血統表表示テーブル([0,0,41,0,0]).
五代血統表表示テーブル([0,0,0,0,46]).
五代血統表表示テーブル([0,0,0,45,0]).
五代血統表表示テーブル([0,0,0,0,47]).
五代血統表表示テーブル([32,0,0,0,0]).
五代血統表表示テーブル([0,0,0,0,51]).
五代血統表表示テーブル([0,0,0,50,0]).
五代血統表表示テーブル([0,0,0,0,52]).
五代血統表表示テーブル([0,0,49,0,0]).
五代血統表表示テーブル([0,0,0,0,54]).
五代血統表表示テーブル([0,0,0,53,0]).
五代血統表表示テーブル([0,0,0,0,55]).
五代血統表表示テーブル([0,48,0,0,0]).
五代血統表表示テーブル([0,0,0,0,58]).
五代血統表表示テーブル([0,0,0,57,0]).
五代血統表表示テーブル([0,0,0,0,59]).
五代血統表表示テーブル([0,0,56,0,0]).
五代血統表表示テーブル([0,0,0,0,61]).
五代血統表表示テーブル([0,0,0,60,0]).
五代血統表表示テーブル([0,0,0,0,62]).

split_patern_1(['\r','>',A,B]) :-
AL = [60,47,97,62,60,47,116,100,62],
BL = [60,47,97,62,60,117,108,32,99,108,97,115,115,61,34,108,105,115,116,45,105,99,111,110,45,48,49,34,62],
atom_codes(A,AL),
atom_codes(B,BL).