このディレクトリの索引
# 公開された日本最大の競馬情報データベースjbisのサイトで
# ディープインパクトの五代血統表は
# http://www.jbis.or.jp/horse/0000742976/pedigree/ を検索することによって
# 得られます。このサイトを利用し、これを起点にして、
# 父系(父親の父親の父親・・・と遡る)20代前の大種牡馬Eclipseまで列記する
# プログラムを作りなさい。

父系の収集(_目標馬,_五代血統書,X) :-
    五代血統書に於いて父系は最初の5要素以内に現れる(_目標馬,_五代血統表,X),!.
父系の収集(_目標馬,[_一代父,_二代父,_三代父,_四代父,_五代父|_],[_一代父,_二代父,_三代父,_四代父,_五代父|R]) :-
    jbis(_五代父,_五代遡った五代血統表),
    父系の収集(_目標馬,_五代遡った五代血統表,R).

五代血統書に於いて父系は最初の5要素以内に現れる(_目標馬,_五代血統表,X) :-
    append(L1,[_目標馬|_],_五代血統書),
    length(L1,N),
    N < 5,
    append(L1,[_目標馬],X),!.

% *** 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),
    取れたならびすべての行をEUCに変換(X,_EUC行ならび),
    findall(URL2,( member(A,_EUC行ならび),
                この行には検索対象の馬名が存在する(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) :-
    tmpnam(TMPNAM),
    tell(TMPNAM),
    (   member(A,Y),
        replace_all(A,'\r','',B),
        wr('%t\n',[B]),
        fail;
        told
    ),
    concat_atom(['cat ',TMPNAM,' | nkf -Se'],S),
    shs(S,Y4),
    unlink(TMPNAM),!.

この行には検索対象の馬名が存在する(_行,_馬名) :-
    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),
    Chars_1 = [<,/,a,>,<,/,e,m,>,<,/,t,d,>],
    Chars_2 = [<,/,a,>,<,/,t,d,>],
    Chars_3 = [<,/,a,>,<,u,l,' ',c,l,a,s,s,=,'"',l,i,s,t,-,i,c,o,n,-,'0','1','"',>],
    atom_chars(S1,Chars_1),
    atom_chars(S2,Chars_2),
    atom_chars(S3,Chars_3),
    split(_行1,[S1,'\r','>',S2,S3],L),
    last(L,_先祖馬名),!.

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

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

血統クロス([],L1,L2,[]) :- !.
血統クロス([_馬名|R1],L1,L2,[[_馬名,_世代1,_世代2]|R2]) :-
    list_nth(N,L1,_馬名),
    list_nth(N1,L2,_馬名),
    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\n',[_馬名]),!.
五代血統表一行表示(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]).