このディレクトリの索引

% これはsplitをわかりやすいように簡略化した定義です。
% より完全なsplit/3の定義はこちらをご覧ください
%

split(_文,_区切り語ならび,_区切られた語ならび) :-
        区切り語ならびの変形(_区切り語ならび,SeparatersL),
        atom_chars(_文,_文字ならび),
        split_list_1(_文字ならび,SeparatersL,_区切られた語ならび).

sPLIT(_文字列,_区切り符号ならび,X) :-
        'SPLIT'(_文字列,_区切り符号ならび,Y),
        findall(U,(
                    member(U,Y),
                    \+(U = '')),
                L),
        L = X,!.

'SPLIT'(_文字列,_区切り符号ならび,X) :-
        atom_chars(_文字列,L),
        split_00(L,_区切り符号ならび,Z),
        Z = X,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

split_list([],SeparatersL,[]).
split_list(L1,SeparatersL,[L2|R]) :-
        \+(L1=[]),
        split_list_2(L1,SeparatersL,L2,R2),
        \+(L2=[]),
        split_list(R2,SeparatersL,R).
split_list(L1,SeparatersL,X) :-
        \+(L1=[]),
        split_list_2(L1,SeparatersL,L2,R2),
        L2=[],
        split_list(R2,SeparatersL,X).

split_list_1([],SeparatersL,[]).
split_list_1(L1,SeparatersL,[A|R]) :-
        \+(L1=[]),
        split_list_2(L1,SeparatersL,L2,R2),
        \+(L2=[]),
        atom_chars(A,L2),
        split_list_1(R2,SeparatersL,R).
split_list_1(L1,SeparatersL,X) :-
        \+(L1=[]),
        split_list_2(L1,SeparatersL,L2,R2),
        L2=[],
        split_list_1(R2,SeparatersL,X).

split_list_2([],_,[],[]).
split_list_2(L1,SeparatersL,[],R) :-
        member(L2,SeparatersL),
        append(L2,R,L1).
split_list_2([A|R1],SeparatersL,[A|R2],R) :-
        \+((member(L2,SeparatersL),append(L2,_,[A|R1]))),
        split_list_2(R1,SeparatersL,R2,R).

区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :-
        sort(_区切り語ならび,_昇順の区切り語ならび),
        reverse(_昇順の区切り語ならび,_降順の区切り語ならび),
        atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび).

atomList2charsList([],[]) :- !.
atomList2charsList([A|R1],[L|R2]) :-
        atom_chars(A,L),
        atomList2charsList(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

split_00(_文字ならび,_区切り符号ならび,X) :-
        findall([B,A],(
                    member(A,_区切り符号ならび),
                    atom_chars(A,B)),
                _区切り符号ならびの二),
        split_0(_文字ならび,_区切り符号ならびの二,X).


split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        _文字ならび = _区切り文字ならび,!.
split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        append(_区切り文字ならび,R,_文字ならび),
        split_1(R,_区切り符号ならび,R2),!.
split_0(L,_区切り符号ならび,X) :-
        split_1(L,_区切り符号ならび,X).

split_1([],_,[]) :- !.
split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        _文字ならび = _区切り文字ならび,!.
split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :-
        member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび),
        append(_区切り文字ならび,R,_文字ならび),
        split_2(R,R2,_区切り符号_2,_区切り符号ならび,B),
        split_5(B,C),
        split_0(R2,_区切り符号ならび,X),!.
split_1(_文字ならび,_区切り符号ならび,[C|X]) :-
        split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B),
        _区切り符号 = '',
        split_5(B,C),
        split_0(R2,_区切り符号ならび,X),!.
split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :-
        split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B),
        \+(_区切り符号 = ''),
        split_5(B,C),
        split_0(R2,_区切り符号ならび,X),!.

split_2([],[],'',_,[]) :- !.
split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        append(_区切り文字ならび,R,_文字ならび),!.
split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!.
split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!.
split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :-
        split_2(R,R2,_区切り符号,_区切り符号ならび,X),!.


split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :-
        split_4(R,R2,_区切り符号,_区切り符号ならび,X),!.
split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_4(R,R2,_区切り符号,_区切り符号ならび,X),!.

split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :-
        split_4(R,R2,_区切り符号,_区切り符号ならび,X),!.
split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_2(R,R2,_区切り符号,_区切り符号ならび,X),!.
split_4([],[],'',_,[]) :- !.

split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :-
        split_4(R,R2,_区切り符号,_区切り符号ならび,X),!.


split_5([],'') :- !.
split_5(B,C) :-
        numeric_list(B,NL),
        catch(atom_chars(C,NL),_,fail),!.
split_5(B,C) :-
        concat_atom(B,C),!.

split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :-
        split_42(R,R2,_区切り符号,_区切り符号ならび,X),!.
split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_42(R,R2,_区切り符号,_区切り符号ならび,X),!.

split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :-
        split_42(R,R2,_区切り符号,_区切り符号ならび,X),!.
split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_2(R,R2,_区切り符号,_区切り符号ならび,X),!.
split_42([],[],'',_,[]) :- !.

numeric_list([],[]) :- !.
numeric_list([A|R],[B|R1]) :-
        digit(A),
        char_code(A,B),
        numeric_list(R,R1),!.
numeric_list(['.'|R],[46|R1]) :-
        numeric_list(R,R1),!.
numeric_list([-|R],[45|R1]) :-
        numeric_list(R,R1),!.

number(A,B) :-
        number_codes(A,B).