このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/778
#  [1] 授業単元:C言語  
#  [2] 問題文(含コード&リンク): 
#  n本の棒がある。棒i(3<n<100)の長さはa_i(1<a_i<10^4)である。 
#  あなたは、それらの棒から3本を選び、「できるだけ周長の長い三角形」と「できるだけ周長の短い三角形」 
#  を作ろうと考えている。それぞれ最大・最短の周長と選択した棒の組を求めるプログラムを作成せよ。 
#  ただし、どのような棒の組を選んでも三角形が作れない場合、0を答えとして返せ。 
#  プログラムの要件として、以下の事項を定める。 
#  ・引数として棒の長さデータが収められたファイル名のみが与えられるものとする。 
#  ・結果として、標準出力に、最大周長と棒の組み合わせ、最短周長と棒の組み合わせが出力されること。 
#   
#  % cat length.dat 
#  2 3 4 5 10 
#  % ./a.out length.dat 
#  最大周長=12 (3 4 5) 
#  最短周長=9 (2 3 4) 
#   
#  %cat length.dat 
#  4 5 10 20 
#  % ./a.out length.dat 
#  0  
#  

program :-
        user_parameters([_ファイル名]),
        get_lines(_ファイル名,Lines),
        findall(N,(
                    append(_,[Line|_],Lines),
                    sqlit(Line,[' '],L2),
                    append(_,[N|_],L2)),
                _棒の長さならび),
        周囲が最大の三角形(_棒の長さならび,[A1,B1,C1]),
        周囲が最短の三角形(_棒の長さならび,[A2,B2,C2]),
        write_formatted('最大周長=%t (%t %t %t)\n',[_最大周長,A1,B1,C1]), 
        write_formatted('最短周長=%t (%t %t %t)\n',[_最短周長,A2,B2,C2]).
        fail.
program.

周囲が最大の三角形(_棒の長さならび,[A,B,C],_最大周長) :-
        最大周長を得る(_棒の長さならび,_最大周長),
        周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C).

最大周長を得る(_棒の長さならび,_最大周長) :-
        findmax(_周囲,(
                    組み合わせ(_棒の長さならび,3,[A,B,C]),
                    C > A + B,
                    B > A + C,
                    A > B + C,
                    _周囲 is A + B + C),
                _最大周長),!.


周囲が最短の三角形(_棒の長さならび,[A,B,C]) :-
        最短周長を得る(_棒の長さならび,_最短周長),
        周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C).


最短周長を得る(_棒の長さならび,_最短周長) :-
        findmin(_周囲,(
                    組み合わせ(_棒の長さならび,3,[A,B,C]),
                    C > A + B,
                    B > A + C,
                    A > B + C,
                    _周囲 is A + B + C),
                _最短周囲).

周長から三辺を得る(_棒の長さならび,_周長,A,B,C) :-
        組み合わせ(組み合わせ(_棒の長さならび,3,[A,B,C]),
                    組み合わせ(_棒の長さならび,3,[A,B,C]),
                    _周長 is A + B + C,
                    C > A + B,
                    B > A + C,
                    A > B + C.