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

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

'診断: 自然数を得る'(end_of_file,_自然数を含む条件,end_of_file) :- !.
'診断: 自然数を得る'('',_,_) :- !,fail.
'診断: 自然数を得る'(_行,_自然数を含む条件,_自然数) :-
        atom_number(_行,_自然数),
        自然数(_自然数),
        '診断: 自然数を含む条件'(_自然数,_自然数を含む条件),!.
'診断: 自然数を得る'(_行,_自然数を含む条件,_自然数) :-
        \+((atom_number(_行,_自然数),自然数(_自然数))),
        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]),
                    自然数を得る(_催促文,_自然数)),_自然数ならび).

自然数(_自然数) :-
        integer(_自然数),
        _自然数 >= 0.

行入力(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([].