このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1266565626/627
#  ずぶの素人なのですのでお手柔らかにお願いします 
#   
#  今2つのテキストファイルがあって、内容はおおよそ下のようです 
#   
#  --------------テキストA------------------- 
#       fcart1  -0.0000000000E+00 -0.0000000000E+00  1.0770536961E-04 
#               -0.0000000000E+00 -0.0000000000E+00  6.6543134784E-04 
#               -0.0000000000E+00 -0.0000000000E+00 -7.7313671745E-04 
#      getden1        0 
#  ------------------------------------------ 
#   
#  --------------テキストB-------------------- 
#  xred  0.0  0.0  0.047843858990 
#        0.0  0.0  0.000434433306 
#        1/3  2/3  -0.011730466739 
#  #Definition of the planewave basis set 
#  ------------------------------------------ 
#  テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足したいのですが 
#  どのようにしたらいいでしょうか 
#  ご教授お願いします 
# 

テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(_テキストA,_テキストB) :-
    get_lines(_テキストA,LinesA),
    get_lines(_テキストB,LinesB),
    テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC),
    put_lines(_テキストB,LineC).

テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC) :-
    テキストの一番右の列の数値を切り取る(LinesA,LA),
    テキストの一番右の列の数値を切り取る(LinesB,LB),
    加算([LA,LB],LC),    
    テキストBの最終数値要素を置換(LB,LC,LineC).

テキスト一番右の列の数値を切り取る([],[]) :- !.
テキスト一番右の列の数値を切り取る([Line|R1],[V|R2]) :-
    split(Line,[ ],L),
    数値要素が3個以上(L),
    last(L,V),
    テキストAの一番右の列の数値を切り取る(R1,R2).

テキストBの最終数値要素を置換([],_,[]) :- !.
テキストBの最終数値要素を置換([Line|R1],[V|R2],[LineC|R3]) :-
    sPLIT(Line,[ ],L1),
    数値要素が3個以上(L1),    
    length(L1,Len),
    findmax(Nth,(
           for(1,Nth,Len),
           list_nth(Nth,L1,V1),number(V1)),
        LastNth),
    要素番号によるならびの置換(LastNth,V,L1,L3),
    concat_atom(L3,LineC),
    テキストBの最終数値要素を置換(R1,R2,R3),!.
テキストBの最終数値要素を置換([Line|R1],L2,[Line|R3]) :-
    テキストBの最終数値要素を置換(R1,L2,R3),!.

数値要素が3個以上(L1) :-
    count((member(A,L1),number(A)),Count),
    Count >= 3,!.


% *** user: sPLIT / 3 ***
sPLIT(_文字列,_区切り符号ならび,X) :-
        'SPLIT'(_文字列,_区切り符号ならび,Y),
        findall(U,(member(U,Y) , not U = ''),L),
        L = X,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% *** user: 'SPLIT' / 3 ***
'SPLIT'(_文字列,_区切り符号ならび,X) :-
        atom_chars(_文字列,L),
        split_00(L,_区切り符号ならび,Z),
        Z = X,!.

% *** user: split_00 / 3 ***
split_00(_文字ならび,_区切り符号ならび,X) :-
        findall([B,A],(
                    member(A,_区切り符号ならび),atom_chars(A,B)),
                _区切り符号ならびの二),
        split_0(_文字ならび,_区切り符号ならびの二,X).

% *** user: split_0 / 3 ***
split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        _文字ならび = _区切り文字ならび,!.
split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        append(_区切り文字ならび,R,_文字ならび),
        split_1(R,_区切り符号ならび,R2),!.
split_0(L,_区切り符号ならび,X) :-
        split_1(L,_区切り符号ならび,X) .

% *** user: split_1 / 3 ***
split_1([],_,[]) :- !.
split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        _文字ならび = _区切り文字ならび,!.
split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :-
        member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび),
        append(_区切り文字ならび,R,_文字ならび),
        split_2(R,R2,_区切り符号_2,_区切り符号ならび,B),
        split_5(B,C),
        split_0(R2,_区切り符号ならび,X),!.
split_1(_文字ならび,_区切り符号ならび,[C|X]) :-
        split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B),
        _区切り符号 = '',
        split_5(B,C),
        split_0(R2,_区切り符号ならび,X),!.
split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :-
        split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B),
        \+(_区切り符号 = ''),
        split_5(B,C),
        split_0(R2,_区切り符号ならび,X),!.

% *** user: split_2 / 5 ***
split_2([],[],'',_,[]) :- !.
split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        append(_区切り文字ならび,R,_文字ならび),!.
split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!.
split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!.
split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :-
        split_2(R,R2,_区切り符号,_区切り符号ならび,X),!.

% *** user: split / 3 ***
split(_文字列,_区切り符号ならび,X) :-
        sPlit(_文字列,_区切り符号ならび,Y),
        findall(U,(member(U,Y) , not U = ''),L),
        L = X,!.

% *** user: sPlit / 3 ***
sPlit(_文字列,_区切り符号ならび,X) :-
        atom_chars(_文字列,L),
        split_00(L,_区切り符号ならび,Y),
        findall(U,(
                    member(U,Y),
                    \+(member(U,_区切り符号ならび))),
                Z),
        Z = X,!.

% *** user: put_lines / 2 ***
put_lines(_,[]) :- !.
put_lines(File,L) :-
        \+(is_stream(_,File,_)),
        slush_op(File,File_1),
        open(File_1,write,Output),
        put_lines(Output,L),
        close(Output),!.
put_lines(Output,[Line|R]) :-
        is_stream(_,Output,_),
        write(Output,Line),
        write(Output,'\n'),
        put_lines(Output,R),!.