?- 'a##'. c158-836#
このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/836
#  【質問テンプレ】 
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク): 
#  文字列の操作 
#  キーボードから複数(50以内)の文字列(20文字以内)を入力する。 
#  入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。 
#  次に、入力した文字列の第1文字のアルファベット('a'〜'z','A'〜'Z')を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。 
#  なお、アルファベット以外の文字は変換しないこと。 
#  

'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。' :-
        '文字列(20文字いない)を入力する'(_文字列),
        'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(_文字列,_文字列ならび),
        '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'(_文字列ならび).


'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(_文字列,[]) :-
        sub_atom(_文字列,0,1,_,'0'),!.
'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(50,_文字列,[_文字列]) :- !.
'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(N,_文字列,[_文字列|R]) :-
        '文字列(20文字いない)を入力する'(_次の文字列),
        N_2 is N + 1,
        'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(N_2,_次の文字列,R).

'文字列(20文字いない)を入力する'(_文字列) :-
        get_char(_最初の文字),
        '文字列(20文字いない)を入力する'(_最初の文字,_文字ならび),
        '20文字いない'(_文字ならび,_文字列).

'文字列(20文字いない)'(_文字ならび,_文字列) :-
        length(_文字ならび,_要素数),
        '20文字いないに補正'(_要素数,_文字ならび,_文字列).

'20文字いないに補正'(_要素数,_文字ならび,_文字列) :-        
        _要素数 > 20,
        atom_chars(_文字列_1,_文字ならび),
        sub_atom(_文字列_1,0,20,_,_文字列).
'20文字いないに補正'(_要素数,_文字ならび,_文字列) :-        
        _要素数 =< 20,
        atom_chars(_文字列,_文字ならび).

'文字列(20文字いない)を入力する'('\n',[]) :- !.
'文字列(20文字いない)を入力する'(_文字,[_文字]) :-
         get_char(_次の文字),
         '文字列(20文字いない)を入力する'(N,_文字,[_文字]).

'次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'([],[]).
'次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'([_文字列|R1],[_変換された文字列|R2]) :-
        '入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して'(_文字列,_変換された文字列),
        表示する(_変換された文字列),
        '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'(R1,R2).


'入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して'(_文字列,_変換された文字列) :-
        sub_atom(_文字列,0,1,_残り文字数,_第1文字),
        sub_atom(_文字列,1,_残り文字列,_,_残りの文字列),
        to_upper(_第一文字,_大文字化した文字),
        to_lower(_残り文字列,_小文字化した文字),
        atomic_list_concat([_大文字化した文字,_小文字化した文字],_変換された文字列).

表示する(_変換された文字列) :-
       writef('%t\n',[_変換された文字列]).


%  最初、文字列を20文字まで読み取る部分はきっちり、20文字を越えたら述語を
%  終了させていた。これだと、20文字以上の部分がキーボードバッファ上に残って
%  しまい、次の入力機会に、この文字列から入力されてしまう可能性がある。
%  それで、文字数がオーバーしても、改行まで読み取りオーバーしている場合は
%  切り取る方針にした。