このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1284632294/391
#  [1] C言語復習 
#  [2] 1 桁の整数をスーペース区切りで何個か入力する  
#  (EOF で入力の終了とする) と, 下のように隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り, 
#   最後に残った 2 桁 (ただし 3 桁で 1 0 0 が残ったときは満点なのでそこで終了する) で運勢を占う, というプログラムを作成せよ. 
#  0 7 9 5 6 5 7 7 4 2  ← 入力 
#   7 6 4 1 1 2 4 1 6 
#    3 0 5 2 3 6 5 7 
#     3 5 7 5 9 1 2 
#      8 2 2 4 0 3 
#       0 4 6 4 3 
#        4 0 0 7 
#         4 0 7 
#          4 7 
#  

'隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り,最後に残った 2 桁 (ただし 3 桁で 1 0 0 が残ったときは満点なのでそこで終了する) で運勢を占う'(_運勢) :-
        '1 桁の整数をスーペース区切りで何個か入力する'(Line),
        split(Line,[' '],L1),
        '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(0,L1,_運勢情報),
        運勢(_運勢情報,_運勢).

'1 桁の整数をスーペース区切りで何個か入力する'(Line) :-
        write('1 桁の整数をスーペース区切りで何個か入力しなさい : '),
        get_line(Line).

'隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(_,[1,0,0],[1,0,0]) :- !.
'隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(_,[A,B],[A,B]) :- !.
'隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(N,L1,_運勢情報) :-
        concat_atom(L1,' ',S),
        'N桁の空白'(N,_N桁の空白),
        write_formatted('%t%t\n',[_N桁の空白,S]),
        '2桁ずつ桁上がりなしの加算'(L1,L2),
        N2 is N + 1,
        '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(N2,L2,_運勢情報).

'2桁ずつ桁上がりなしの加算'([_],[]) :- !.
'2桁ずつ桁上がりなしの加算'([M1,M2|R1],[M|R2]) :-
        M is (M1 + M2) mod 10,
        '2桁ずつ桁上がりなしの加算'([M2|R1],R2).

運勢([1,0,0],'100点') :- !.
運勢([M,M],'90点') :- !.
運勢([M,N],'80点') :- M > 5,M < N,!.
運勢([M,N],'70点') :- M < 6,M < N,!.
運勢([M,N],'60点') :- M > N,!.

'N桁の空白'(N,_N桁の空白) :-
        findall(' ',(for(0,M,N),\+(M=0)),L),
        concat_atom(L,_N桁の空白).

% 'N桁の空白'(N,_N桁の空白) :- findall(' ',for(1,_,N),L),concat_atom(L,_N桁の空白).
% で良さそうなものだが、これだと0桁の空白を表現できない。