このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/872
#  [1] 授業単元: C言語 
#  [2] 問題文:  
#  簡単な暗号化関数の作成 
#  英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一 
#  引数をASC競魁璽匹韮遒蘯分先に進めた文字を返す関数を作成せよ。 
#  たとえば第1引数が'b'(十進数の98)、第2引数6であった場合は戻り値は'h'(十進数の104)となる。 
#   ただし、大文字を進めた場合に'z'より大きくなる場合には'A'に折り返す。たとえば、'W'を指定し 
#  た場合は'C'が戻り値となる。小文字についても同様に、'z'を超える場合は'a'に折り返す。また、英大 
#  文字・小文字以外が第一引数に与えられた場合は、第1引数をそのまま戻り値とする。 
#   このような関数をcharshift()という名前で作成した上で、この関数を用いて以下の機能を持つプログ 
#  ラムを作成せよ。 
#   
#  「最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。 
#  そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に 
#  出力する」 
#   
#  このプログラムでは以下のような結果が得られる 
#  Input English words. 
#  UDU was established in 1907. (←キーボードからの入力) 
#  Input shift number. 
#  6 (←キーボードからの入力) 
#  AJA cgy kyzghroynkj ot 1907. 
#   

'英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一引数をASCIIコードでn進めた文字を返す'(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :-
        charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字).

charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :-
        member(L,[[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']]),
        nth0(_nth0,L,_文字),
        _シフト is 26 + _シフト幅n - _nth0,
        ならびの回転(左方向,_シフト,L,_第一引数をASCIIコードでn進めた文字),!.

'最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に出力する'
        '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文),
        '次に正整数のシフト幅を入力する'(_シフト幅),
        '英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列),
        一行で出力する(_変換された文字列).

'最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文) :-
        get_line(_文字列),
        '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文),!.

'診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文) :-
        sub_atom(_文字列,0,80,_,_80文字以内の英文),!.
'診断: 最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文,_80文字以内の英文).

'次に正整数のシフト幅を入力する'(_シフト幅) :-
        整数を得る(正整数のシフト幅,_シフト幅).

'英文字のすべての文字を指定されたシフト幅だけcharsshiftで変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列) :-
        findall(_変換された文字,(
                    sub_atom(_80文字以内の英文,_,1,_,_英文字),
                    charsshift(_英文字,_シフト幅,_変換された文字)),
                _変換された文字ならび),
        atomic_list_concat(_変換された文字ならび,_変換された文字列).

一行で出力する(_変換された文字列) :-
        writef('%t\n',[_変換された文字列]).