このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/896
#  お題:単語データファイル「words.txt」から英単語リストを読み取り、アルファベットでしりとりを行い、 
#  一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。 
# 
# 

'一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。'(_単語列,_一番長いしりとりの単語列) :-
        '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列),
        forall(一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列),'出力せよ。'(_一番長いしりとりの単語列)).

一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列) :-
        しりとり単語列を(_整列した重複のない単語列,_長さを鍵に持つしりとり単語列),
        一番長い(_長さを鍵に持つしりとり単語列,_一番長いしりとりの単語列).

しりとり単語列を(_整列した重複のない単語列,_長さを鍵に持つしりとり単語列) :-
        findall([_長さ,_しりとりの単語列],しりとりの単語列(_整列した重複のない単語列,_しりとりの単語列,_長さ),_長さを鍵に持つしりとり単語列).

'同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列) :-
        sort(_単語列,_整列した重複のない単語列).

しりとりの単語列(_単語列,_しりとりの単語列,_長さ) :-
        select(_単語,_単語列,_残り単語列),
        しりとり(_単語,_残り単語列,[_単語],_しりとりの単語列),
        length(_しりとりの単語列,_長さ).

しりとり(_単語,_単語列,L1,_しりとりの単語列) :-
        単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_次の単語候補,_残り単語列),
        しりとり(_次の単語候補,_残り単語列,[_次の単語候補|L1],_しりとりの単語列).
しりとり(_,_,_しりとりの単語列,_しりとりの単語列).

単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_単語_2,_残り単語列) :-
        sub_atom(_単語,_,1,0,_文字),
        select(_単語_2,_単語列,_残り単語列),
        sub_atom(_単語_2,0,1,_,_文字).

一番長い(LL,_一番長いしりとりの単語列) :-
        最大値を捜す(_長さ,member([_長さ,_],LL),_一番長い),
        member([_一番長い,_一番長いしりとりの単語列],LL).

最大値を捜す(A,B,C) :-
        findall(A,B,L),
        最大値(L,C).
        
最大値(L,C) :-
        select(C,L,R),
        forall(member(A,R),A @=< C),!.

'出力せよ。'(_一番長い逆順のしりとりの単語列) :-
        reverse(_一番長い逆順のしりとりの単語列,_一番長いしりとりの単語列),
        atomic_list_concat(_一番長いしりとりの単語列,' ',_一番長いしりとりの単語列表現),
        writef('%t\n',[_一番長いしりとりの単語列表現]).