このディレクトリの索引
#  
#  文字列から数字列を検索する
#  


数字文字列を検索してその数値を得る(_文字列,_前文字列,_数字文字列,_後文字列,_数値) :-
        数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列),
        その数値を得る(_数字文字列,_数値).

数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列) :-
        数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列).

その数値を得る(_数字文字列,_数値) :-
        atom_number(_数字文字列,_数値).

数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列) :-
        '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列),
        前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列),
        後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列).

'前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列) :-
        sub_atom(_文字列,_開始点,_長さ,_残り長さ,_数字文字列),
        _長さ > 0,
        数字文字列である(_数字文字列),
        sub_atom(_文字列,0,_開始点,_,_前文字列),
        sub_atom(_文字列,_,_残り長さ,0,_後文字列).

前文字列が空文字であるか前文字列の最後の文字が数字ではない('').
前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列) :-
        sub_atom(_前文字列,_,1,0,_文字),
        符号とピリオドを含む数字ではない(_文字).

後文字列が空文字であるか後文字列の最初の文字が数字ではない('').
後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列) :-
        sub_atom(_後文字列,0,1,_,_文字),
        符号とピリオド含む数字ではない(_文字).

符号とピリオドを含む数字である('+').
符号とピリオドを含む数字である('-').
符号とピリオドを含む数字である('.').
符号とピリオドを含む数字である(_文字) :-
        数字である(_文字).

符号とピリオドを含む数字ではない(_文字) :-
        \+(符号とピリオドを含む数字である(_文字)).

数字である(_文字) :-
        _文字 @>= '0',
        _文字 @=< '9'.

数字ではない(_文字) :-
        \+(数字である(_文字)).


数字文字列である(_数字文字列) :-
        'IEEE974等の浮動小数点数表示形式'(_数字文字列).
数字文字列である(_数字文字列) :-
        全ての文字が数字である(_数字文字列),
        \+(数字列の禁則(_数字文字列)).

全ての文字が符号とピリオドを含む数字である(_数字文字列) :-
        forall(sub_atom(_数字文字列,_,1,_,_文字),符号とピリオドを含む数字である(_文字)).

全ての文字が数字である(_数字文字列) :-
        forall(sub_atom(_数字文字列,_,1,_,_文字),数字である(_文字)).

'IEEE974等の浮動小数点数表示形式'(_数字文字列) :-
        sub_atom(_数字文字列,S,2,R,_二文字),
        member(_二文字,['E+','E-','e+','e-']),
        二文字は先頭または末尾にはこない(S,R),
        前後文字列の形式が正しい(_数字文字列,S,R).

二文字は先頭または末尾にはこない(S,R) :-
        S > 0,
        R > 0.

前後文字列の形式が正しい(_数字文字列,S,R) :-
        sub_atom(_数字文字列,0,S,_,_数字文字列_1),
        sub_atom(_数字文字列,_,S,0,_数字文字列_2),
        全ての文字が符号とピリオドを含む数字である(_数字文字列_1),
        全ての文字が数字である(_数字文字列_2).

数字列の禁則(_数字文字列) :-
        ピリオドが2個以上ある(_数字文字列),!.
数字列の禁則(_数字文字列) :-
        ピリオドが先頭文字か末尾文字にある(_数字文字列),!.
数字列の禁則(_数字文字列) :-
        'ピリオドの前後に+か-がある'(_数字文字列),!.
数字列の禁則(_数字文字列) :-
        '+が先頭文字以外にある'(_数字文字列),!.
数字列の禁則(_数字文字列) :-
        '-が先頭文字以外にある'(_数字文字列),!.

ピリオドが2個以上ある(_数字文字列) :-
        findall(1,sub_atom(_数字文字列,_,1,_,'.'),L),
        length(L,_度数),
        _度数 > 1,!.

ピリオドが先頭文字か末尾文字にある(_数字文字列) :-
        sub_atom(_数字文字列,0,1,_,'.'),!.
ピリオドが先頭文字か末尾文字にある(_数字文字列) :-
        sub_atom(_数字文字列,_,1,0,'.'),!.

'ピリオドの前後に+か-がある'(_数字文字列) :-
        sub_atom(_数字文字列,_,2,_,'+.'),!.
'ピリオドの前後に+か-がある'(_数字文字列) :-
        sub_atom(_数字文字列,_,2,_,'-.'),!.
'ピリオドの前後に+か-がある'(_数字文字列) :-
        sub_atom(_数字文字列,_,2,_,'.+'),!.
'ピリオドの前後に+か-がある'(_数字文字列) :-
        sub_atom(_数字文字列,_,2,_,'.-'),!.

'+が先頭文字以外にある'(_数字文字列) :-
        sub_atom(_数字文字列,_開始点,1,_,'+'),
        _開始点 > 0,!.

'-が先頭文字以外にある'(_数字文字列) :-
        sub_atom(_数字文字列,_開始点,1,_,'-'),
        _開始点 > 0,!.