このディレクトリの索引
#  お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り 
#  合計を同じフォーマット文字列で返す。 
#  例 
#  "18,446,744,073,709,551,616" 
#  "1,099,511,627,776" 
#    ↓ 
#  "18,446,745,173,221,179,392"
#   

'お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り合計を同じフォーマット文字列で返す。'(_文字列_1,_文字列_2,_文字列_3) :-
        カンマ区切り文字列を数値に戻す(_文字列_1,_数値_1),
        カンマ区切り文字列を数値に戻す(_文字列_2,_数値_2),
        _数値_3 is _数値_1 + _数値_2,
        数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値_3,_文字列_3).

カンマ区切り文字列を数値に戻す(_文字列,_数値) :-
        findall(_文字,(
                    sub_atom(_文字列,_,1,_,_文字),
                    \+(_文字=',')),
                _数字文字ならび),
        number_chars(_数値,_数字文字ならび).

数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値,_カンマが挿入された文字列) :-
        number_chars(_数値,_数字ならび),
        length(_数字ならび,_桁),
        atomic_list_concat(_数字ならび,_カンマが挿入されていない数字文字列),
        _剰余 is _桁 mod 3,
        数字文字列にカンマを挿入(_剰余,_カンマが挿入されていない数字文字列,_カンマが挿入された文字列).

数字文字列にカンマを挿入(0,_カンマが挿入されていない数字文字列,_カンマが挿入された数字文字列) :-
        findall(_3字文字列,(
                    sub_atom(_カンマが挿入されていない数字文字列,St,3,R,_3字文字列),
                    0 is St mod 3),
                L),
        atomic_list_concat(L,',',_カンマが挿入された数字文字列),!.
数字文字列にカンマを挿入(N,_数字文字列,_カンマが挿入された数字文字列) :-
        sub_atom(_数字文字列,0,N,R,_先頭文字列),
        sub_atom(_数字文字列,_,R,0,_残り文字列),
        数字文字列にカンマを挿入(0,_残り文字列,_カンマが挿入された数字文字列_1),
        atomic_list_concat([_先頭文字列,',',_カンマが挿入された数字文字列_1],_カンマが挿入された数字文字列).