このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1273368706/397
#  質問です。 
#   
#  例文 
#   
#  int a; 
#   
#  printf("値をいれてください:"); 
#  scanf("%d",&a); 
#   
#  if(a<0&&a<9) 
#  { 
#      printf("値が違います!!"); 
#  } 
#   
#   
#  とこういう文があったとして、aにたとえば10を入力するとエラーメッセージを出してもう一度 
#  入力させる処理に戻りたいんですがなにを付け加えればいいですか? 
#   

範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :-
        write('整数を入力してください : '),
        get_line(_行),
        atom_to_term(_行,_入力データ,_),
        範囲検査(_入力データ),!.
範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :-
        write_formatted('値が範囲を外れています\n'),
        範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ).

% 上の定義ではエラーメッセージに入力した値を含ませることができない。バックトラックして第二節が
% 選択される時には論理変数 _行 や _入力データ は束縛が解かれてしまっている。一般的には以下のような定義となる

範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :-
        write('整数を入力してください : '),
        get_line(_行),
        atom_to_term(_行,_入力データ,_),
        範囲検査(_入力データ),!.
範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :-
        範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ).

範囲検査(_入力データ) :- integer(_入力データ),_入力データ > 0,_入力データ < 9,!.
範囲検査(_入力データ) :- integer(_入力データ),write_formatted('値%tは範囲を外れています\n',[_入力データ]),!,fail.
範囲検査(_入力データ) :- \+(integer(_入力データ)),write('整数が入力されませんでした\n'),!,fail.