このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/829
#  [1] 授業単元:プログラミング基礎 
#  [2] 問題文(含コード&リンク): 
#  ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。 
#  入力された順番と同じになったら表示終了とする。 
#  例 abcd 
#      bcda 
#      cdab 
#    dabc 
#      abcd 
#   
#  ポインタを使うと思います。それから、strlen(c)を使うようです。 
#  

'ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。' :-
        'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列),
        '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列).

'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :-
        write('半角英数字の文字列を入力してください : '),
        get_line(Line),
        'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列),!.
'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :-
        'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列).

'ユーザーに入力させた半角英数字の文字列入力検査'(Line,Line) :-
        atom_codes(Line,Codes),
        \+((append(_,[N|_],Codes),
            半角英数字のコード(N))),!.
'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列) :-
        writef('入力された %t には半角英数字以外の文字が含まれています。再入力をお願いします。\n',[Line]),
        fail.

半角英数字のコード(N) :- N >= 48,N =< 57,!.
半角英数字のコード(N) :- N >= 65,N =< 90,!.
半角英数字のコード(N) :- N >= 97,N =< 122,!.

'一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列) :-
        入力された文字列を表示する(_半角英数字の文字列),
        '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列,_一文字ずらした文字列),
        '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列).

'一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_文字列) :-
        入力された順番と同じになったら表示終了とする。',!.
'一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_半角英数字の文字列) :-
        '一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列),
        '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列).

'一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列) :-
        sub_atom(_文字列,0,1,R,_先頭文字),
        sub_atom(_文字列,1,R,0,_残り文字列),
        concat_atom([_残り文字列,_先頭文字],_一文字ずらした文字列),
        writef('%t\n',[_一文字ずらした文字列]).

入力された文字列を表示する(_半角英数字の文字列) :-
        writef('%t\n',[_半角英数字の文字列]).

入力された順番と同じになったら表示終了とする。'.

%  
%  一文字ずらしてというところが、「先読み」的な制御となり、ややこしい。
%