このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1328276597/522
#  [1] 授業単元: 情報処理 
#  [2] 問題文 
#  (1) 
#  http://ime.nu/ideone.com/F0NZo 
#   
#  上記のプログラムはオープンするファイルが abc に限られている。 
#  キーボードからファイル名を読み込んで、そのファイルをオープンするように変更せよ。 
#   

'キーボードからファイル名を読み込んで、そのファイルをオープンする'(_ストリーム,_診断) :-
        'キーボードからファイル名を読み込んで'(_ファイル名),
        'そのファイルをオープンする'(_ファイル,_ストリーム,_診断).

'キーボードからファイル名を読み込んで'(_ファイル名) :-
        write('ファイル名を入力して下さい : '),
        get_line(Line),
        'キーボードから読み込んだファイル名診断'(Line,_ファイル名,_診断).
'キーボードからファイル名を読み込んで'(_ファイル名) :-
        'キーボードからファイル名を読み込んで'(_ファイル名).

'キーボードから読み込んだファイル名診断'(Line,Line,正常なファイル名) :-
        '入力文字列がファイル名として許された文字のみからなる'(Line),
        'ピリオドは存在したとしても一箇所で、最初の文字と最後の文字はピリオドでない'(Line),!.
'キーボードから読み込んだファイル名診断'(Line,_,ファイル名になれない) :-
        writef('入力された %t はファイル名になりません。再入力をお願いします。\n',[Line]),
        fail.

'そのファイルをオープンする'(_ファイル,_ストリーム,正常終了) :-
        catch(open(_ファイル,read,_ストリーム),_エラー情報,オープンエラー(_エラー情報)),!.
'そのファイルをオープンする'(_,_,異常終了).

'入力文字列がファイル名として許された文字のみからなる'(Line) :-
        atom_codes(Line,Codes),
        全ての文字はアルファベット(Codes),!.

'ピリオドは存在したとしても一箇所で、最初の文字と最後の文字はピリオドでない'(Line) :-
        split(Line,['.'],[_,_]),!.
'ピリオドは存在したとしても一箇所で、最初の文字と最後の文字はピリオドでない'(Line) :-
        split(Line,['.'],[_]),!.

オープンエラー(_エラー情報) :-
        writef('ファイルオープンエラー: %t\n',[_エラー情報]),
        fail.