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


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

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

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

行を数に変換(_行,_数) :-
        catch(read_term_from_atom(_行,_数,[]),E,fail),
        数である(_数).

数である(_数) :-
        number(_数),!.
数である(_分子 rdiv _分母) :-
        数である(_分子),
        数である(_分母).

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

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

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

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

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

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

行入力(_入力ストリーム,_行) :-
read_line_to_codes(_入力ストリーム,Codes),
atom_codes(_行,Codes).

get_line(X) :-
read_line_to_codes(current_input,Codes),
atom_codes(X,Codes).

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


部分ならび(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).