このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1328276597/610
#  [1] 授業単元:Cプログラミング演習 
#  [2] 問題文(含コード&リンク): 最長しりとり問題を整数計画法を用い、しりとりの数が最長となるパターンを導出するプログラムを作成せよ.ただし構造体とポインタを使用すること. 
#  

'しりとりの数が最長となるパターンを導出する'(_しりとりの数が最長となるパターン) :-
        しりとり節を定義,
        findmax([_長さ,_節番号ならび],(
                    しりとり(_長さ,_節番号ならび)),
                [_長さ,_節番号ならび]),
        節番号ならびを語彙ならびに変換(_節番号ならび,_しりとりの数が最長となるパターン).

しりとり(_長さ,_節番号ならび) :-
        しりとり節(_,_節番号,_先頭文字,_末尾文字),
        しりとり(_先頭文字,[],_節番号ならび),
        length(L,_長さ).

しりとり(_先頭文字,L2,_節番号ならび) :-
        しりとり節(_,_節番号,_先頭文字,_末尾文字),
        \+(member(_節番号,L2)),
        しりとり(_末尾文字,[_節番号|L2],_節番号ならび).
しりとり(_,L2,L) :-
        reverse(L2,L).

節番号ならびを語彙ならびに変換([],[]).
節番号ならびを語彙ならびに変換([_節番号|R1],[_語彙|R2]) :-
        しりとり節(_語彙,_節番号,_,_),
        節番号ならびを語彙ならびに変換(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

しりとり節を定義 :-
        findall(_語彙,(
                    語彙(_語彙)),
                _語彙ならび),
        sort(_語彙ならび,_整列した語彙ならび),
        しりとり節を定義(0,_整列した語彙ならび).

しりとり節を定義(_,[]).
しりとり節を定義(N,[_語彙|R]) :-
        節を定義(N,_語彙),
        N_2 is N + 1,
        しりとり節を定義(N_2,R).

節を定義(N,_語彙) :-
        sub_atom(_語彙,0,1,_,_先頭文字),
        sub_atom(_語彙,_,1,0,_末尾文字),
        assertz(しりとり節(_語彙,N,_先頭文字,_末尾文字)).