このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/822
#  [1] 授業単元:c言語プログラミング 
#  [2] 問題文(含コード&リンク):(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、 
#  左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむプログラムを作りなさい。 
#  (この場合、左が1と1かつ真ん中が2と2で右が3と4なので4の方が大きいので(1,2,4)を削除する) 
#  

'(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ' :-
       get_chars('list.txt',Chars),
       '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars).

'左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars) :-
        ならびに変換(Chars,LL1),
        '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2),
        'link2.txtに書きこむ'(LL2).

ならびに変換([],[]).
ならびに変換(['('|R1],[[A,B,C]|R2]) :-
        append(L0,[)|R3],R1),
        concat_atom(L0,S),
        atom_to_term(S,(A,B,C),_),
        ならびに変換(R3,R2),!.
ならびに変換([_|R1],R2) :-
        ならびに変換(R1,R2).

'左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2) :-
        左の数字と真ん中の数字でグループを作る(LL1,LL3),        
        グループの中の最小ならびを蒐める(LL3,LL2).

左の数字と真ん中の数字でグループを作る(LL1,LL3) :-
        findsetof([A,B],(
                    append(_,[[A,B,_]|_],LL1)),
                  LL3).

グループの中の最小ならびを蒐める(LL3,LL2) :-
        findall(L,(
                     グループの中での最小ならび(LL3,L)),
                LL2).

グループの中での最小ならび(LL3,L) :-
        append(_,[[A,B]|_],LL3),
        findmin([A,B,C],(
                    append(_,[[A,B,C]|_],LL1)),
                L).

'link2.txtに書きこむ'(LL2) :-
        open('link2.txt',write,Outstream),
        'link2.txtに書きこむ'(Outstream,LL2),
        close(Outstream).

'link2.txtに書きこむ'(Outstream,LL2) :-
        append(_,[[A,B,C]|R],LL2),
        writef(Outstream,'(%t,%t,%t) ',[A,B,C]),
        R = [],
        最後に改行(Outstream).

最後に改行(Outstream) :-
        write(Outstream,'\n').