このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1197620454/580
#  下記のプログラムを関数を用いて実行したいのですが、どのようにすれば良いでしょうか?  
#  回答(できたら簡単な解説)の明記をお願いします。  
#   
#  問題1:入力したプログラムから以下のように出力するプログラムを作成する。  
#  (実行結果例)  
#  文字列を入力: 今日は、晴れです。  
#   
#  今日は、晴れです。  
#  日 す  
#  は で  
#  、 れ  
#  晴 晴  
#  れ 、  
#  で は  
#  す 日  
#  。すでれ晴、は日今  
#   

最初と最後に特別なことをするリスト処理 :-
        write('文字列を入力: '),
        get_line(Line),
        atom_chars(Line,Chars),
        reverse(Chars,Chars2),
        転置([[Chars,Chars2]],_転置されたChars),
        最初と最後だけ特別のことをする([Chars,Chars2],_転置されたChars,L),
        put_lines(L).

最初と最後だけ特別のことをする(L,L1,L) :-
        最初は特別のことをする(L,L1,R1,L2),
        残りの処理(L,R1,L2).

残りの処理(L,L1,X) :-
        最後は特別のことをする(L,L1,X),!.
残りの処理(L,[[A,B]|R1],[S|R2]) :-
        write_formatted_atom(S,'%t %t',[A,B]),
        残りの処理(L,R1,R2).

最初は特別のことをする([Head,_],[_|R1],R1,[S|R2]) :-
        concat_atom(Head,S),!.

最後は特別のことをする([_,Last],[_],[S]) :-
        concat_atom(Last,S),!.

%%%%%%%%%%%%%%% こちらが一般形 %%%%%%%%%%%%%%%%%%%%%%%%%%

最初と最後だけ特別のことをする([A|R1],[B|R2]) :-
        最初は特別のことをする(A,B),
        残りの処理(R1,R2).

残りの処理(L1,X) :-
        最後は特別のことをする(L1,X),!.
残りの処理([A|R1],[B|R2]) :-
        通常の処理(A,B),
        残りの処理(R1,R2).

最初は特別のことをする(A,B) :-
        最初は特別(A,B).

最後は特別のことをする([A],[B]) :-
        最後は特別(A,B).