このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/350
#  [1] 授業単元:プログラミングC 
#  [2] 問題文(含コード&リンク):整数 mとnを入力して m+(m+1)+(m+2)+…+n 
#  を出力するプログラムを作成しろ 
#  
%  馬鹿正直に、m+(m+1)+(m+2)+…+n をプログラムとして書こうとしたら
%  どのような困難があるかということを示す。

'整数 mとnを入力して m+(m+1)+(m+2)+…+nを出力するプログラムを作成しろ' :-
        '整数 mとnを入力して'(_m,_n),
        'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S),
        '_m,_n,の値と適用するための工夫をする'(S,S2),
        文字列を項に変換する(S2,P,VL),
        '表示文字列Xの表すものは変数Xである'(VL,X),
        call(P),
        '_mをmに_nをnに変換すると'(S,S3),
        writef('%t = %t\n',[S3,X]).

'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S) :-
        _n_1 is _n - _m - 1,
        findall(S1,(
                    for(1,N,_n_1),
                    concat_atom(['(_m+',N,')'],S1)),
                L),
        concat_atom(L,'+',S),!.

'_m,_n,の値と適用するための工夫をする'(S1,S2) :-
        concat_atom(['_m=',_m,',_n=',_n,',',X is S1,'+_n'],S2),!.

'表示文字列Xの表すものは変数Xである'(VL,X) :-
        member('X'=X,VL).

文字列を項に変換する(S,P,VL) :-
        atom_to_term(S,P,VL),!.

'_mをmに_nをnに変換すると'(S1,S2) :-
        atom_chars(S1,Chars),
       'ならびの_mをmに_nをnに変換すると'(L1,L2),
        atom_chars(S2,L2),!.

'ならびの_mをmに_nをnに変換すると'([],[]) :-!.
'ならびの_mをmに_nをnに変換すると'(['_',m|R1],[m|R2]) :-
        'ならびの_mをmに_nをnに変換すると'(R1,R2),!.
'ならびの_mをmに_nをnに変換すると'(['_'|n],[n|R2]) :-
        'ならびの_mをmに_nをnに変換すると'(R1,R2),!.
'ならびの_mをmに_nをnに変換すると'([A|R1],[A|R2]) :-
        'ならびの_mをmに_nをnに変換すると'(R1,R2),!.

'整数 mとnを入力して'(_m,_n) :-
        write('m + 1 < n となるように'),
        整数を入力(_m),
        整数を入力(_n),
        '整数 mとnを入力診断'(_m,_n),!.
'整数 mとnを入力して'(_m,_n) :-
        '整数 mとnを入力して'(_m,_n).

整数を入力(_整数) :-
        write('整数を入力しなさい : '),
        get_line(Line),
        整数入力診断(Line,_整数),!.
整数を入力(_整数) :-
        整数を入力(_整数).

整数入力診断(Line,_整数) :-
        atom_to_term(Line,_整数,_),
        integer(_整数),!.
整数入力診断(Line,_整数) :-
        writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]),
        fail.

'整数 mとnを入力診断'(_m,_n) :-
        _n > _m + 1,!.
'整数 mとnを入力診断'(_m,_n) :-
        write('m + 1 < n でなくてはなりません。再入力をお願いします。'),
        fail.