このディレクトリの索引
#  
#  整数を入力する場合の一般型
#  

整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :-
        list(_催促文ならび),
        findall(_整数,(
                    member(_催促文,_催促文ならび),
                    整数を得る(Instream,_催促文,_整数を含む条件,_整数)),_整数ならび),!.
整数を得る(Instream,_催促文,_整数を含む条件,_整数) :-
        催促文の出力(_催促文),
        行入力(Instream,_行),
        '診断: 整数を得る'(_行,_整数を含む条件,_整数),!.
整数を得る(Instream,_催促文,_整数を含む条件,_整数) :-
        整数を得る(Instream,_催促文,_整数を含む条件,_整数).

'診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !.
'診断: 整数を得る'('',_,_) :- !,fail.
'診断: 整数を得る'(_行,_整数を含む条件,_整数) :-
        atom_number(_行,_整数),
        integer(_整数),
        '診断: 整数を含む条件'(_整数,_整数を含む条件),!.
'診断: 整数を得る'(_行,_整数を含む条件,_整数) :-
        \+((atom_number(_行,_整数),integer(_整数))),
        writef('入力された %w からは数が得られません。再入力をお願いします。\n',[_行]),
        fail.

'診断: 整数を得る'(end_of_file,end_of_file) :- !.
'診断: 整数を得る'('',_) :- !,fail.
'診断: 整数を含む条件'(_整数,_整数を含む条件) :-
        call(_整数を含む条件),!.
'診断: 整数を含む条件'(_整数,_整数を含む条件) :-
        writef('入力された %w は %w が偽となります。\n',[_整数,_整数を含む条件]),
        fail.

整数を得る(_催促文,_整数を含む条件,_整数) :-
        整数を得る(current_input,_催促文,_整数を含む条件,_整数).

整数を得る(_催促文,_整数) :-
        整数を得る(current_input,_催促文,true,_整数).

整数を得る(_整数) :-
        整数を得る(current_input,'',true,_整数).

催促文の出力('') :- !.
催促文の出力(_催促文) :-
        writef('%wを入力してください : ',[_催促文]).

n個の整数を得る(_n,_催促文,_整数ならび) :-
        length(_整数ならび,_n),
        findall(_整数,(
                    部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3),
                    writef('[%w/%w]番目の',[_何番目,_n]),
                    整数を得る(_催促文,_整数)),_整数ならび).

行入力(Stream,_行) :-
        read_line_to_codes(Stream,Codes),
        atom_codes(_行,Codes).

行入力(_行) :-
        行入力(current_input,_行).

部分ならび(L,Len1,L1,Nth,Len2,L2,Len3,L3) :-
append([L1,L2,L3],L),
'L1,L2,L3の長さ'(L1,L2,L3,Len1,Len2,Len3),
Nth is Len1 + 1.

部分ならび(L,Len1,L1,Len2,L2,Len3,L3) :-
append([L1,L2,L3],L),
'L1,L2,L3の長さ'(L1,L2,L3,Len1,Len2,Len3).

'L1,L2,L3の長さ'(L1,L2,L3,Len1,Len2,Len3) :-
length(L1,Len1),
length(L2,Len2),
length(L3,Len3).

list([_|_]) :- !.
list([].