%文字列置換 %
%このディレクトリの索引

% *** user: '文字列置換' / 5 ***
'文字列置換'(_文字列,_置換述語,_要素変数,_置換変数,_置換された文字列) :-
    atom_chars(_文字列,_ならび),
    '全要素に適用して置換'(_ならび,_置換述語,_要素変数,_置換変数,_置換ならび),
    concat_atom(_置換ならび,_置換された文字列),
    ! .

% *** user: '文字列置換' / 4 ***
'文字列置換'(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列) :-
    replace(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列),
    ! .

% *** user: replace_all / 4 ***
replace_all('',A,B,'') :-
    ! .
replace_all(String,S1,'',X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    replace_31(StringL,S1L,Y),
    concat_atom(Y,X),
    ! .
replace_all(String,S1,S2,X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    atom_chars(S2,S2L),
    replace_41(StringL,S1L,S2L,Y),
    concat_atom(Y,X),
    ! .

% *** user: replace / 4 ***
replace(String,S1,'',X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    replace_3(StringL,S1L,Y),
    concat_atom(Y,X),
    ! .
replace(String,S1,S2,X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    atom_chars(S2,S2L),
    replace_4(StringL,S1L,S2L,Y),
    concat_atom(Y,X),
    ! .

% *** user: replace_3 / 3 ***
replace_3(L,L1,R) :-
    append(L1,R,L),
    ! .
replace_3([A|R],L1,[A|R2]) :-
    replace_3(R,L1,R2) .
% *** user: replace_4 / 4 ***
replace_4(L,L1,L2,R2) :-
    append(L1,R,L),
    append(L2,R,R2),
    ! .
replace_4([A|R],L1,L2,[A|R2]) :-
    replace_4(R,L1,L2,R2) .

% *** user: replace_31 / 3 ***
replace_31([],_,[]) :-
    ! .
replace_31(L,L1,Y) :-
    append(L1,R,L),
    replace_31(R,L1,Y),
    ! .
replace_31([A|R],L1,[A|R2]) :-
    replace_31(R,L1,R2) .

% *** user: replace_41 / 4 ***
replace_41([],_,_,[]) :-
    ! .
replace_41(L,L1,L2,R2) :-
    append(L1,R,L),
    replace_41(R,L1,L2,R3),
    append(L2,R3,R2),
    ! .
replace_41([A|R],L1,L2,[A|R2]) :-
    replace_41(R,L1,L2,R2) .

% *** user: '全要素に適用して置換' / 5 ***
'全要素に適用して置換'(L,P,Element,_置換変数,X) :-
    length(L,Len),
    findall(U,(for(1,N,Len) , list_nth(N,L,A,Element,C) , (error_protect(P,fail) , U = _置換変数 ; \+(error_protect(P,fail)) , U = Element)),X) .

% *** user: 'split' / 3 ***
split(_文,_区切り語ならび,_区切られた語ならび) :-
    区切り語ならびの変形(_区切り語ならび,SeparatersL),
    atom_chars(_文,_文字ならび),
    split_1(_文字ならび,SeparatersL,_区切られた語ならび).

% *** user: 'split_1' / 3 ***
split_1([],SeparatersL,[]).
split_1(L1,SeparatersL,[A|R]) :-
    \+(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    \+(L2=[]),
    atom_chars(A,L2),
    split_1(R2,SeparatersL,R).
split_1(L1,SeparatersL,X) :-
    \+(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    L2=[],
    split_1(R2,SeparatersL,X).

% *** user: 'split_2' / 4 ***
split_2([],_,[],[]).
split_2(L1,SeparatersL,[],R) :-
    member(L2,SeparatersL),
    append(L2,R,L1).
split_2([A|R1],SeparatersL,[A|R2],R) :-
    \+((member(L2,SeparatersL),append(L2,_,[A|R1]))),
    split_2(R1,SeparatersL,R2,R).

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

% *** user: 'atomList2charsList' / 2 ***
atomList2charsList([],[]) :- !.
atomList2charsList([A|R1],[L|R2]) :-
    atom_chars(A,L),
    atomList2charsList(R1,R2).

%
%