このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1286978599/672
#  [1] 授業単元:コンピュータ工学 
#  [2] 問題文(含コード&リンク): 
#  入力した値を一桁ずつ足してその合計を表示させよ。 
#  サンプル 
#  input please→31415 
#  3 + 1 + 4 + 1 + 5 = 14 
#  ルール: 
#  stdio以外使わないこと。 
#  配列、シフト演算子、ポインタは使わないこと。 
#  数字の表示はprintfとし、%c %dしか使ってはいけない。 
#  負の数が入力されるまで、入力の動作を繰り返すようにすること。 
#  

入力した値を一桁ずつ足してその合計を表示する :-
        '入力した値を'(_入力した値),
        一桁ずつ足してその合計を表示する(_入力した値).

'入力した値を'(_入力した値) :-
        write('整数を入力してください : '),
        get_line(Line),
        入力した値の診断(Line,_入力した値),!.

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

一桁ずつ足してその合計を表示する(_入力した値) :- _入力した値 < 0,!.
一桁ずつ足してその合計を表示する(_入力した値) :-
        '10の何乗以上か'(0,_入力した値,_10の何乗以上),
        一桁ずつ足してその合計を表示する(_10の何乗以上,_入力した値,0),
        入力した値を(_入力した値の二),
        一桁ずつ足してその合計を表示する(_入力した値の二).

一桁ずつ足してその合計を表示する(0,N,_合計) :-
        write_formatted('%d = %d\n',[N,_合計]),!.
一桁ずつ足してその合計を表示する(M,N,_合計の一) :-
        J is truncate(10 ^ M),
        N1 is N // J,
        N2 is N mod J,
        M1 is M - 1,
        write_formatted('%d + ',[N1]),
        _合計の二 is _合計の一 + N1,
        一桁ずつ足してその合計を表示する(M1,M2,_合計の二).

'10の何乗以上か'(M,N,M) :-
        M2 is M + 1,
        N < truncate(10 ^ M2),!.
'10の何乗以上か'(M1,N,M) :-
        M2 is M1 + 1,
        '10の何乗以上か'(M2,N,M).