このディレクトリの索引

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% ユーティリティ述語 sub_atom/10 の提案%
% A .. 文字列 (atom)
% S .. 検索文字列開始変位 (integer)
% L .. 検索文字列の長さ (integer)
% R .. 残り長さ (integer)
% H .. 検索文字列より前側の文字列 (atom)
% X .. 検索文字列 (atom)
% T .. 検索文字列より後の残り文字列 (atom)
% HL .. 検索文字列より前側の文字ならび (chars)
% XL .. 検索文字列文字ならび (chars)
% TL .. 検索文字列より後の残り文字ならび (chars)
% A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 
%

sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :-
    atom(A),
    !,
    sub_atom(A,S,L,R,X),
    sub_atom(A,0,S,_,H),
    N is S + L,
    sub_atom(A,N,R,_,T),
    atom_chars(H,HL),
    atom_chars(X,XL),
    atom_chars(T,TL).

sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :-
    var(A),
    !,
    atom_chars(H,HL),
    atom_chars(X,XL),
    atom_chars(T,TL),
    length(HL,S),
    length(XL,L),
    length(TL,R),
    concat_atom([H,X,T],A),
    sub_atom(A,S,L,R,H,X,T,HL,XL,TL).

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

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

split_1([],SeparatersL,[]).
split_1(L1,SeparatersL,[A|R]) :-
    not(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    not(L2=[]),
    atom_chars(A,L2),
    split_1(R2,SeparatersL,R).
split_1(L1,SeparatersL,X) :-
    not(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    L2=[],
    split_1(R2,SeparatersL,X).

split_2([],_,[],[]).
split_2(L1,SeparatersL,[],R) :-
    member(L2,SeparatersL),
    append(L2,R,L1).
split_2([A|R1],SeparatersL,[A|R2],R) :-
    not((member(L2,SeparatersL),append(L2,_,[A|R1]))),
    split_2(R1,SeparatersL,R2,R).

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

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


% *** user: split / 3 ***
% ?- split('a\n\nbc\n',['\n'],X).
%
% X = [a,bc]
%

split(_文字列,_区切り符号ならび,X) :-
    sPlit(_文字列,_区切り符号ならび,Y),
    findall(U,(member(U,Y) , not U = ''),L),
    L = X,
    ! .

% *** user: sPlit / 3 ***
% ?- sPlit('a\n\nbc\n',['\n'],X).
%
% X = [a,'',bc].
%

sPlit(_文字列,_区切り符号ならび,X) :-
    atom_chars(_文字列,L),
    split_00(L,_区切り符号ならび,Y),
    findall(U,(member(U,Y) , not member(U,_区切り符号ならび)),Z),
    Z = X,
    ! .

% *** user: sPLIT / 3 ***
% ?- sPLIT('a\n\nbc\n',['\n'],X).
%
% X = [a,'\n','\n',bc,'\n']
%

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

% *** user: 'SPLIT' / 3 ***
% ?- 'SPLIT'('a\n\nbc\n',['\n'],X).
%
% X = [a,'\n','','\n',bc,'\n'].
%

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

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

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

% *** user: split_1 / 3 ***
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),
    ! .

% *** user: split_2 / 5 ***
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),
    ! .

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

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

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

% *** user: split_5 / 2 ***
split_5([],'') :-
    ! .
split_5(B,C) :-
    numeric_list(B,Nl),
    number(C,Nl),
    ! .
split_5(B,C) :-
    concat_atom(B,C),
    ! .

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

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

% *** user: split_42 / 4 ***
split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :-
    split_42(R,R2,_区切り符号,_区切り符号ならび,X),
    ! .

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

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

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

concat_atom([A],A) :- !.
concat_atom([A|R],X) :-
    concat_atom(R,Y),
    atom_concat(A,Y,X).

concat_atom([A],Spliter,A) :- !.
concat_atom([A|R],Spliter,X) :-
    concat_atom(R,Spliter,Y),
    atom_concat(A,Spliter,Z),
    atom_concat(Z,Y,X).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  表(或いは行列)形式で与えられたデータをcsvファイル形式で書き出す

put_csv_lines(_csvファイル,_区切り符号,LL) :-
	open(_csvファイル,write,Outstream),
	append(_,[L|R],LL),
	concat_atom(L,_区切り符号,S),
	write_formatted(Outstream,'%t\n',[S]),
	R = [],
	close(Outstream),!.

% concat_atom/3は、concat_atom/2がリストの要素として現れるアトムを結合して一つのアトムを
% 作り上げるのだが、concat_atom/3になると、アトムとアトムの間に区切り符号を挿入しつつ、
% 結合する。区切り符号は一文字で使う場合が多いが、文字列でもよい。


get_bytes(_ファイル,Bytes) :-
	open(_ファイル,read,Instream,[type(binary)]),
	findall(Byte,(
		    repeat,(
			at_end_of_stream(Instream),
			!,
			fail;
			get_byte(Instream,Byte))),
		Bytes),
	close(Instream),!.


put_bytes(_ファイル,Bytes) :-
	open(_ファイル,write,Outstream,[type(binary)]),
	append(_,[Byte|R],Bytes),
	put_byte(Outstream,Byte),
	R = [],
	close(Outstream),!.



get_integer(N) :-
	get_line(Line),
	get_integer_1(Line,N),!.

get_integer(Input,N) :-
	get_line(Input,Line),
	get_integer_1(Input,Line,N),!.

get_integer_1(end_of_file,_) :- !,fail.
get_integer_1(Line,N) :-
	atom_to_term(Line,N,_),
	integer(N),!.
get_integer_1(_,N) :-
	get_line(Line),
	get_integer_1(Line,N).

get_integer_1(_,end_of_file,_) :- !,fail.
get_integer_1(Input,Line,N) :-
	atom_to_term(Line,N,_),
	integer(N),!.
get_integer_1(Input,_,N) :-
	get_line(Input,Line),
	get_integer_1(Input,Line,N).

% list_nth/4 append/3(member/2)の変形

list_nth(N,L0,[A|R],L) :-
	integer(N),
	N > 0,
	M is N - 1,
	length(L0,M),
	append(L0,[A|R],L).
list_nth(N,L0,[A|R],L) :-
	integer(N),
	N < 0,
	N1 is N + 1,
	N2 is abs(N1),
	length(R,N2),
	append(L0,[A|R],L).
list_nth(N,L0,[A|R],L) :-
	var(N),
	append(L0,[A|R],L),
	length(L0,N1),
	N is N + 1.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% ならびのcut 文字列はsub_atom/5でcutし易いがならびは案外面倒

cut(L,[],[]) :- !.
cut(L,[L2|R],[Y|R1])
  :-
    list(L2),
    cut(L,L2,Y),
    cut(L,R,R1),!.
cut(L,[S-(%24)|R],[Y|R1])
  :-
    length(L,Len),
    cut(L,[S-Len|R],[Y|R1]),!.
cut(L,[(^)-E|R],[Y|R1])
  :-
    cut(L,[1-E|R],[Y|R1]),!.
cut(L,[S-E|R],Y)
  :-
    list(L),
    findall(N,for(S,N,E),L2),
    append(L2,R,L3),
    cut(L,L3,Y),!.
cut(L,[S|R],[Y|R1])
  :-
    list(L),
    list_nth(S,L,Y),
    cut(L,R,R1),!.
cut(_対象文字列,_位置情報ならび,_副文字列)
  :-
    atomic(_対象文字列),
    cut(_対象文字列,_位置情報ならび,'',_副文字列),!.
cut(_対象文字列,_位置情報ならび,_区切り文字,_副文字列)
  :-
    atomic(_対象文字列),
    decompcons(_対象文字列,L),
    cut_2(L,_位置情報ならび,_部分ならび),
    concat(_部分ならび,_区切り文字,_副文字列).
cut_2(_,[],[]) :- !.
cut_2(L,[S-E|R],[B|R1])
  :-
    cut(L,[S-E],U),
    concat_atom(U,B),
    cut_2(L,R,R1),!.
cut_2(L,[P|R],[B|R1])
  :-
    cut(L,[P],U),
    concat_atom(U,B),
    cut_2(L,R,R1),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 読み飛ばしはappend/3で実現できる。ただ要素に出会えなかった時にfailすることに注意が必要だ。
% 述語の第一引数、第二引数が逆に定義されていることもあるからこれも注意。

読み飛ばし(_ならび,_要素,_残りのならび) :-
    append(_,[_要素|_残りのならび],_ならび).

読み飛ばし(_ならび,_要素,_読み飛ばしたならび,_残りのならび) :-
    append(_読み飛ばしたならび,[_要素|_残りのならび],_ならび).


% *** user: 要素番号によるならびの置換 / 5 ***
要素番号によるならびの置換(E,E,U,[A|R],[U|R]) :- !.
要素番号によるならびの置換(S,E,U,[A|R],[A|R1]) :-
    S1 is S + 1,
    要素番号によるならびの置換(S1,E,U,R,R1) .

% *** user: 要素番号によるならびの置換 / 4 ***
要素番号によるならびの置換(Pos,U,P,Q) :-
    integer(Pos),
    !,
    要素番号によるならびの置換(1,Pos,U,P,Q) .
要素番号によるならびの置換(Pos,U,P,Q) :-
    \+(integer(Pos)),
    \+(Pos =.. [',',Pos1,Rpos]),
    Pos1 is Pos,
    要素番号によるならびの置換(1,Pos1,U,P,Q) .
要素番号によるならびの置換(Pos,U,P,Q) :-
    Pos =.. [',',Pos1,Rpos],
    要素番号によるならびの置換(1,Pos1,Rpos,U,P,Q) .


swap(A,B,L,LX) :-
    append(L1,[A|L2],[B|L3],L),
    append(L1,[B|L2],[A|L3],LX),!.
swap(A,B,L,LX) :-
    値による,
    append(L1,[B|L2],[A|L3],L),
    append(L1,[A|L2],[B|L3],LX),!.

要素番号によるならびの交換(M,N,_対象ならび,_交換したならび) :-
    要素番号による,
    M1 is M - 1,
    N1 is N - 1,
    append(L1,[A|R1],_対象ならび),
    length(L1,M1),
    append(L2,[B|R2],_対象ならび),
    length(L2,N1),
    append(L1,[B|R1],L3),
    append(L4,[_|R3],L3),
    length(L4,N1),
    append(L4,[A|R3],_交換したならび),!.


% テスト述語を一引数述語にまとめた場合の例。

適切なデータを得るまで入力を得る(_テスト述語,_入力行) :-
	get_line(_入力行),
	functor(Q,_テスト述語,1),
	arg(1,Q,_入力行),
	call(Q),!.
適切なデータを得るまで入力を得る(_テスト述語,_入力行) :-
	write('入力条件に反するデータが入力されました。再入力してください : '),
	適切なデータを得るまで入力を得る(_テスト述語,_入力行).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%[1] 授業単元: プログラミング初歩  
%[2] 問題文(含コード&リンク):(文字列を与えられた時、アルファベットを大文字小文字区別せずに出現頻度順  
%に小文字で並べた文字列を返すプログラムを作りなさい。)  
%[3] 環境  
% [3.1] OS: (WindowsXP)  
% [3.2] バージョン: (Ruby 1.8.6 )  
% [3.3] 言語: (Ruby  
%[4] 期限: ([2009年06月01日21:00まで]  
%[5] その他の制限: 配列などの初歩的な概念まで

t104(Atom,AtomX) :- 
    findall([0,N],for(97,N,122),L), 
    to_lower(Atom,Atom2), 
    atom_codes(Atom2,L1), 
    t104_2(L1,L,L2), 
    sort(L2,L3), 
    t104_3(L3,[],L4), 
    atom_codes(AtomX,L4),!. 

t104(Atom,AtomX) :- 
    findall([0,N],for(97,N,122),L), 
    to_lower(Atom,Atom2), 
    atom_codes(Atom2,L1), 
    t104_2(L1,L,L2), 
    sort(L2,L3), 
    reverse(L3,L4), 
    t104_3(L4,L5), 
    atom_codes(AtomX,L5),!. 

t104_2([],X,X). 
t104_2([A|R1],L,X) :- 
    t104_3(A,L,L1), 
    t104_2(R1,L1,X). 

t104_3(97,[[S,N]|R],[[S1,N]|R]) :- 
    S1 is S+1. 
t104_3(N,[U|R1],[U|R2]) :- 
    N > 97, 
    M is N-1, 
    t104_3(M,R1,R2). 

t104_4([],[]). 
t104_4([[0,_]|R1],X) :- 
    t104_4(R1,X). 
t104_4([[C,N]|R1],[N|R2]) :- 
    C > 0, 
    t104_4(R1,R2). 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% http://pc12.2ch.net/test/read.cgi/tech/1200175247/529
% [1] 授業単元:Ruby 
% [2] 問題文 ファイル分割 
%
% 下記は、hoge.csvを均等に4分割して tmp/ 以下に書き込むプログラムである。 
%
% ruby split.rb hoge.csv tmp/ 4 
%
% 出力例 
% tmp/1out.csv 
% tmp/2out.csv 
% tmp/3out.csv 
% tmp/4out.csv 

t131(_分割されるファイル,_分割数) :-
    get_lines(_分割されるファイル,[_先頭行|L]),
    length(L,Len),
    Div is Len // _分割数,
    Mod is Len mod _分割数,
    t131(L,Div,Mod,1,X),
    t131(_分割数,_先頭行,X),
    fail;
    true.

t131(_分割数,_先頭行,L) :-
    for(1,N,_分割数),
    list_nth(N,L,X),
    concat_atom(['tmp/',N,'out.csv'],F),
    put_lines(F,[_先頭行|X]),
    N=_分割数.

t131([],_,_,_,_).
t131(L,Div,Mod,Gth,[X|R])
    切り取り行数(Div,Mod,Gth,M),
    member_n(M,X,L,RL),
    Gth2 is Gth+1,
    t131(RL,Div,Mod,Gth2,R).

切り取り行数(Div,Mod,Nth,X) :- Nth > Mod,X is Div.
切り取り行数(Div,Mod,Nth,X) :- Nth =< Mod,X is Div + 1.

member_n(N,X,L,R) :-
    length(X,N),
    append(X,R,L).


'課題1-4'(File,X) :-
    open(File,read,Input),
    get_char(Input,C),
    '課題1-4'(Input,C,[],Y),
    close(Input),
    sort(Y,X).

'課題1-4'(_,end_of_file,X,X) :- !.
'課題1-4'(Input,_受取文字,受取リスト,X) :-
    _受取文字 @>= ' ',
    _受取文字 @=< z,
    to_upper(_受取文字,_大文字化した文字),
    鍵と対の値に1を加える(_大文字化した文字,_受取リスト,_更新されたリスト),
    get_char(Input,_次の文字),
    '課題1-4'(Input,_次の文字,_更新されたリスト,X).

鍵と対の値に1を加える(Key,L,X) :-
    append(L1,[[Key,V]|L2],L),
    V2 is V + 1,
    append(L1,[[Key,V2]|L2],X),!.
鍵と対の値に1を加える(Key,L,[[Key,1]|L]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 【 課題 】二つの文字列str1 とstr2 を入力して、str1 とstr2 から交互に一文字ずつ順番にとりだして、交  
% 互にならべた文字列をつくれ。長い方の文字列の後の部分はそのままくっついた形になる。
% String,StringBuffer クラスのメソッドを使え。 
% 

二つの文字列を交互に併合する(Str1,Str2,Str) :-
  atom_chars(Str1,Chars1),
  atom_chars(Str2,Chars2),
  順併合(Chars1,Chars2,Chars3),
  atom_chars(Str,chars3).

順併合([],L,L) :- !.
順併合([A|R1],L2,[A|R]) :-
  順併合(L2,R1,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% <<課題>> C 
% 1行に一つづつ表示するプログラムを作成せよ。 
% 空白が2個以上連続してもうまく動作するようにすること。また、コンマ(,)、 
% ピリオド(,)は表示する単語に含めないこと。 
%
% (実行例) 
% ・入力 
%  This is a pen. 
%
% ・出力 
% This 
% is 
% a 
% pen 
% 

文字列から切り出した単語の行表示(_文字列) :-
    文字列から単語の切り出し(_文字列,_単語ならび),
    wrln(_単語ならび).    

文字列から単語の切り出し(_文字列,_単語ならび) :-
    atom_chars(_文字列,_文字ならび),
    文字ならびを区切り文字により分割する(_文字ならび,L),
    単語ならびに変換(,_単語ならび).

文字ならびを区切り文字により分割する([A|R1],R2) :-
    区切り文字(A),
    文字ならびを区切り文字により分割する(R1,R2),!.
文字ならびを区切り文字により分割する(_文字ならび,[L1|R]) :-
    append(L1,[A|L2],_文字ならび),
    区切り文字(A),
    文字ならびを区切り文字により分割する(L2,R),!.
文字ならびを区切り文字により分割する(_,[]) :- !.

区切り文字(' ').
区切り文字('\n').
区切り文字('.').
区切り文字(',').

単語ならびに変換([]) :- !.
単語ならびに変換([L|R1],[_単語|R2]) :-
    concat_atom(L,_単語),
    単語ならびに変換(R1,2).

wrln([]) :- !.
wrln([A|R]) :-
    write_formatted('%t\n',[A]),
    wrln(R).


データを追加する度に整列する(L) :-
	get_line(Line),
	データを追加する度に整列する(Line,[],L).

データを追加する度に整列する(end_of_file,_,_) :- !,fail.
データを追加する度に整列する(Line,L1,L) :-
	データを挿入する(Line,L1,L).
データを追加する度に整列する(Line,L1,L) :-
	データを挿入する(Line,L1,L2),
	get_line(Line2),
	データを追加する度に整列する(Line2,L2,L).

データを挿入する(A,[],[A]) :- !.
データを挿入する(A,[B|R],[A,B|R]) :- A @=< B,!.
データを挿入する(A,[B|R1],[B|R2]) :- A @> B,データを挿入する(A,R1,R2),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1]  授業単元: C  
% [2] 問題文(含コード&リンク):入力した文字の種類を表示するプログラムを作成せよ。ただし、表示は次に従うとする  
% 入力キーA〜Z 表示メッセージ 英大文字です  
% 入力キーa〜z 表示メッセージ  英小文字です  
% 入力キー0〜9 表示メッセージ  数字です  
% 上記以外    表示メッセージ  その他のキャラクターです  

入力した文字の種類を表示するプログラム(_文字) :-
    文字の範疇(_文字の範疇,_文字),
    表示は次に従うとする(_文字の範疇,_,_表示メッセージ),
    write(_表示メッセージ).
    
表示は次に従うとする(入力キーA〜Z,表示メッセージ,英大文字です).
表示は次に従うとする(入力キーa〜z,表示メッセージ,英小文字です). 
表示は次に従うとする(入力キー0〜9,表示メッセージ,数字です).
表示は次に従うとする(上記以外,表示メッセージ,その他のキャラクターです).

文字の範疇(入力キーA〜Z,_文字) :-
    member(_文字,['A','B','C','D','E','F','G','H',
		  'I','J','K','L','M','N','O','P',
		  'Q','R','S','T','U','V','W','X','Y','Z']).
文字の範疇(入力キーa〜z,_文字) :-
    member(_文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]).
文字の範疇(入力キー0〜9,_文字) :-
    member(_文字,['0','1','2','3','4','5','6','7','8','9']).
文字の範疇(上記以外,_文字) :-
    \+(文字の範疇(入力キーA〜Z,_文字)),
    \+(文字の範疇(入力キーa〜z,_文字)),
    \+(文字の範疇(入力キー0〜9,_文字)).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 課題8 暗号文を作成するプログラム ファイル名(AxP21xxx_kadai8_angou.java)
% 適当な文字列を入力して、暗号化するプログラムである。
% 暗号キーは2桁とし、暗号文は奇数番目と偶数番目の文字位置を、
% 暗号キーの値だけ交互にずらして作成する。
% なお使用する文字種は[!]から[z]までの90 個とする(0x21〜0x7A)
% 。またzを越えたら!に戻すこと。
% (例)暗号キーが「16」のとき
% 元の文字列 暗号文字列
% b u n k y o → c ! o q z u
% +1 +6 +1 +6 +1 +6

文字列の暗号化(_鍵整数,_元の文字列,_暗号文字列) :- 
    integer(_鍵整数), 
    _鍵整数>=10 
    _鍵整数=<99, 
    atom_codes(_元の文字列,Codes), 
    _奇数番目の鍵 is _鍵整数 // 10, 
    _偶数番目の鍵 is _鍵整数 mod 10, 
    文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,Codes,_暗号Codes), 
    atom_codes(_暗号文字列,_暗号Codes). 

文字コードによる暗号化(_,_,[],[]) :- !. 
文字コードによる暗号化(_鍵1,_鍵2,[A|R1],[B|R2]) :- 
    一文字の暗号化(_鍵1,A,B), 
    文字コードによる暗号化(_鍵2,_鍵1,R1,R2). 

一文字の暗号化(_変位,_文字コード,_暗号化された文字コード) :- 
    _文字コード+_変位 =< 122,!, 
    _暗号化された文字コード is _文字コード+_変位. 
一文字の暗号文字化(_変位,_文字コード,_暗号化された文字コード) :- 
    _文字コード+_変位 >122,!, 
    _暗号化された文字コード is _文字コード+_変位-90. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 【 課題 】
% String a ="@test あいう@aaaおえてhttp://test.com/と";
% aから@から始まるアルファベットとURLを取り除く処理
% System.out.println(a);
%
% 出力結果
% あいうおえてと
%
% aから@から始まるアルファベットとURLを取り除く処理はどのように書けばいいのでしょうか。


t251(_文字列,_取り除いた文字列) :-
    atom_chars(_文字列,Chars),
    t251_1(Chars,L),
    atom_chars(_取り除いた文字列,L).

t251_1([],[]) :- !.
t251_1([' '|R1],R2) :-
    t251_1(R1,R2),!.
t251_1([@|R1],R2) :-
    t251_2(R1,R2),!.
t251_1(L,R2) :-
    url_check(L,R1),
    t251_2(R1,R2),!.
t251_1([A|R1],[A|R2]) :-
    t251_1(R1,R2).

t251_2([],[]) :- !.
t251_2([A|R1],R2) :-
    A @>' ',
    A @=< z,!,
    t251_2(R1,R2).
t251_2(L,R2) :-
    t251_1(L,R2).

url_check([h,t,t,p,:,/,/|R],R) :- !.
url_ckeck([h,t,t,p,s,:,/,/,|R],R) :- !.
url_check([f,t,p,:,/,/|R],R) :- !.
url_check([f,i,l,e,:,/,/|R],R) :- !.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% あいうえお
% /*かきくけこ*/
% さしす/*せそ
% なにぬ*/ねの
%
% というファイル(test.txt)から文字数、改行数、コメント文字数をカウントし、出力するプログラムです。
% お願いいたします。

t274(_文字数,_改行数,_コメント文字数) :-
    get_chars('test.txt',Chars),
    length(Chars,_文字数),
    改行数を数える(Chars,_改行数),
    コメント文字数を数える(Chars,_コメント文字数).

改行数を数える(Chars,_改行数) :-
    findall(_,append(_,['\n'|_],Chars),L),
    length(L,_改行数).

コメント文字数を数える(Chars,_コメント文字数) :-
    append(_,['/','*'|L2],Chars),
    append(_コメント文字候補,['*','/'|_],L2),
    not(append(_,['/','*'|_],_コメント文字候補)),
    改行を取り除く(_コメント文字候補,_改行を取り除いたコメント文字候補),
    length(_改行を取り除いたコメント文字候補,_コメント文字数).

改行を取り除く([],[]).
改行を取り除く(['\n'|R1],R2) :-
    改行を取り除く(R1,R2),!.
改行を取り除く([A|R1],[A|R2]) :-
    not(A='\n'),
    改行を取り除く(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 以下のように出力されるプログラムを作成せよ
% 年齢を入力してください
% 16
% 生まれた年を入力してください
% 1986
% 好きな数字を入力してください
% 7
% あなたは1986年生まれの16才で、7が好きですね

t277 :-
    質問文(L),
    findall(U,(member(A,L),write(A),nl,get_line(U)),VL),
    write_formatted('あなたは%t年生まれの%才で、%tが好きですね\n',VL).

質問文([年齢を入力してください,生まれた年を入力してください,好きな数字を入力してください]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1] 授業単元:プログラミング
% [2] 問題文(含コード&リンク):
% 自分の名前の英字名のASCIIコードを順番に表示するプログラムを作りなさい。

t296(Name) :-
    sub_atom(Name,S,1,R,A),
    not(A=' '),
    char_code(A,C),
    N is S+1,
    write_formatted('%2d: %t\n',[N,C]),
    fail;
    true.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1] 授業単元:プログラミング演習
% [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9667.txt

% 課題1 スペースの挿入
% 
% 最大50文字のスペースを含まない文字列をターミナルから読み込み,各文字間にスペースを挿入したものを出力するプログラムを
% 作成しなさい. 
% 課題実行においては以下の点に注意すること.
% ・プログラム名は「space」とすること. 
% ・文字列の先頭と最後にはスペースを入れない. 
% ・ポインタを用いること.
% 
% 実行結果
% ./space
% abc
% a b c

space(_文字列,_スペースを挿入された文字列) :-
    atom_chars(_文字列,Chars),
    concat_atom(Chars,' ',_スペースを挿入された文字列).

concat_atom([],_,'') :- !.
concat_atom([A],_,A) :- !.
concat_atom([A|R],S,X) :-
    concat_atom(R,S,Y),
    atom_concat(A,S,B),
    atom_concat(B,Y,X).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 課題2 Inner Product (内積)
%
% Write a program (innpro) to compute an inner product. 
% First, decide a degree of a vector, next input two vectors of 
% degree n, A and B, then the inner product is output. 
% The maximum degree of the vectors is 20. 
% Remarks.
% ・The name of the program must be innpro. 
% ・The inner product A=(a1,a2, ... ,an) and B=(b1,b2,...,bn) is a1*b1+a2*b2+...+an*bn. 
% 
% 実行結果
% ./innpro
% Degree: 5
% Data of A: 1 2 3 4 5
% Data of B: 2 3 4 5 6
% Inner Product: 70

innpro([],[],0) :- !.
innpro([A|R1],[B|R2],X) :-
    innpro(R1,R2,Y),
    X is A * B + Y.


ファイルサイズを取得する(_ファイル,_サイズ) :-
	get_file_info(_ファイル,L),
	member(size(_サイズ),L).


% *** user: 'URLの文字列をエンコードする' / 2 ***
URLの文字列をエンコードする('','') :- !.
URLの文字列をエンコードする([],'') :- !.
URLの文字列をエンコードする(_URL文字列,_エンコードされたURL文字列) :-
    var(_エンコードされたURL文字列),
    sprintf('%q',[_URL文字列],S),
    decompcons(S,L),
    replace_query_1(L2,L),
    replace_query_6(L2,L3),
    concat(L3,_エンコードされたURL文字列),!.
URLの文字列をエンコードする(_URL文字列,_エンコードされたURL文字列) :-
    \+(var(_エンコードされたURL文字列)),
    \+(var(_URL文字列)),
    sprintf('%q',[_URL文字列],S),
    decompcons(S,L),
    replace_query_1(L2,L),
    replace_query_6(L2,L3),
    concat(L3,_エンコードされたURL文字列),!.

% *** user: replace_query_1 / 2 ***
replace_query_1([],[]) :- !.
replace_query_1([+|R],[' '|R1]) :-
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B,'%',C,D|R],[E|R1]) :-
    atomic(E),
    var(A),
    var(B),
    var(C),
    var(D),
    error_protect(name2(E,[U,V]),fail),
    U > 127,
    V < 128,
    U1 is U // 16,
    U2 is U mod 16,
    char_code(C_1,V),
    replace_query_2(C,D,C_1),
    replace_query_4(A,U1),
    replace_query_4(B,U2),
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B,C|R],[E|R1]) :-
    atomic(E),
    var(A),
    var(B),
    var(C),
    error_protect(name2(E,[U,V]),fail),
    U > 127,
    V < 128,
    U1 is U // 16,
    U2 is U mod 16,
    char_code(C,V),
    \+(replace_query_2(_,_,C)),
    replace_query_4(A,U1),
    replace_query_4(B,U2),
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B,'%',C,D|R],[E|R1]) :-
    atomic(E),
    var(A),
    var(B),
    var(C),
    var(D),
    char_code(E,N),
    N > 4096,
    error_protect(name2(E,[U,V]),fail),
    U1 is U // 16,
    U2 is U mod 16,
    V1 is V // 16,
    V2 is V mod 16,
    replace_query_4(A,U1),
    replace_query_4(B,U2),
    replace_query_4(C,V1),
    replace_query_4(D,V2),
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B|R],[C|R1]) :-
    replace_query_2(A,B,C),
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B,'%',C,D|R],[E|R1]) :-
    \+(error_protect(get_global(sjis,on),fail)),
    atomic(A),
    atomic(C),
    compare(>,A,'7'),
    compare(>,C,'7'),
    \+(replace_query_2(C,D,_)),
    replace_query_3(A,B,N1),
    replace_query_3(C,D,N2),
    name2(E,[N1,N2]),
    set_global(euc,on),
    replace_query_1(R,R1),!.
replace_query_1([A|R],[A|R1]) :-
    replace_query_1(R,R1).

% *** user: replace_query_2 / 3 ***
replace_query_2('2','F',/) :-
    ! .
replace_query_2('2','8','(') :-
    ! .
replace_query_2('2','9',')') :-
    ! .
replace_query_2('2','B',+) :-
    ! .
replace_query_2('2','D',-) :-
    ! .
replace_query_2('2','7','''') :-
    ! .
replace_query_2('2','7','''') :-
    ! .
replace_query_2('5','B','[') :-
    ! .
replace_query_2('5','D',']') :-
    ! .
replace_query_2('3','D',=) :-
    ! .
replace_query_2('3','C',<) :-
    ! .
replace_query_2('3','E',>) :-
    ! .
replace_query_2('3','B',;) :-
    ! .
replace_query_2('3','F',?) :-
    ! .
replace_query_2('2','5','%') :-
    ! .
replace_query_2('2','6',&) :-
    ! .
replace_query_2('2','3',#) :-
    ! .
replace_query_2('5','F','_') :-
    ! .
replace_query_2('2','C',',') :-
    ! .
replace_query_2('2','1',!) :-
    ! .
replace_query_2('5','E',^) :-
    ! .
replace_query_2('3','A',:) :-
    ! .
replace_query_2('5','C',\) :-
    ! .
replace_query_2('2','2','"') :-
    ! .
replace_query_2('7','C','|') :-
    ! .
replace_query_2('0','A','\n') :-
    ! .
replace_query_2('0','D','') :-
    ! .
replace_query_2('6','0',`) :-
    ! .
replace_query_2('7','E',~) :-
    ! .
replace_query_2('4','0',@) :-
    ! .

% *** user: replace_query_3 / 3 ***
replace_query_3(A,B,C) :-
    replace_query_4(A,M),
    replace_query_4(B,N),
    C is M * 16 + N,
    ! .

% *** user: replace_query_4 / 2 ***
replace_query_4('F',15) :-
    ! .
replace_query_4('E',14) :-
    ! .
replace_query_4('D',13) :-
    ! .
replace_query_4('C',12) :-
    ! .
replace_query_4('B',11) :-
    ! .
replace_query_4('A',10) :-
    ! .
replace_query_4('9',9) :-
    ! .
replace_query_4('8',8) :-
    ! .
replace_query_4('7',7) :-
    ! .
replace_query_4('6',6) :-
    ! .
replace_query_4('5',5) :-
    ! .
replace_query_4('4',4) :-
    ! .
replace_query_4('3',3) :-
    ! .
replace_query_4('2',2) :-
    ! .
replace_query_4('1',1) :-
    ! .
replace_query_4('0',0) :-
    ! .
replace_query_4(C,N) :-
    char_code(C,M),
    N is M - 48,!.

replace_query_6(['%','2','7'|R1],X) :-
    replace_query_7(R1,X),!.
replace_query_6(L1,X) :-
    replace_query_7(L1,X).

replace_query_7(L1,X) :-
    append(X,['%','2','7'],L1),!.
replace_query_7(X,X).


% *** user: 'URLの文字列をデコードする' / 2 ***
URLの文字列をデコードする(_エンコードされたURL,_デコードされたURL) :-
    var(_デコードされたURL),
    atom(_エンコードされたURL),
    decompcons(_エンコードされたURL,L),
    replace_query_1(L,L2),
    concat_atom(L2,A),
    atom_to_term(A,_デコードされたURL,_),
    ! .

% replace_query_1/2以下の述語定義はこちらを参照したください


ホスト名のIPアドレスを取得する(_ホスト名,IPアドレス) :-
    get_lines('/etc/hosts',Lines),
    member(Line,Lines),
    split(Line,[' '],[IPアドレス,_ホスト名|_]),!.

'IPアドレスからホスト名を取得する'(IPアドレス,_ホスト名) :-
    get_lines('/etc/hosts',Lines),
    member(Line,Lines),
    split(Line,[' '],[IPアドレス,_ホスト名|_]),!.


'URLのアンカー部分を取得する'(URL,_アンカー部分) :-
    split(URL,['#'],[_|R]),
    concat_atom(R,_アンカー部分).


'URLのファイル名を取得する'(URL,_ファイル名) :-
    atom_chars(URL,Chars),
    append(L1,['://'|L2],Chars),
    append(_,['/'|L3],L2),
    concat_atom(L2,_ファイル名).


'URLのホスト名を取得する'(URL,_ホスト名) :-
    atom_chars(URL,Chars),
    append(L1,['://'|L2],Chars),
    append(L3,['/'|_],L2),
    'URLのホスト名を取得するの二'(L3,_ホスト名),!.

'URLのホスト名を取得するの二'(L3,_ホスト名) :-
    append(L4,[':'|_],L3),
    concat_atom(L4,_ホスト名),!.
'URLのホスト名を取得するの二'(L3,_ホスト名) :-
    concat_atom(L3,_ホスト名),!.


'URLのポート番号を取得する'(URL,_ポート番号) :-
    atom_chars(URL,Chars),
    append(L1,['://'|L2],Chars),
    append(L3,['/'|_],L2),
    append(_,[':'|L4],L3),
    concat_atom(L4,_ポート番号).


'URLのプロトコル名を取得する'(URL,_プロトコル名) :-
    split(URL,['://'],[A|_プロトコル名]).


'URLのクエリー情報を取得する'(URL,_クエリー情報) :-
    split(URL,['?'],[_|L]),
    concat_atom(L,_クエリー情報).


'URLのクエリー情報からnameとvalueならびを得る'(URL,_nameとvalueならび) :-
    'URLのクエリー情報を取得する'(URL,_クエリー情報),
    split(_クエリー情報,['&'],L),
    クエリー情報からnameとvalueならびを得る(L,_nameとvalueならび).

クエリー情報からnameとvalueりならびを得る([],[]) :- !.
クエリー情報からnameとvalueりならびを得る([A|R1],[[_name,_value]|R2]) :-
    split(A,['='],[_name,_value]),
    クエリー情報からnameとvalueならびを得る(R1,R2).


'URLのユーザー情報を取得する'(URL,_ユーザー情報) :-
    atom_chars(URL,Chars),
    append(L1,['://'|L2],Chars),
    append(L3,['/'|_],L2),
    append(L4,['@'|_],L3),
    concat_atom(L4,_ユーザー情報).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1] 授業単元: プログラミングC
% [2] 問題文(含コード&リンク):
% キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字
を大文字にするプログラムを作成せよ。
%
% 実行例 文字列入力 :AbCdEfG123
%     変換文字列 :aBcDeFg123

t386 :-
    get_line(Line),
    atom_chars(Line,Chars),
    大文字小文字変換(Chars,Chars2),
    atom_chars(Line2,Chars2),
    write_formatted('%t\n',[Line2]).

大文字小文字変換([],[]) :- !.
大文字小文字変換([A|R1],[B|R2]) :-
    A @>= 'A',
    A @=< 'Z',!,
    to_lower(A,B),
    大文字小文字変換(R1,R2).
大文字小文字変換([A|R1],[B|R2]) :-
    A @>= a,
    A @=< z,!,
    to_upper(A,B),
    大文字小文字変換(R1,R2).
大文字小文字変換([A|R1],[A|R2]) :-
    大文字小文字変換(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1] 授業単元: プログラミングC 
% [2] 問題文(含コード&リンク):  
% キーボードから半角英数で文字列を入力し、これを数字(0→9)、大文字(A→Z)、 
% 小文字(a→z)の順に並べ替えるプログラムを作成せよ。 
% ヒント:並べ替えアルゴリズムは、バブルソート(隣接交換法)を使うと簡単だろう。 
%     文字列長はstrlen命令を使うとよい。みたいです。

t388 :-
  get_line(Line),
  atom_chars(Line,Chars),
  バブルソート(Chars,_整列した文字ならび),
  atom_chars(Line2,_整列した文字ならび),
  write_formatted('%t\n',[Line2]).

バブルソート(L,X) :-
  整順が崩れるまで(L,L2),
  バブルソート(L2,X),!.
バブルソート(L,L).

整順が崩れるまで([A],[A]) :- !,fail.
整順が崩れるまで([A,B|R1],[A|R2]) :-
  A @=< B,
  整順が崩れるまで([B|R1],R2).
整順が崩れるまで([A,B|R1],[B,A|R1]) :-
  A @> B.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す 
% 【 形態 】1. Javaアプリケーション(main()で開始) 
% 【 期限 】7/14 am6:00 
% 【 Ver  】Eclipse Version: 3.4.2 
% 【 補足 】 
% あいう 
% かきく 
% さしす 
% 上記のようなテキストファイルを読み込み、 
% あかさ 
% いきし 
% うくす 
% のように別のテキストファイルに書き出す感じです。 

テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す(InFile,OutFile) :-
    open(InFile,read,Input),
    open(OutFile,write,Output),
    findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL),
    max(Chars,Max),
    空白文字を付加して文字数一致させる(Max,LL,LL2),
    行列の転置(LL2,LL3),
    出力ファイルに書き出す(Output,LL3).

出力ファイルに書き出す(Output,[]) :- close(Output),!.
出力ファイルに書き出す(Output,[L|R]) :-
    concat_atom(L,S),
    write_formatted(Output,'%t\n',[S]),
    出力ファイルに書き出す(Output,R).

空白文字を付加して文字数を一致させる(Max,LL1,LL2) :-
    findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2).

all([],_).
all([V|R],V) :- all(R,V).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す 
% 【 形態 】1. Javaアプリケーション(main()で開始) 
% 【 期限 】7/14 am6:00 
% 【 Ver  】Eclipse Version: 3.4.2 
% 【 補足 】 
% あいう 
% かきく 
% さしす 
% 上記のようなテキストファイルを読み込み、 
% さかあ 
% しきい 
% すくう 
% のように別のテキストファイルに書き出す感じです。 

テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す(InFile,OutFile) :-
    open(InFile,read,Input),
    open(OutFile,write,Output),
    findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL),
    findmax(Len,length(Chars,Len),Max),
    空白文字を付加して文字数一致させる(Max,LL,LL2),
    行列の転置(LL2,LL3),
    右書き用に反転して出力ファイルに書き出す(Output,LL3).

右書き用に反転して出力ファイルに書き出す(Output,[]) :- close(Output),!.
右書き用に反転して出力ファイルに書き出す(Output,[L|R]) :-
    reverse(L,L1),
    concat_atom(L1,S),
    write_formatted(Output,'%t\n',[S]),
    右書き用に反転して出力ファイルに書き出す(Output,R).

空白文字を付加して文字数を一致させる(Max,LL1,LL2) :-
    findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2).

all([],_).
all([V|R],V) :- all(R,V).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  さくらエディタを使っていて 
%   
%  CHAPTER01=00:00:00.000 
%  CHAPTER01NAME=第一部 オープニング 
%  CHAPTER02=00:09:13.400 
%  CHAPTER02NAME=オラはにんきもの 
%   
%  こういうのを 
%   
%    TRACK 01 AUDIO 
%      TITLE "第一部 オープニング" 
%      INDEX 01 00:00:00 
%    TRACK 02 AUDIO 
%      TITLE "オラはにんきもの" 
%      INDEX 01 09:13:40 
%   
%  こうしたいんですが、正規表現でできるもんなんでしょうか 
%  できるとしたら答えを貰えるのが一番ですが、どこら辺を調べればいいのかヒントをもらえないでしょうか 
% 
% 

変換(_ファイル名) :-
      get_lines(_ファイル名,Lines),
      変換規則('TRACK',Lines,TRACK,S1),
      変換規則('TITLE',Lines,TRACK,S2),
      変換規則('TIME',Lines,TRACK,S3),
      write_formatted('%t\n%t\n%t\n',[S1,S2,S3]),
      fail.      
変換(_).

変換規則('TRACK',Lines,TRACK,S) :-
      member(_文,Lines),
      sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL),
      append(L0,['='|R2],TL),
      \+(append(_,['N','A','M','E'],L0)),
      concat_atom(L0,TRACK),
      concat_atom(['TRACK',' ',TRACK,' ','AUDIO'],S).

変換規則('TITLE',_Lines,TRACK,S) :-
      member(_文,Lines),
      sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL),
      append(L1,['='|R],TL),
      append(L0,['N','A','M','E'|R2],L1),
      concat_atom(L0,TRACK),
      concat_atom(R,TITLE),
      concat_atom(['  ','TITLE',' "',TITLE,'"'],S).

変換規則('TIME',Lines,TRACK,S) :-
      member(_文,Lines),
      sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL),
      append(L0,['='|R2],TL),
      \+(append(_,['N','A','M','E'],L0)),
      concat_atom(L0,TRACK),
      concat_atom(R2,TIME),
      concat_atom(['  ','INDEX',' 01 ',TIME],S).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  JMeterで何とか以下のHTMLの『二番目の』optionを拾いたいんだけど、どーも上手くいきません。 
%  <select name="select$item1" onchange="javascript:dummry();" id="select_item1"> 
%   <option selected="selected" value="0">(none)</option> 
%   <option value="1">item1</option> 
%   <option value="2">item2</option> 
%   <option value="3">item2</option> 
%  </select> 
%  ※optionの行にはいくつかタブが入っています。 
%   
%  「id="select_item1">([.\r\n\t\f]*)option value="([1-9]*)"」と書けば拾ってくれると思ったんだけどダメでした。 
%  何か忘れている箇所がありましたら、是非アドバイスをお願いします。 
%   
%  ちなみに(おそらくnameに$が入っているせいだと思いますが)HTMLリンクパーサは動きません(涙 
% 
% 

'『二番目の』optionを拾いたい'(_htmlファイル,_二番目のoption) :-
	get_lines(Lines),
	'『二番目の』option'([],Lines,_二番目のoption).

'『二番目の』option'([_],[_行|R],_二番目のoption) :-
	'SPLIT'(_行,['>',''|_],L),
	last(L0,_二番目のoption),!.
'『二番目の』option'(L,[_行|R],_二番目のoption) :-
	'SPLIT'(_行,['>','',L),
	'『二番目の』option'([_|L],R,_二番目のoption).
'『二番目の』option'(L,[_行|R],_二番目のoption) :-
	'『二番目の』option'(L,R,_二番目のoption).
		    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  質問です。 
%  テキストの中の<location></location>で囲まれた行のみ処理対象にして、 
%  1.<location></location>を残す。 
%  2../(ピリオドとスラッシュ)を追加。 
%  3.前から8個目(後ろから1個目)の/(スラッシュ)以降のファイル名を残す。 
%  という正規表現を教えてください。 
%   
%  例 
%  <location>file:///(ドライブ名):/(フォルダ名)/(フォルダ名)/(フォルダ名)/(フォルダ名)/(ファイル名)</location> 
%  という行がテキストファイル内に存在したら 
%  <location>./(ファイル名)</location> 
%  という内容に変更したい。フォルダ名とファイル名に規則性無し。 
%  特に、8個目の/(スラッシュ)以降の文字列を残す方法が全くワカリマヘン。 
%   
%  現状レベル 
%  昨日から丸1日正規表現に取り組んで、近づいてる様な近づいてない様な抽出実験してるレベルです。 
%   
%  因みに今回のテキストファイルは、VLCのプレイリストのxspfファイルです。 
%  ファイルを移動した時、プレイリストが絶対アドレスで定義されてるので、リンクが切れてしまいます。 
%  今回の変更で、相対アドレスになりある程度のファイル移動が可能になる。まあ仕事じゃない趣味のレベルです。 
%   
%  宜しくお願いします。 
% 

'テキトの中ので囲まれた行のみ処理対象にして、1.を残す。2../(ピリオドとスラッシュ)を追加。3.前から8個目(後ろから1個目)の/(スラッシュ)以降のファイル名を残す。' :-
	get_lines(_テキストファイル,Lines),
	append(_,[_行|R],Lines),
	'で囲まれた行のみ処理対象'(_行),
	R = [].

'で囲まれた行のみ処理対象'(_行) :-
	'SPLIT'(_行,['','/',''],L),
	append([''],L1,[''],L),
	last(L1,_ファイル名),
	concat_atom(['./',_ファイル名,''],S),
	write_formatted('%t\n',[S]),!.
'で囲まれた行のみ処理対象'(_行) :-
	write_formatted('%t\n',[_行]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  [1] 授業単元:C言語 
%  [2] 問題文(含コード&リンク):int main(void) 
%   
%                { 
%   
%              char word[101],boin[5]={'a','i','u','e','o'}; 
%               int i,count[5];  
%   
%               printf("アルファベットで文字列を入力してください>>>"); 
%               scanf("%s",word); 
%   
%               count[0]=0,count[1]=0,count[2]=0,count[3]=0,count[4]=0; 
%   
%               for(i=0; word[i]!='\0'; i++) 
%     
%              { 
%                 if(word[i]==boin[0]) {count[0]++;} if(word[i]==boin[1]) {count[1]++;} 
%              if(word[i]==boin[2]) {count[2]++;} if(word[i]==boin[3]) {count[3]++;} if(word[i]==boin[4]) {count[4]++;} 
%                      }  
%   
%                     printf(" a>>>%d\n i>>>%d\n u>>%d\n e>>>%d\n o>>>%d\n",count[0],count[1],count[2],count[3],count[4]); 
%   
%       return 0; 
%   
%         }  
%  アルファベット文字列の中から母音をカウントするプログラムなのですが、現在ソース中の配列は 
%  定数によって値が参照されています。これをboin[i] count[j]のように変数で値を参照するものに書き換えてください。 
%  [3]環境:linux コンパイラ:gcc  C言語 
%  [4] 期限:2010年10月19日10:00まで 
%  [5] その他の制限:変数で配列要素の値を参照するときfor文と組み合わせること。 
%  どうか、よろしくお願いします 
% 

母音([a,i,u,e,o]).

アルファベット文字列の中から母音をカウントする(_アルファベット文字列,_母音の数) :-
	母音(_母音ならび),
	findall(_,(
		    sub_atom(_アルファベット文字列,_,1,_,_文字),
		    append(_,[_文字|_],_母音ならび)),
		L),
	length(L,_母音の数).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  [1] 授業単元: プログラム  
%  [2] 問題文(含コード&リンク):テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。 
%  

'テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。'(_距離ならび,_最大距離,_最小距離) :-
	データの読み込み(L),
	length(L,Length),
	findall(N,for(1,N,Length),NL),
	findall(_距離,(
		    組み合わせ(NL,2,[Nth1,Nth2]),
		    list_nth(Nth1,L,[X1,X2,X3]),
		    list_nth(Nth2,L,[Y1,Y2,Y3]),
		    _距離 is sqrt((X1-Y1)^2 + (X2-Y2)^2 + (X3-Y3)^2))),
		_距離ならび),
	max(_距離ならび,_最大距離),
	min(_距離ならび,_最小距離).
	
データの読み込み(L) :-
	write('データ(x1,x2,x3を)カンマ区切りで入力してください。(終了は空行で) : '),
	get_line(Line),
	データの読み込み(Line,L).

データの読み込み('',[]) :- !.
データの読み込み(Line,[[X1,X2,X3]|R]) :-
	split(Line,[',',' '],[X1,X2,X3]),
	get_line(Line2),
	データの読み込み(Line2,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  ●正規表現の使用環境  
%  php5  
%   
%  ●検索か置換か?  
%  置換  
%   
%  ●説明  
%  tableタグ内の改行(<br />)を全て削除したい  
%   
%  ●対象データ  
%  <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"><br />  
%  <tbody><br />  
%  <tr><br />  
%  <td><br />  
%  </td><br />  
%  </tr><br />  
%  </tbody><br />  
%  </table>  
%   
%  ●希望する結果  
%  <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx">  
%  <tbody>  
%  <tr>  
%  <td>  
%  </td>  
%  </tr>  
%  </tbody>  
%  </table>  
% 
% 

'tableタグ内の改行タグを全て削除したい'(_ファイル) :-
	get_chars(_ファイル,Chars),
	'tableタグ内の改行タグを全て削除したい'(Chars,L),
	put_chars(_ファイル,L).

'tableタグ内の改行タグを全て削除したい'([],[]) :- !.
'tableタグ内の改行タグを全て削除したい'(L1,L2) :-
	append(L0,[<,t,a,b,l,e,>|R],L1),
	append(L2,[<,/,t,a,b,l,e,>|R2],R),
	'改行タグの削除'(L2,L3),
	'tableタグ内の改行タグを全て削除したい'(R2,L4),
	append(L0,[<,t,a,b,l,e,>|L3],L4,L2),!.
'tableタグ内の改行タグを全て削除したい'(L,L).

'改行タグの削除'([],[<,/,t,a,b,l,e,>]) :- !.
'改行タグの削除'([<,b,r,' ',/,>|R1],R2) :-
	'改行タグの削除'(R1,R2),!.
'改行タグの削除'([A|R1],[A|R2]) :-
	'改行タグの削除'(R1,R2),!.

%  先頭から3文字にマッチする表現を教えてください 
% 

先頭から3文字にマッチする表現([A,B,C|R],[A,B,C],R).

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

先頭から3文字にマッチする表現(_文字列,'',_先頭から3文字にマッチする表現の文字列,_残り文字列) :-
	sub_atom(_文字列,0,3,R,_先頭から3文字にマッチする表現の文字列),
	sub_atom(_文字列,3,R,_,_残り文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  見出しと任意文字列の間にtabを挿入したいのですが、そうした置換は可能でしょうか? 
%  サクラエディタを使っています。 
%  幼稚な質問をお許し下さい 
%   
%   
%  見出し1=任意文字列1 
%  見出し2=任意文字列2=任意文字列3 
%  見出し3=任意文字列4=任意文字列5=任意文字列6 
%   
%  【こうしたい】 
%  見出し1=  任意文字列1 
%  見出し2=  任意文字列2=任意文字列3 
%  見出し3=  任意文字列4=任意文字列5=任意文字列6 
%   

見出しと任意文字列の間にtabを挿入したい(_対象となる行ならび,_見出しと任意文字列の間にtabを挿入した行ならび) :-
	findall(_tabを挿入された行,(
		     append(_,[_行|_],_対象となる行ならび),
		     文字列置換(_行,'=','=\t',_tabを挿入された行)),
		_見出しと任意文字列の間にtabを挿入した行ならび).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 文字列置換/4 が未定義だったら、

見出しと任意文字列の間にtabを挿入したい(_対象となる行ならび,_見出しと任意文字列の間にtabを挿入した行ならび) :-
	findall(_tabを挿入された行,(
		     append(_,[_行|_],_対象となる行ならび),
		     split(_行,['='],[_見出し|R]),
		     concat_atom(R,'=',S),
		     concat_atom([_見出し,'=','\t',S],_tabを挿入された行)),
		_見出しと任意文字列の間にtabを挿入した行ならび).


%  A3AACD9ABD377E716127E010FEAC9EBE のような半角英数字32文字の取得はどう書けばいいんでしょうか? 


'A3AACD9ABD377E716127E010FEAC9EBE のような半角英数字32文字の取得'(_文字列,_前文字列,_検索文字列,_後文字列) :-
	atom_chars(_文字列,Chars),
	半角英数N文字の連続を検索(Chars,32,L0,[],L0,L,R),
	atom_chars(_前文字列,L0),
	atom_chars(_検索文字列,L),
	atom_chars(_後文字列,R).

半角英数N文字の連続を検索([],N,[],L1,[],L) :-
	length(L1,N),
	reverse(L1,L),!.
半角英数N文字の連続を検索(R,N,L1,[],L,R) :-
	length(L1,N),
	reverse(L1,L),!.
半角英数N文字の連続を検索([A|R1],N,L1,[A|R0],L,R) :-
	\+(半角英数字(A)),
	半角英数N文字の連続を検索(R1,N,[],R0,L,R),!.
半角英数N文字の連続を検索([A|R1],N,L1,[A|R0],L,R) :-
	半角英数N文字の連続を検索(R1,N,[A|L1],R0,L,R).

半角英数字(C) :-
	member([U1,U2],[['A','Z'],[a,z],['0','9']]),
	C @>= U1,
        C @=< U2,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  ●正規表現の使用環境  
%  PHP5.29 
%   
%  ●検索か置換か?  
%  検索 
%   
%  ●説明 
%  :より前の記号部分を取得したい。 
%   
%  ●対象データ  
%  5789:石鹸 
%  w555-2:タオル 
%  Zxcvb:ハンガー 
%   
%  ●希望する結果  
%  5789 
%  w555-2 
%  Zxcvb 
% 

':より前の記号部分を取得したい。 '(_行ならび,_置換された行ならび) :-
	findall(_コロンより前の記号部分,(
		    append(_,[_行|_],_行ならび),
		    コロンより前の記号部分(_行,_コロンより前の記号部分)),
		_置換された行ならび).

コロンより前の記号部分(_行,_コロンより前の記号部分) :-
	sub_atom(_行,_コロンの位置,1,_,':'),
	sub_atom(_行,0,_コロンの位置,_,_コロンより前の記号部分),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  http://ime.nu/test.com/test1/test2/test3/pic.jpg から 
%  test.com/test1/test2/test3 を取るにはどう書いたらいいでしょうか 
%   
%  test1やtest2の階層は増えたり減ったりします。 
%  要するにhttp://ime.nu/から最後の/の間の値がほしいです 
% 
% 

'要するにhttp://ime.nu/から最後の/の間の値がほしいです'(_行,_欲しい部分文字列) :-
	atom_chars(_行,Chars),
	append(_,[h,t,t,p,:,/,/,i,m,e,'.',n,u,/|L],[/|R],Chars),
	\+(append(_,[/|_],R)),
	atom_chars(_欲しい部分文字列,L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  シェルの中で入力ファイル名から出力ファイル名を生成しています。 
%  特定の文字列・記号を正規表現でリネームしたいのですが思いつきません。 
%   
%  ファイル名前半部が異なるファイルが50以上あるのですが、思い通りにrenameしてくれません。 
%  ご教示お願いいたします。 
%   
%  対象ファイル: 
%  iko_foobar_hogehoge_20101008.tsv 
%   
%  リネーム後ファイル: 
%  iko_foobar_hogehoge-20101008.tsv 
%   
%  コマンドの実行イメージ 
%  rename iko*_[\d,8].tsv iko*-[\d,8].tsv 
%   
%  IN_FILE = ma_sina_syo_20100101 
%  OUT_FILE="${DIR_PATH_RCV}/${PREFIX}$(basename ${IN_FILE})${MARK}${YMD}.tsv" 
%  OUT_FILE=iko_ma_sina_syo-20100101.tsv 
%   
% 
% 

ファイル名前半部が異なるファイルをrenameする(_ディレクトリ名) :-
	concat_atom(['ls -N ',_ディレクトリパス名',S),
	shs(S,_行ならび),
	append(_,[_行|R],_行ならび),
	atom_chars(_行,Chars),
	length(L2,9),
	append(L1,L2,Chars),
	append([_],L3,L2),
	全部数字(L3),
	concat_atom(L1,S1),
	concat_atom(L3,S3),
	concat_atom(['mv ',_行,' ','iko_',S1,'-',S3,'.tsv']),Mv),
	system(Mv),
	R = [],!.

全部数字([]) :- !.
全部数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']),全部数字(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  秀丸ですが、指定の文字列が無い行全てを削除したいです。 
%   
%  以下の様な複数行のターゲットがあって、zyzの文字列が有る行のみ 
%  残したいのです。 
%   
%  .+[^(zyz)].+\n じゃダメだったし、力不足でニッチもサッチもいきませんorz 
%  どなたかHELP ME・・・・・ 
%   
%  AAABBBzzyCCDDDEEEAAA 
%  AAABBBDDzyzEEEAAA 
%  AAABBBCCzyzEEEAAA 
%  AAABBBCCDDDAAA 
%  AAACCDDDEEEAA 
%  AzyzAABBBCCDDDEEEAAA 
% 

指定の文字列が無い行全てを削除したい(_ファイル名,_削除指定文字列) :-
	get_lines(_ファイル名,Lines),
	findall(_行,(
		    append(_,[_行|_],Lines),
		    指定文字列がある(_行,_削除指定文字列)),
		Lines2),
	put_lines(_ファイル名,Lines2).                    

指定文字列がある(_行,_指定文字列) :- sub_atom(_行,_,_,_,_指定文字列),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  2桁の英数字にはマッチするけど3桁にはマッチしない正規表現はどう書けば良いんでしょうか? 
% 
% 「3桁にはマッチしない」は表現できない。
%  こちらを参照してください

'2桁の英数字にはマッチするけど3桁にはマッチしない'(_文字列,_2桁の英数字) :-
	sub_atom(_文字列,_,2,_,_2桁の英数字),
	atom_codes(_2桁の英数字,[Code1,Code2]),
	英数コード(Code1),
	英数コード(Code2).

英数コード(Code) :- Code >=48,Code =< 57,!.
英数コード(Code) :- Code >=65,Code =< 90,!.
英数コード(Code) :- Code >=97,Code =< 122,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  2桁以上の英数字にマッチするけど3桁にはマッチしない正規表現はどう書けば良いんでしょうか? 
% 

'2桁以上の英数字にマッチするけど3桁にはマッチしない'(_文字列,_2桁以上の英数字) :-
	sub_atom(_文字列,_,_副文字列の長さ,_,_2桁以上の英数字),
	_副文字列の長さ >= 2,
	\+(_副文字列の長さ=3),
	atom_codes(_2桁以上の英数字,L),
	すべて英数コード(L).

すべて英数コード([]) :- !.
すべて英数コード([_コード|R]) :-
	英数コード(_コード),
	すべて英数コード(R).

英数コード(Code) :- Code >=48,Code =< 57,!.
英数コード(Code) :- Code >=65,Code =< 90,!.
英数コード(Code) :- Code >=97,Code =< 122,!.

%  "A"にはマッチするけど"ABC"にはマッチしない正規表現お願いします 
% 
% 

'"A"にはマッチするけど"ABC"にはマッチしない'(_文字列,S0,'A',S1) :-
	sub_atom(_文字列,St,Len,R1,'A'),
	\+(sub_atom(_文字列,St,3,R2,'ABC')),
	sub_atom(_文字列,0,St,_,S0),
	St2 is St + Len,
	sub_atom(_文字列,St2,R2,0,S1).

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

'"A"にはマッチするけど"ABC"にはマッチしない'(_文字列,S0,S,S1) :-
	atom_chars(_文字列,Chars),
	'"A"にはマッチするけど"A","B","C"にはマッチしない'(Chars,L0,L,L1),
	concat_atom(L,S),
	concat_atom(L0,S0),
	concat_atom(L1,S1).

'"A"にはマッチするけど"A","B","C"にはマッチしない'(Chars,L0,['A'],L1) :-
	append(L0,['A'],L1,Chars),
	\+(append(L0,['A','B','C'],_,Chars)).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  特定の文字だけで構成される行 にマッチする正規表現をお願いします。 
%   
%  あああああああ 
%  wwwwwwwwwww 
%  HHHHHHHHHHHHH 
%   
%  のような行です。 
% 
% 

'特定の文字だけで構成される行にマッチする'([_行|_],_行)  :-
	atom_chars(_行,Chars),
	all(Chars,_).
'特定の文字だけで構成される行にマッチする'([_|R],_行)  :-
	'特定の文字だけで構成される行にマッチする'(R,_行).

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

'特定の文字だけで構成される行にマッチする'(_文字列,_行) :-
	atom(_文字列),
	atom_chars(_文字列,_文字ならび),
	'特定の文字だけで構成される行にマッチする'(_文字ならび,_行).
'特定の文字だけで構成される行にマッチする'(_文字ならび,_行)  :-
	append(L0,['\n'|R],_文字ならび),
	all(L0,A),
	\+(A='\n'),
	concat_atom(L0,_行).
'特定の文字だけで構成される行にマッチする'(_文字ならび,_行)  :-
	append(L0,['\n'|R],_文字ならび),
	all(L0,A),
	\+(A='\n'),
	'特定の文字だけで構成される行にマッチする'(R,_行).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  【】で囲まれた任意の同一文字列(文字数可変)が2回続いた場合にマッチする正規表現をお願いします 
%   
%  【AAA】【AAA】はマッチ 
%  【AAA】【BBB】はマッチしない 
%   
%  という感じです 
% 
% 

'【】で囲まれた任意の同一文字列(文字数可変)が2回続いた場合にマッチする'(_対象文字列,_照合部分より前の文字列,_照合部分文字列,_残り文字列) :-
	atom_chars(_対象文字列,Chars),
	照合基本部分(L,L0,L1,L2),
	append(L1,R,L2),
	append(L1,L1,L11),
	atom_chars(_照合部分より前の文字列,L0),
	atom_chars(_照合部分文字列,L11),
	atom_chars(_残り文字列,R).

照合基本部分(L,L0,L1,L2) :-
	append(L0,['【'|L10],['】'|L2],L),
	all(L10,A),
	append(['【'|L10],['】'],L1).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   
%  .replace(/^(http:\/\/farm1\.static\.flickr\.com\/[^/]+\/\w+_\w+_)m(\.\w+)$/, "$1o$2") 
%   
%  ↑ 
%  のスクリプトを改変したいのですが、 
%  以下の場合の正規表現をそれぞれ教えてください  
% 
%  ( 1 ) 
%  http://ime.nu/img.pics.livedoor.com/*/*/*/*-*.jpg 
%  ↓ 「*-*.jpg」を「*-1024.jpg」に変える 
%  http://ime.nu/img.pics.livedoor.com/*/*/*/*-1024.jpg 
%   
%  ※こういうURL置換させることを目指してます  
%  http://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-M.jpg 
%  ↓ 
%  http://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-1024.jpg 
%   
%   
%  ( 2 ) 
%  http://ime.nu/*.photobucket.com/*/*/*/th_*.jpg 
%  ↓ 「th_」を削除 
%  http://ime.nu/*.photobucket.com/*/*/*/*.jpg 
%   
%  ※こういうURL置換させることを目指してます  
%  http://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/th_alex1a.jpg 
%  ↓ 
%  http://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/alex1a.jpg 
%   
%   
%  ( 3 ) 
%  http://ime.nu/*.content.foto.mail.ru/*/*/*/*-*.jpg 
%  ↓ 「*-*.jpg」を「i-*.jpg」に変える 
%  http://ime.nu/*.content.foto.mail.ru/*/*/*/i-*.jpg 
%   
%  ※こういうURL置換させることを目指してます  
%  http://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/p-5879.jpg 
%  ↓ 
%  http://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/i-5879.jpg 
% 
% 

'例えば、http://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-M.jpgをhttp://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-1024.jpg に変えたい'(URL1,URL2) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['.jpeg'],[A,B]),
       append(L1,[A,'-1024',B],L2),
       concat_atom(L2,URL2).

'例えば、http://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/th_alex1a.jpgをhttp://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/alex1a.jpg に変えたい'(URL1,URL2) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['.jpeg'],[A,B]),
       append(L1,[alex1a,B],L2),
       concat_atom(L2,URL2).

'例えば、http://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/p-5879.jpgをhttp://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/i-5879.jpg に変えたい'(URL1,URL2) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['-'],[A,'-',B]),
       append(L1,[i,'-',B],L2),
       concat_atom(L2,URL2).

'例えば、http://c3.ac-images.myspacecdn.com/images02/80/m_22e6adfa8f2b4dafbf00b28a78e9db6e.jpgをhttp://c3.ac-images.myspacecdn.com/images02/80/l_22e6adfa8f2b4dafbf00b28a78e9db6e.jpg に変えたい'(UR1,URW) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['_'],[A,'_',B]),
       append(L1,[i,'_',B],L2),
       concat_atom(L2,URL2).

'例えば、http://sphotos.ak.fbcdn.net/hphotos-ak-snc1/hs137.snc1/5852_132531839605_775304605_3072465_7463459_s.jpgをhttp://sphotos.ak.fbcdn.net/hphotos-ak-snc1/hs137.snc1/5852_132531839605_775304605_3072465_7463459_n.jpg に変えたい'(URL1,URL2) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['_','.jpeg'],L),
       append(L1,[_,'.jpeg'],L),
       append(L1,[n,'.jpeg'],L2),
       concat_atom(L2,URL2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  A=01 
%  A=02 
%  A=abc01 
%  A=_abc_02 
%  A=01_02_abc 
%   
%  これで、A=01 や A=02 だけにマッチさせる記述を教えてください 
%  A=(?!abc|_abc)\w+ 
%  ではA=01_02_abcまでマッチしてしまいます 
%  A=(?!abc|_abc)\w+(?!_abc) でも A=(?!abc|_abc)\w+(?!_abc)$ でもダメでした 
%  よろしくお願いします 
% 

'A=01\\nA=02\\nA=abc01\\nA=_abc_02\\nA=01_02_abc\\n これで、A=01 や A=02 だけにマッチさせる'(A,'','01','') :-
	sub_atom(A,0,_,0,'01'),!.
'A=01\\nA=02\\nA=abc01\\nA=_abc_02\\nA=01_02_abc\\n これで、A=01 や A=02 だけにマッチさせる'(A,'','02','') :-
	sub_atom(A,0,_,0,'02'),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  test.abc.ne.jp 
%  test.abcdef.ne.jp 
%  test.ztv.ne.jp 
%   
%  「test.abc.ne.jpは除外」というルールを 
%  ^test\.[^abc]+\.ne\.jp$ 
%  と書いたのですが、test.abcdef.ne.jpも除外されてしまいます 
%   
%  ^test\.(?!abc(?!def))\w+\.ne\.jp$ 
%  と書けばいいのですが、(?!)は環境により使えません 
%  (?!)を使わず、「test.abc.ne.jpを除外し、test.abcdef.ne.jpは除外しない」というルールを教えていただきたいです。よろしくお願いします 
% 
% 
% abcとneの間にdefだけは入ることができない場合

除外文字列(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c|L1],['.',n,e,'.',j,p|_],Chars),
	\+(L1 = [d,e,f]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% abcとneの間には何も入ることができない

除外文字列(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c'.',n,e,'.',j,p|_],Chars).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  test.abc.ne.jp 
%  test.abcdef.ne.jp 
%  test.ztv.ne.jp 
%   
%  「test.abc.ne.jpは除外」というルールを 
%  ^test\.[^abc]+\.ne\.jp$ 
%  と書いたのですが、test.abcdef.ne.jpも除外されてしまいます 
%   
%  ^test\.(?!abc(?!def))\w+\.ne\.jp$ 
%  と書けばいいのですが、(?!)は環境により使えません 
%  (?!)を使わず、「test.abc.ne.jpを除外し、test.abcdef.ne.jpは除外しない」というルールを教えていただきたいです。よろしくお願いします 
% 
% 

'test.abcと.ne.jpの間にdefだけは入ることができない'(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c|L1],['.',n,e,'.',j,p|_],Chars),
	\+(L1 = [d,e,f]).

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

'test.abcと.ne.jpの間には何も入ることができない'(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c'.',n,e,'.',j,p|_],Chars).

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

'test.abcと.ne.jpの間には何も入ることができない'(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c|L1],['.',n,e,'.',j,p|_],Chars),
	L1 = [].

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Flexible Renamerというソフトで音楽ファイル名の検索&一括置換したいのですが、 
%   
%  対象: aaa_bbb_01ccc.mp3 
%  ↓ 
%  結果: aaa_bbb_01_ccc.mp3 
%   
%  "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい、ということです。 
%   
%  よろしくおねがいします。 
% 
% sub_atom/10 は http://nojiriko.asai/prolog/t264_u.html を参照

'対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_区切り直された名前) :-
	split(_名前,['_'],[_項1,_項2,_項3]),
	sub_atom(_項3,_検索位置,1,_残り文字数,H,A,T,_,_,_),
	\+((A@>='0',A@=<'9')),
	concat_atom([_項1,'_',_項2,'_',H,'_',A,T],_区切り直された名前),!.
'対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_名前).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  サクラエディタで、改行部分を連番+改行に置き換えたいのですけど、連番に変換するには
%  どうしたらよろしいでしょうか? 
%   
%  文字列1 
%  文字列2 
%   
%  を 
%  1 
%  文字列1 
%  2 
%  文字列2 
%   
%  といったかんじです。 
%   

'改行部分を連番+改行に置き換える'(_ファイル) :-
	get_lines(_ファイル,Lines),
	open(_ファイル,write,Outstream),
	append(L0,[Line|R],Lines),
	length([_|L0],N),
	write_formatted(Outstream,'%t\n%t\n',[N,Line]),
	R = [],
	close(Outstream).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  ●正規表現の使用環境 
%  Devas(ディレクトリ内の再帰検索及び置換ソフトでGrep互換) 
%   
%  ●検索か置換か? 
%  検索と置換 
%   
%  ●説明 
%  HTMLのaタグにonclick属性を追加,または追記したい 
%   
%  ●対象データ 
%  数百のSmartyテンプレート 
%  (HTMLやフレームワークのコードを含む文字列) 
%  単純に<a hrefで始まるものばかりではなく,<a class等で始まるものもある 
%   
%  ●希望する結果 
%  htmlのaタグから 
%  href="xxxxx-regist"を含んでおり, 
%  かつonclick="xxx"含んでいる または 含んでいないものを検索,置換し 
%  onclickにアクションを追加または追記 
%   
%  <a href="xxx-regist" onclick="追加または追記したい"> 
%   
%   
%   
%  対象ページが数百もあり,とても手作業で修正できないため正規表現の力を借りたいです 
%  aタグはすぐにhrefで始まるものばかりではないため,以下のような正規表現を考えたのですが, 
%  なぜか複数行に渡ってしまう結果が抽出されたりとうまくいきません 
%   
%  href=".+\-regist".+?(onclick="(.+)")?.+?\n 
%   
%   
%  ご教授いただけないでしょうか・・ 
% 
% 

数百のSmartyテンプレートのonclickタグを追加または変更する(_ファイル名ならび) :-
	append(_,[_ファイル|R],_ファイル名ならび),
	'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル),
	R = [],!.        

'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル) :-
	get_chars(_ファイル,Chars),
	'onclickにアクションを追加または追記'(Chars),!.

'onclickにアクションを追加または追記'(Chars) :-
	'aタグを選別'(Chars,L0,R1,R2,_Atag),
	'onclick要素候補'(_Atag,_onclick要素候補),
	'onclick句の生成'(_onclick要素候補,_onclick句),
	put_chars(L0),
	'現在のonclick句の削除'(R1,R11),
	append(R11,_onclick句,R12),
	put_chars(['<',a,' '|R12]),
	put_chars(['<','/',a,'>']),
	'onclickにアクションを追加または追記'(R2).

'aタグを選別'(Chars,L0,R1,R2,_Atag) :-
	append(L0,['<',a,' '|R1],['<','/',a,'>'|R2],Chars),
	\+(append(_,['<','a',' '|_],R1)),
	\+(append(_,['<','/',a,'>'|_],R1)),
	_Atag = ['<',a',' '|R1].

'onclick要素候補'(_Atag,_onclick要素候補) :-
	append(L0,[h,r,e,f,'=','"'|_onclick要素候補],['-',r,e,g,i,s,t,'"'|R2],_Atag),!.

'onclick句の生成'(_onclick要素候補,_onclick句) :-
	append([' ',o,n,c,l,i,c,k,'=','"'|_onclick要素候補],['"',' '],_onclick句).

'現在のonclick句の削除'([],[]) :- !.
'現在のonclick句の削除'([' ',o,n,c,l,i,c,k,'=','"'|R1],[' '|R2]) :-
	append(_,['"',' '|R2],R1),!.
'現在のonclick句の削除'([A|R1],[A|R2]) :-
	'現在のonclick句の削除'(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  撮影した写真に付けた名前を一括変更しようと思い、 
%  正規表現を扱えるFlexible Renamerを用いて色々と試しているのですが、いまいち行いたいことが出来ません。 
%  ファイルに付いている一定の法則でついている共通したタグを、ファイル名の末尾に"移動"させたいのです。 
%  例: [2010-12-13] [IN] AABBCC.nef -> [IN] AABBCC [2010-12-13].nef 
%  検索では \[20..-..-..] と打つことで指定することができたのですが、移動の仕方が検索しても見つかりません… 
%   
%  正規表現では"移動"を行うことは出来ないのでしょうか? 
%  どうかご教示お願いします! 
% 

'ファイル名に付いている一定の法則でついている共通したタグを、ファイル名の末尾に"移動"させたい'(_ファイル名,_タグを末尾に移動したファイル名) :-
	sPLIT(_ファイル名,['[',']','.','-'],L),
	append(L0,['[',A,-,B,-,C,']'|R],L),
	sub_atom(A,0,2,_,'20'),
	append(R0,['.'|R1],R),
	append(L0,['[',A,-,B,-,C,']'|R0],[.|R1],L),
	concat_atom(L,_タグを末尾に移動したファイル名),!.

%  2回以上続く改行だけ検索したいのですが、どうやっても1回のみの改行も検索してしまいます。 
%  \r\nを2回ってだけではだめなようで、解決策はありますか? 
% 
% 

'2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :-
	atom_chars(_文字列,Chars),
	append(L0,['\n'|R],Chars),
	append(L1,R1,R),
	\+(R1=['\n'|_]),
	all(L1,'\n'),
	concat_atom(L0,_検索語より前の文字列),
	concat_atom(L1,_検索語),
	concat_atom(R1,_検索語より後の文字列).
'2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :-
	atom_chars(_文字列,Chars),
	append(L0,['\n'|R],Chars),
	append(L1,R1,R),
	\+(R1=['\n'|_]),
	all(L1,'\n'),
	concat_atom(L0,_),
	concat_atom(L1,_),
	concat_atom(R1,_検索語より後の文字列_1),
	'2回以上続く改行だけ検索したい'(_検索語より後の文字列_1,_検索語より前の文字列,_検索語,_検索語より後の文字列).

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

'2回以上続く改行だけ検索したい'(Lines,L0,[A|L1],R) :-
	append(L00,L1,R,Lines),
	all(L1,''),
	\+(R=[''|_]),
	append(L0,[A],L00).
'2回以上続く改行だけ検索したい'(Lines,L0,L1,L2) :-
	append(L00_1,L1_1,R_1,Lines),
	all(L1_1,''),
	\+(R_1=[''|_]),
	append(L0_1,[Line],L00_1),
	'2回以上続く改行だけ検索したい'(R,L0,L1,L2).

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

'2回以上続く改行だけ検索したい'(Chars,L0,['\n','\n'],R) :-
	append(L0,L1,L2,Chars),
	\+(last(L0,'\n')),
	\+(list_nth(1,L2,'\n')).
'2回以上続く改行だけ検索したい'(Chars,L0,L1,L2) :-
	append(L00,L11,L22,Chars),
	all(L11,'\n'),
	\+(last(L00,'\n')),
	\+(list_nth(1,L22,'\n')),
	'2回以上続く改行だけ検索したい'(L22,L0,L1,L2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  すみません、後ひとつ聞きたいんですが 
%   
%  2桁以上の整数を、すべて+1する置き換えかたはありますか? 
%  5 
%  50 
%  100 
%  134 
%  1295 
%  ↓ 
%  5 
%  51 
%  101 
%  135 
%  1296 
%  って感じです 
%  よろしくお願いします。 
% 
% 

f(X,Y) :- X > 10,Y is X + 1,!.
f(X,X).

'2桁以上の整数を、すべて+1する置き換え'(_文字列,_置き換えられた文字列) :-
	文字列の中の数値列を選別して関数を適用する(_文字列,_置き換えられた文字列).

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

文字列の中の数値列を選別して関数を適用する(_文字列,_適用後の文字列) :-
	sPLIT(_文字列,['0','1','2','3','4','5','6','7','8','9'],L1),
	一文字の数字または数字ならびを数値にまとめる(L1,L2),
	数値要素のみに関数を適用(L2,L3),
	concat_atom(L3,_適用後の文字列).

一文字の数字または数字ならびを数値にまとめる([],[]) :- !.
一文字の数字または数字ならびを数値にまとめる(L1,[_数値|R2]) :-
	数字以外に出会うまで(L1,_数値,R),
	一文字の数字または数字ならびを数値にまとめる(R1,R2),!.
一文字の数字または数字ならびを数値にまとめる([A|R1],[A|R2]) :-
	一文字の数字または数字ならびを数値にまとめる(R1,R2).

数字以外に出会うまで(L1,_数値,R) :-
	append(L0,[A|_],L1),
	\+(append(_,[A|_],['0','1','2','3','4','5','6','7','8','9'])),
	concat_atom(L0,_数値アトム),
	atom_to_term(_数値アトム,_数値,_),!.
数字以外に出会うまで(L1,L1,[]).

数値要素のみに関数を適用([],[]) :- !.
数値要素のみに関数を適用([A|R1],[B|R2]) :-
	number(A),
	f(A,B),
	数値要素のみに関数を適用(R1,R2),!.
数値要素のみに関数を適用([A|R1],[A|R2]) :-
	\+(number(A)),
	数値要素のみに関数を適用(R1,R2).

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

numbers(['0','1','2','3','4','5','6','7','8','9']).

'2桁以上の整数を、すべて+1する置き換え'(_文字列,_置き換えられた文字列) :-
	numbers(Numbers),
	'sPLIT'(_文字列,Numbers,L1),
	'2桁以上の整数を、すべて+1する置き換え'(L1,Numbers,L2),
	concat_atom(L2,_置き換えられた文字列).

'2桁以上の整数を、すべて+1する置き換え'([A|R1],Numbers,[A|R2]) :-
	\+(member(A,Numbers)),
	'2桁以上の整数を、すべて+1する置き換え'(R1,Numbers,R2).
'2桁以上の整数を、すべて+1する置き換え'(L1,Numbers,[S|R3]) :-
	'数値文字ならびの切り取り'(L1,Numbers,L4,R),
	concat_atom(L4,A),
	atom_to_term(A,N),
	N2 is N + 1,
	write_formatted_atom(S,'%02d',[N2]),
	'2桁以上の整数を、すべて+1する置き換え'(R,Numbers,R3).

数値文字ならびの切り取り([],Numbers,[],[]) :- !.
数値文字ならびの切り取り([A|R],Numbers,[],[A|R]) :- \+(member(A,Numbers)),!.
数値文字ならびの切り取り([A|R1],Numbers,[A|R2],R3) :-
	数値文字ならびの切り取り(R1,Numbers,R2,R3).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境  
%  PHP5 
%   
%  ●検索か置換か?  
%  検索  
%   
%  ●説明  
%  [[ と ]] に囲まれた文字列を配列で取得したい  
%   
%  ●対象データ  
%  [[hare]][[ame]][[kumori]][[yuki]][[]][[kaminari]][[taifuu]] 
%   
%  ●希望する結果  
%  matches[0] = hare 
%  matches[1] = ame 
%  matches[2] = kumori 
%  matches[3] = yuki 
%  matches[4] = 
%  matches[5] = kaminari 
%  matches[6] = taifuu 
%   
%  よろしくお願いします。 
% 

'[[ と ]] に囲まれた文字列をならびとして取得したい'(_文字列,L) :-
	atom_chars(_文字列,Chars),
	'文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,L).

'文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,[_文字列1|R]) :-
	append(L0,['[','['|R1],[']',']'|R2],Chars),
	concat_atom(R1,_文字列1),
	'文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(R2,R),!.
'文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(_,[]) :- !.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●環境 
%  vb.net 
%   
%  ●したいこと 
%  3文字以上の繰り返し表現を抽出 
%   
%  ●サンプル 
%  例文1)死にたい死にたい死にたい死にたい死にたい 
%  結果1)死にたい 
%   
%  ●したいこと 
%  2箇所以上出現する3文字以上の文字列
%   
%  例文2)筋肉バスターと阿修羅バスター 
%  結果2)バスター 
%   
%   
%  ってのを正規表現でやるのは無理でしょうか・・・ 
% 

'重複しない3文字以上の繰り返し表現を抽出'(_文字列,_重複しない3文字以上の繰り返し表現ならび) :-
	findsetof(_3文字以上の繰り返し表現,(
		    '3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現),
		  _重複しない3文字以上の繰り返し表現ならび).

'3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現) :-
	sub_atom(_文字列,_開始点,_長さ,_残り長さ,[_3文字以上の繰り返し表現|R]),
	_長さ >= 3,
	_開始点2 is _開始点 + _長さ,
	sub_atom(_文字列,_開始点2,_長さ,_残り長さ2,_3文字以上の繰り返し表現).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  .net Framework 2.0 - 3.5 (C#) 
%   
%  ●検索か置換か? 
%  検索 
%   
%  ●説明 
%  artist, titleの各グループの文字列を取得したい 
%   
%  ●対象データ 
%  Artist - Title 
%   
%  ●希望する結果 
%  artist = Artist 
%  title = Title 
%   
%  よろしくおねがいします。 
% 

'artist, titleの各グループの文字列を取得したい'(_対象データ,_希望する結果) :-
	split(_対象データ,[' '],L),
	'artist, titleの切り出し'(L,Artist,Title),
	write_formatted_atom(_希望する結果,'artist = %t\ntitle = %t',[Artist,Title]). 

'artist, titleの切り出し'([Artist,Title],Artist,Title) :- !.
'artist, titleの切り出し'([Artist,_,Title|_],Artist,Title) :- !.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  秀丸 8.0.2 b5 
%   
%  ●検索か置換か? 
%  検索 
%   
%  ●説明 
%  条件にマッチする行を指定数だけ抽出する 
%   
%  ●対象データ 
%  a hogehoge1 
%  b hogehoge2 
%  c hogehoge3 
%  a hogehoge4 
%  a hogehoge5 
%  c hogehoge6 
%  a hogehoge7 
%  b hogehoge8 
%   
%  ●希望する結果 
%  "a " で始まる行を 3 つだけ表示させる 
%  a hogehoge1 
%  a hogehoge4 
%  a hogehoge5 
%   
%  宜しくお願いします。 
% 
%
%  3つだけと言う場合、3つ未満だった時どうするか。failにするなら2引数の方の第一節を削除する。
%

'"a " で始まる行を 3 つだけ表示させる'(Lines) :-
       '"a " で始まる行を 3 つだけ表示させる'([_,_,_],Lines).

'"a " で始まる行を 3 つだけ表示させる'(_,[]) :- !.
'"a " で始まる行を 3 つだけ表示させる'([],_) :- !.
'"a " で始まる行を 3 つだけ表示させる'([_|Ln],[Line|R]) :-
	sub_atom(Line,0,_,_,'a '),
	write_fromatted('%t\n',[Line]),
	'"a " で始まる行を 3 つだけ表示させる'(Ln,R),!.
'"a " で始まる行を 3 つだけ表示させる'(Ln,[_|R]) :-
	'"a " で始まる行を 3 つだけ表示させる'(Ln,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  使用言語はjavascript。 
%  独自のタグ(<A#...#A>)が設定されたテキスト行から、このタグを取り除きたい。 
%  テキスト行中にタグが複数出てくることもあり。 
%   
%  置換前 : あいうえお <A#かきくけこ#A> さしすせそ <A#たちつてと#A> なにぬねの 
%   
%  置換後 : あいうえお  さしすせそ  なにぬねの 
%   
%   
%  どうやったらいいですかあああああボスケテーーー!!! 
% 

'独自のタグ(<A#...#A>)が設定されたテキスト行から、このタグを取り除きたい。'(_文字列,_独自のタグを取り除いた文字列) :-
	atom_chars(_文字列,Chars),
	append(L0,['<','A','#'|R1],['#','A','>'|R2],Chars),
	append(L0,R2,L2),
	concat_atom(L2,_独自のタグを取り除いた文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  .net(C#3.0) 
%   
%  ●検索か置換か? 
%  検索 
%   
%  ●説明 
%  空白をデリミタとして、最初の文字列を取得したい 
%  空白は半角全角両方あり、複数連続することもあり得る 
%  ただし、()や[]で囲まれる文字列はスルー(空白として処理する) 
%  正規表現一発で抜き出したいです 
%   
%  下記例の各行は全て「山田太郎」だけ抽出されるようにしたいです 
%   
%  山田太郎 39才 
%   山田太郎 39才 
%  (A社) 山田太郎 39才 
%  (A社)山田太郎  39才 
%  (A社 B課)山田太郎 39才 
%  山田太郎(A社)39才 

'空白をデリミタとして、最初の文字列を取得したい。空白は半角全角両方あり、複数連続することもあり得るただし、()や[]で囲まれる文字列はスルー(空白として処理する)'(_文字列,_最初の文字列) :-
	split(_文字列,[' ',' ','(',')','[',']'],L1),
	'空白をデリミタとして、最初の文字列を取得したい。'(L1,_最初の文字列).


'空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :-
	'()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2),
	'空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!.
'空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :-
	空白は半角全角両方あり、複数連続することもあり得る(L1,L2),
	'空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!.
'空白をデリミタとして、最初の文字列を取得したい。'([A|_],Atom).

'()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :-
	append(L0,['('|R1],[')'|R2],L1),
	append(L0,[' '|R2],L2),!.
'()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :-
	append(L0,['['|R1],[']'|R2],L1),
	append(L0,[' '|R2],L2),!.

空白は半角全角両方あり、複数連続することもあり得る([],[]) :- !.
空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :-
	空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!.
空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :-
	空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  ABCと続く場合を除くABという文字列を指定したい場合は
%  どのように書いたらよいでしょうか・・・ 

'ABCと続く場合を除くABという文字列'(_文字列,_前文字列,'AB',_後文字列) :-
	sub_atom(_文字列,S,2,R,'AB'),
	\+(sub_atom(_文字列,S+2,1,_,'C')),
	sub_atom(_文字列,0,S,_,_前文字列),
	sub_atom(_文字列,S+2,R,0,_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  /tatakanamk/ 
%  と言う文字列があって/から/までの検出をするにはどう書けばよいでしょうか? 
%  /と/も含めて12文字を検出したいのです。 
%  超初歩的ですがよろしくお願いします。 
% 
% 
% http://nojiriko.asia/prolog/t264_u.html

'/tatakanamk/ と言う文字列があって/から/までの検出をする'(_文字列,_前文字列,'/tatakanamk/',_後文字列) :-
	sub_atom(_文字列,0,12,_,_前文字列,'/tatakanamk/',_後文字列,_,_,_).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  <html> 
%  <head> 
%  <title>テスト</title> 
%  </head> 
%  <body> 
%  <!-- ここから --> 
%  あああああああああああ<br /> 
%  あああああああああああ<br /> 
%  あああああああああああ<br /> 
%  あああああああああああ<br /> 
%  あああああああああああ 
%  <!-- ここまで --> 
%  </body> 
%  </html> 
%   
%  このようなhtmlをPHP5のfile_get_contentsで読み込んで 
%  <!-- ここから -->〜<!-- ここまで -->を取得したいのですが 
%  どうすれば良いですか? 
%   
%  "/<!-- ここから -->(.*)<!-- ここまで -->/" 
%  で読めませんでした 
% 
% 

'このようなhtmlをPHP5のfile_get_contentsで読み込んで<!-- ここから -->〜<!-- ここまで -->を取得したい'(_html,_ここから_ここまで) :-
	get_chars(_html,Chars),
	append(_,[<,!,-,-,' ',こ,こ,か,ら,' ',-,-,>]|R1],[<,!,-,-,' ',こ,こ,ま,で,' ',-,-,>]|R2],Chars),
	concat_atom(R1,_ここから_ここまで).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  php5です。ファイルのフルパスをディレクトリ,ファイル名,拡張子に分割してその配列を返したくてこう書きました。 
%   
%  $pattern1 = '`^(.*)(?:[/\\\](.*)){1}$`'; 
%  preg_match($pattern1, $fullpath, $match1); 
%  $pos = strpos($match1[2], '.'); 
%  if($pos === false){ 
%      return array($match1[1], $match1[2]); 
%  }else{ 
%      $pattern2='`^(.*?)\.(.*)$`'; 
%      preg_match($pattern2, $match1[2], $match2); 
%      return array($match1[1], $match2[1], $match2[2]); 
%  } 
%   
%  必ず拡張子があるなら一度のpreg_matchでキャプチャ出来たのですが 
%  拡張子無しファイル混じりだった場合の正規表現がうまく思いつかずに二段階(三段階?)になってしまいました 
%  でもpreg_matchやってその中で'.'探して、あったらさらにpreg_matchというのはまわりくどいように思います 
%   
%  この処理を一度にこなす正規表現の考え方のヒントをください 
% 
% 

'ファイルのフルパスをディレクトリ,ファイル名,拡張子に分割'(_ファイル名,_ディレクトリ,_ファイル名,_拡張子) :-
	sPLIT(_ファイル名,['/','.'],L),
	append(L0,[_ファイル,'.',_拡張子],L),
	concat_atom(L0,_ディレクトリ),!.
'ファイルのフルパスをディレクトリ,ファイル名,拡張子に分割'(_ファイル名,_ディレクトリ,_ファイル名,'').
	sPLIT(_ファイル名,['/','.'],L),
	append(L0,[_ファイル],L),
	concat_atom(L0,_ディレクトリ),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  php4.3.11です 
%  --------------------------------- 
%  $str = <<< DOC_END 
%  あああああ 
%  いいいいい 
%  <html_start> 
%  ううううう 
%  えええええ 
%  <html_end> 
%  おおおおお 
%  DOC_END; 
%   
%  $pattern = "/<html_start>(.*)<html_end>/"; 
%  $replacement = 'aaaabbbb'; 
%   
%  $res = preg_replace($pattern, $replacement, $str); 
%  print_r($res); 
%  --------------------------------- 
%  と出力してみましたが何も表示されませんでした。 
%  ホントは「あああああいいいいいaaaabbbbおおおおお」と出て欲しかったのですが…。 
%  最終的には<html_start><html_end>で囲まれた範囲に 
%  PHPのhtmlspecialchars()やnl2br()関数を適用して出力したいです。 
% 

'あああああ\nいいいいい\n\nううううう\nえええええ\n\n\nおおおおお\n を あああああいいいいいaaaabbbbおおおおお に置換する'(_置換された文字列) :-
	split(''あああああ\nいいいいい\n\nううううう\nえええええ\n\n\nおおおおお\n',['\n'],L),
	append(L0,[''|R1],[''|R2],L),
	append(L0,[aaaabbb|R2],L2),
	concat_atom(L2,_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  IPを正規表現でチェックしたいのですが 
%  210.000.111.1〜210.000.111.255 
%  215.100.000.1〜215.100.000.255 
%  の2つに当てはまる場合、TRUE(int1)をかえすにはどうすればいいでしょうか? 
%  以下のようにやってみたのですが他のIPでもint(1)がかえってきます。 
%   
%  preg_match('/^210\.000\.111\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ || ^215\.100\.000\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $_SERVER['REMOTE_ADDR']) 
%   
% 

'IPが210.000.111.1〜210.000.111.255 か 215.100.000.1〜215.100.000.255 の範囲にある'(IP) :-
	split(IP,['.'],[210,0,111,D]),
	D >= 1,
	D =< 255,!.
'IPが210.000.111.1〜210.000.111.255 か 215.100.000.1〜215.100.000.255 の範囲にある'(IP) :-
	split(IP,['.'],[215,100,0,D]),
	D >= 1,
	D =< 255,!.

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

'IPがある範囲にあるか'(IPの文字列表現,IPの範囲表現) :-
	split(IPの文字列表現,[U1,U2,U3,U4]),
	split(IPの範囲表現,['~'],[IP1,IP2]),
	split(IP1,['.'],[A1,A2,A3,A4]),
	split(IP2,['.'],[B1,B2,B3,B4]),
	U1 >= A1,U1 =< B1,
	U2 >= A2,U2 =< B2,
	U3 >= A3,U3 =< B3,
	U4 >= A4,U4 =< B4,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  VB.NETで正規表現を書いています。 
%  条件としては、「A0123」のように、先頭がアルファベットのAでその他が数字4桁という正規表現と、 
%  「01234」のような数字5桁という二種類のどちらかにマッチする正規表現を作っています。 
%  正規表現は苦手で困っています。 
%  どなたかご教授下さい。 
%  よろしくお願いします。 
% 

'「A0123」のように、先頭がアルファベットのAでその他が数字4桁か「01234」のような数字5桁という二種類のどちらか'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,St,5,R,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
	L2=['A'|R1]),
	すべてが数字(R2).        
'「A0123」のように、先頭がアルファベットのAでその他が数字4桁か「01234」のような数字5桁という二種類のどちらか'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,St,5,R,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
	すべてが数字(L2).

すべてが数字([]) :- !.
すべてが数字([A|R]) :-
	append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']),
	すべてが数字(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%        <TD width="52" height="25" bordercolor="#CCCCCC" valign="middle">  
%          <div align="center">F8FA</div> 
%        </TD> 
%   
%  これの 
%   
%  「F8FA」の部分をpreg_match_all取得したいのですが、 
%  '/<TD .*><div .*>(.*)</div><\/TD>/Ums' 
%   
%  としたのですが、何も取得されません。 
%  どのように表記すれば良いのでしょうか? 
% 

'TDタグの中のdivタグの値'(_文字列,_前文字列,_タグの値,_後文字列) :-
	sPLIT(_文字列,['','','',''|R2],L),
	append(L02,[''|R22],R2),
	append(L03,[''|R3],R22),
	append(L04,[''|R4],R3).
	concat_atom(L03,_タグの値),
	append(L01,[''|L02],L3),
	append(L3,[''],L4),
	concat_atom(L4,_前文字列),
	concat_atom([''|R3],_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  「あいうえおABC+F481ABC+F485かきくけこABC+F7A5さしすせそABC+F3F0ABC+F39EたちつてとABC+F65AなにぬねのABC+F485ABC+F7A5はひふへほABC+F7A5ABC+F39Eまみむめも」 
%   
%  上記の中に、「ABC+16進数x2回」がいくつ含まれているかをPHPの正規表現で表すにはどうかけばよろしいでしょうか? 
%  ご鞭撻よろしくお願いいたします。 
%   

'文字列の中に「ABC+16進数x2回」がいくつ含まれているか'(_文字列,_いくつ) :-
	atom_chars(_文字列,Chars),
	'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(Chars,[],Ln),
	length(Ln,_いくつ).

'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'([],Ln,Ln) :- !.
'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(['A','B','C','+',X1,X2,X3,X4|R1],Ln1,Ln) :-
	すべて16進数文字([X1,X2,X3,X4]),
	'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(Ln,R1,[_|Ln1]).
'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'([_|R1],Ln1,Ln) :-
	'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(R1,Ln1,Ln).

すべて16進数文字([]) :- !.
すべて16進数文字([A|R]) :-
	member(A,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']),
	すべて16進数文字(R).

先頭から16進数文字ならび([],[],[]) :- !.
先頭から16進数文字ならび([A|R1],[A|R2],R) :-
	member(A,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']),
	先頭から16進数文字ならび(R1,R2,R),!.
先頭から16進数文字ならび(L,[],L).

'16進数表示文字ならび'(['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  時間(13:00:00〜18:00:00)までを正規表現であらわしたいのですが、 
%   
%  1[3-8]:[0-5][0-9]:[0-5][0-9] 
%   
%  という感じに今なっています 
%  誰が見てもわかりやすいしこれでもいいのですが、もっと短い書き方はないものでしょうか? 
%   
%  [0-5][0-9]ここが反復なので、([0-5][0-9]:?){2}とか思いつくのですが、 
%  これだと最後にコロンが入っててもマッチしてしまうので回避できるような書き方はないものかなぁと。 
% 
% 

'コロン区切りの時分秒範囲の表現'(_時分秒文字列,_時下限,_分下限,_秒下限,_時上限,_分上限,_秒上限,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_時分秒文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,[A1,A2,:,B1,B2,:,C1,C2],_),
	最後が数字またはコロンではない(L1),
	先頭が数字またはコロンではない(L3),
	H is H1 * 10 + H2,
	M is M1 * 10 + M2,
	S is S1 * 10 + S2,
	[H,M,S] @>= [_時下限,_分下限,_秒下限],
	[H,M,S] @=< [_時上限,_分上限,_秒上限].

最後が数字またはコロンではない(L) :-
	last(L,A),
	append(_,[A|_],['0','1','2','3','4','5','6','7','8','9',':']),
	!,fail.
最後が数字またはコロンではない(_).

最初が数字またはコロンではない([A|_]) :-
	append(_,[A|_],['0','1','2','3','4','5','6','7','8','9',':']),
	!,fail.
最後が数字またはコロンではない(_).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  すみませんが、価格にマッチする正規表現を教えていただけないでしょうか。 
%   
%  例 
%  \1,000,000,000 
%  \12,345 
%  \1,230 
%  \200 
%  \10 
%   
%   
%  数字3つごとに、カンマが入り、先頭に円マーク(\)のくるものです。 
%   
%  判らないためググッたのですが、正規表現に関する本ばかり検索結果として出てきまして…。 
% 
% 

'価格にマッチする'(_文字列,_前文字列,_価格表現文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,_前文字列,_価格表現文字列,_後文字列,L1,['\\'|R2],L3),
	\+((L3=[A|_],append(_,[A|_],[',','0','1','2','3','4','5','6','7','8','9']))),
	カンマ付き数値ならび(R2).

カンマ付き数値ならび([]) :- !.
カンマ付き数値ならび(L) :-
	length(L,Len),
	Len =< 3,
	すべて数字(L),!.
カンマ付き数値ならび([A,B,C,','|R]) :-
	すべて数字([A,B,C]),
	カンマ付き数値ならび(R).
カンマ付き数値ならび([A,B,','|R]) :-
	すべて数字([A,B]),
	カンマ付き数値ならび(R).
カンマ付き数値ならび([A,','|R]) :-
	すべて数字([A]),
	カンマ付き数値ならび(R).

すべて数字([]) :- !.
すべて数字([A|R]) :-
	append(_[A|_],['0','1','2','3','4','5','6','7','8','9']),
	すべて数字(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  JavaScriptで下記のようなデータを取得したいです。 
%   
%  hogehoge[1]→1 
%  hogehoge[123]→123 
%  hogehoge[1243][]→1243 
%   
%  []の中身を取得したく、[]が2つあった場合は最初の[]の中身を取得します。 
%  (ただし、2個目の[]は常に空です。) 
%   
%  hogehogeは任意の文字列で、[]の中身は何桁か分からない数字の繰り返しです。 
%   
%  以上ご鞭撻の程お願いします。 
% 
% 

'[]の中身を取得したく、[]が2つあった場合は最初の[]の中身を取得します。'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	 sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[h,o,g,e,h,o,g,e,'['|R2],L3),
	 append(L0,[']'|R4],R2),
	 concat_atom(L0,_適合文字列),
	 concat_atom([S1,'hogehoge['],_前文字列),
	 concat_atom([']'|R4],S4),
	 concat_atom([S4|L3],_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ,"/web/sendmail.php","10","10","2000" 
%  こういう感じの文章の 
%  ,"2000" 
%  のみ抽出したいんですが、どう書けばいいんでしょうか? 
%   
%  ",".*[0-9]"$ 
%  だと"10","10","2000"まで拾っちゃうんです・・・。 
% 
% 

'"/web/sendmail.php","10","10","2000" こういう感じの文章の,"2000"のみ抽出したい'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	append(['"'|R1],['"'],L2),
	すべて数字(R1),
	length(R1,4),
	concat_atom(R1,_適合文字列),
	concat_atom([S1,'"'],_前文字列),
	concat_atom(['"',S3],_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  PHP 正規表現 
%   
%  PHPの正規表現を勉強しているのですが、どうもうまくいきません。今回は一番簡単な正規表現をつくったのですが、どうやったらよいのでしょうか。 
%   
%  $h = '(名前)様の会員IDは(abc12)で、(5)番目に偉い方です。'; 
%   
%  とあったら、名前、会員ID、番号を抜き出すには、どのようにしたらよいのでしょうか? 
%  実際に()は使用しません。 
%  また、$1 や $2 などを使いたいのですが、解説までできればお願いしたいです。 
%  一応自分なりに考えました。 
%  preg_match('/^*.([a-zA-Z0-9]){2}([0-9]+)','名前$2.ID$1 $3 番目に偉い'); 
%  ()を使えば、2つマッチさせたいときなどに分けることができるのでしょうか?  
%  (名前)様は(数字) 
%  例:太郎様は5 
%   
%  このとき太郎様という日本語の文字を取得するには/^(+.)([0-9])$/ 
%   
%  ここで名前は$1になり、数字は$2になるのでしょうか? 
%  どのような時に$1や$2がどっちがどっちなのかは、どのようにしたらわかるのでしょうか? 
%   
%   
%  長々した質問すいません。わかるかた教えてください。 
% 

'(名前)様の会員IDは(abc12)で、(5)番目に偉い方です。とあったら、名前、会員ID、番号を抜き出すには、どのようにしたらよいのでしょうか? 実際に()は使用しません。 '(_名前,_会員ID,_n番目) :-
	_文字列 = '名前様の会員IDはabc12で、5番目に偉い方です。',
	'名前、会員ID、番号を抜き出す'(_文字列,_名前,_会員ID,_n番目).

'名前、会員ID、番号を抜き出す'(_文字列,_名前,_会員ID,_n番目) :-
	split(_文字列,[様の会員IDは,'で、',番目に],[_名前,_会員ID,_n番目|_].

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させて下さい。 
%  PHP5を使っています。 
%  PHPの正規表現関数を使ってデータを取得しようと思っているのですが上手くいきません 
%  <INPUT maxLength=20 name=id value=""> 
%  このような文字列を対象に、文字列「type」が含まれていない場合、後方の「maxLength=20 name=id value=""」 
%  を取得したいのです。 
%  全文に対して繰り返し取得したいのでpreg_match_allを使っています。 
%   
%  preg_match_all( "/<input (^type)[^<](.*?)>/is", $data, $matchs ) 
%  このように書いたのですがヒットしてくれません。 
%  ドキュメントを見ると、特定文字に関しては[^a-z]のような書き方で対応できるのですが 
%  文字列に関してはどのようにすればよいのでしょうか? 
%  アドバイス頂ければ幸いです。 
%  宜しくお願い致します。 
% 
% 

'<INPUT maxLength=20 name=id value="">このような文字列を対象に、文字列「type」が含まれていない場合、後方の「maxLength=20 name=id value=""」を取得したい'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	  sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<','I','N','P','U','T',' '|R2],L3),
	  append(L,['>'],R2),
	  \+(append(_,['>'|_],L)),
	  \+(検索(S2,type)),
	  concat_atom(L,_適合文字列),
	  concat_atom([S1,''],R2),
	\+(append(_,['>'|_],R21)),
	'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(R2,L),
	concat_atom(L,_置換された文字列).

'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'([' ',/,>],[' ',/,>]) :- !.
'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(['>'],[' ',/,>]) :- !.
'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'([A|R1],[A|R2]) :-
	'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(R1,R2).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%  PHP5で使います 
%   
%  $numには、 
%   
%  +数字 
%  -数字 
%  数字 
%   
%  というようなパターンの時のみマッチさせたいです 
%  数字のところは 0〜999999999までの値が入ってきますが、0以外の時に頭に0がある場合0123とかは除外したいです 
%  試行錯誤して下記のようにしてみましたが、思った結果が得られません。エラー出まくりでなみだ目です 
%  どうかよろしくお願いします 
%   
%   
%  preg_match('/^(([^+]*)*(++[^-][^+]*)*)*?[^0-9]*$/',$num) 
% 

'+数字 -数字 数字 というようなパターンの時のみマッチさせたいです。数字のところは 0〜999999999までの値が入ってきますが、0以外の時に頭に0がある場合0123とかは除外したいです'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,_文字列,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
	適合診断(L2),
	\+((append(_,[A],L1),数字(A))),
	\+((L3 = [B|_],数字(B))).

適合診断([+|R]) :- すべて数字(R),!.
適合診断([-|R]) :- すべて数字(R),!.
適合診断([A|R]) :-
	A @>= '1',
	A @=< '9',
	すべて数字(R),!.

すべて数字([]) :- !.
すべて数字([A|R]) :-
	A @>= '0',
	A @=< '9',
	すべて数字(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Jeditで 
%  【あいう】を【6あいう】 
%  【かき】を【4かき】 
%  のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですが 
%  どのように検索してどのように置換すればよいでしょうか? 
%  【 】ではさまれた文字数はまちまちです。 
%  よろしくお願いします。 
% 

'【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですがどのように検索してどのように置換すればよいか'(_文字列,_置換された文字列) :-
	atom_chars(_文字列,Chars),
	'【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,L),
	concat_atom(L,_置換された文字列).

'【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,[S|R]) :-
	append(L0,['['|R1],[']'|R2],Chars),
	\+(append(_,['['|_],R1)),
	\+(append(_,[']'|_],R1)),
	length(R0,Len),
	Len2 is Len * 2,
	append(L0,['[',Len2|R0],[']'],L3),
	concat_atom(L3,S),
	'【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(R2,R).
	
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  失礼します 
%  使用言語はperl5です 
%   
%  配列に、前からマッチしたところまでの文字列を繰り返し入れようとしています 
%  ($str = 'hogehugahage'; 
%  という文字列があって、hでマッチさせたら 
%  @data = ['h', 'hogeh', 'hogehugah'] 
%  という配列になることを想定しています) 
%   
%  @data = $str =~ m/h/g; 
%  のときは予想どおり 
%  @data = ['h', 'h', 'h'] 
%  となったのですが、 
%  @data = $str =~ m/^.*h/g 
%  の場合は 
%  @data = ['hogehugah'] 
%  となって1回最大マッチするだけのようです 
%   
%  どうすれば予想通りの結果になるでしょうか? 
% 

'配列に、前からマッチしたところまでの文字列を繰り返し入れようとしています($str = ''hogehugahage'';という文字列があって、hでマッチさせたら@data = [''h'', ''hogeh'', ''hogehugah'']という配列になる'(_検索文字列,_文字列,_先頭から検索文字列までの文字列ならび) :-
	findall(_先頭から適合文字列まで文字列,
		    '前からマッチしたところまでの文字列ならび'(_検索文字列,_文字列,_先頭か適合文字列までの文字列),
		_先頭から適合文字列までの文字列ならび).

'前からマッチしたところまでの文字列ならび'(_検索文字列,_文字列,_適合文字列) :-
	sub_atom(_文字列,_,_,_,S1,_検索文字列,S3,L1,L2,L3),
	concat_atom([S1,_検索文字列],_適合文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  「id="72157612930889935" primary="3224910389" secret="be0cf48b4f" server="3468" farm="4" photos="131" videos="0"」という文字列から、 
%  「id=""」の数字を抜きたいのですが(この例であれば「72157612930889935」が欲しいです) 
%   
%  $patern = 'id="(.*)" ?'; 
%  ereg($patern,$line,$id); 
%  echo $id[1]."<br />\n"; 
%   
%  では最後のvideosの終わりのダブルコーテーションまで入ってしまいました。 
%   
%  ../test/read.cgi/php/1168450843/421に近いと思うのですが?で最短マッチ?になるような気もしますし 
%  ../test/read.cgi/php/1168450843/412にあるように?は0か1回の繰り返しのようにも思うし…。 
%  OSはCent4系、PHP4.1.3、関数はeregを使いました。どなたか助けて下さい 
% 
% 

'「id="72157612930889935" primary="3224910389" secret="be0cf48b4f" server="3468" farm="4" photos="131" videos="0"」という文字列から、「id=""」の数字を抜きたいのですが(この例であれば「72157612930889935」が欲しいです)'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[i,d,=,'"'|R2],['"'|R3]),
	\+(append(_,['"'|_],R2)),
	concat_atom(R2,_適合文字列),
	concat_atom([S1,'id="'],_前文字列),
	concat_atom(['"',S3],_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  phpです。 
%  たとえば普通に 
%  http://ime.nu/google.co.jpと書いてあるものと 
%  <a href="http://ime.nu/google.co.jp">test</a>と書いてある文字列があります。 
%   
%  この文字列内のタグになってないUrlをAタグでリンクを張りたいんですがどうしたらいいでしょうか。 
%   
% 
% 

'httpから始まるURLを取り出す'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[h,t,t,p,:,/,/,'"'|R2],L3),
	すべてURL構成文字(R2),
	\+((L3=[A|_],\+('URL構成文字'(A)))),
	concat_atom(R2,_適合文字列),
	concat_atom([S1,'http://"'],_前文字列),
	concat_atom(['"'|R2],_後文字列).

すべてURL構成文字([]) :- !.
すべてURL構成文字([A|R]) :-
	'URL構成文字'(A),
	すべてURL構成文字(R).

'URL構成文字'(A) :- append(_,[A|_],[:,/,+,-,%,~]),!.
'URL構成文字'(A) :- A @>= a,A @=< z,!.
'URL構成文字'(A) :- A @>= 'A',A @=< 'Z',!.
'URL構成文字'(A) :- A @>= '0',A @=< '9',!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  phpのクラスファイルの特定の関数を正規表現で抜き出したいのですが可能でしょうか? 
%   
%     例 class.test.php から public function test($a){ 本文 } 
%   
%  スケルトンコードの場合簡単に抜き出せるのですが、 
%  本文中にif,swichなどで } が存在した場合どうすれば良いのか悩んでいます。 
% 
% 

'function定義で{ } で括られた本文を取り出す。本文中にif,swichなどで } が存在した場合どうするか'(_文字列,_前文字列,_本文,_後文字列) :-
	atom_chars(_文字列,Chars),
	append(L0,[f,u,n,c,t,i,o,n,' '|R1],['{'|R2],Chars),
	\+(append(_,['{'|_],R1)),
	括弧が閉じられるまで切り取る(R2,L,R3),
	append([_],L1,[_],L11),
	concat_atom(L11,_本文),
	concat_atom(['}'|R3],_後文字列),
	append(L0,[f,u,n,c,t,i,o,n,' '|R1],['{'],L01),
	concat_atom(L01,_前文字列).
	
括弧が閉じられるまで切り取る(['}'|R],[],['}'|R]) :- !.
括弧が閉じられるまで切り取る(['{'|R1],L,R) :-
	括弧が閉じられるまで切り取る(R1,L1,['}'|R2]),
	括弧が閉じられるまで切り取る(R2,L2,R),
	append(['{'|L1],['}'|L2],L),!.
括弧が閉じられるまで切り取る([A|R1],[A|R2],R) :-
	括弧が閉じられるまで切り取る(R1,R2,R).


%  文字xが連続して10個以上である場合にマッチさせるのに 

文字xが10個以上である場合にマッチさせるのに(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
	length(L2,Len),
	Len >= 10,
	all(L2,x).

%  文字xが離散して10個以上であるか(一箇所でも連続してはいけない)

'文字列の中に文字xが離散して10個以上であるか(一箇所でも連続してはいけない)'(_文字列) :-
	'文字列の中に文字が離散してn個以上であるか(一箇所でも連続してはいけない)'(x,10,_文字列).

'文字列の中に文字が離散してn個以上であるか(一箇所でも連続してはいけない)'(_文字,_n個,_文字列) :-
	\+(sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[_文字,_文字],L3)),
	count(sub_atom(_文字列,_,1,_,_文字),Count),
	Count >= _n個,!.

%  文字xが離散して10個以上であるか(連続している部分は数えない)

'文字列の中に文字xが離散して10個以上であるか(連続している部分は数えない)'(_文字列) :-
	'文字列の中に文字が離散してn個以上であるか(連続している部分は数えない)'(x,10,_文字列).

'文字列の中に文字が離散してn個以上であるか(連続している部分は数えない)'(_文字,_n個,_文字列) :-
	count((
		    sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[_文字],L3),
		    \+((last(L1,_文字),L3=[_文字|_]))),
		Count),
	Count >= _n個,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  PHP 正規表現について 
%   
%  $str = 'test1?test2/test3;test4'; 
%   
%  この文字の 
%  test1 
%  test2 
%  test3 
%  test4 
%  を取り出すにはどうしたらよいでしょうか? 
%   
%  この価を 
%  data1=test1&data2=test2&data3=test3&data4=test4 
%  と変換したいです 
%   
%  preg_replaceを使っています 
%  $str = preg_replace("・^([a-zA-Z0-9]+\?+[a-zA-Z0-9]+)\/+[a-zA-Z0-9];+[a-zA-Z0-9)$・","data1=$1&data2=$2&data3=$3&data4=$4",$str)); 
%   
%   
%  これではダメみたいです 
% 

'$str = ''test1?test2/test3;test4''; この文字の test1 test2 test3 test4 を取り出すにはどうしたらよいでしょうか?'(_文字列,L) :-
	split(_文字列,['?','/',';'],L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  以下のような文字列を置換ですべて削除したいのですが 
%  どうかけばいいのでしょうか 
%   
%  onMouseOver="refPopUp(1,event)" onMouseOut="hidePop()" 
%  onMouseOver="refPopUp(23,event)" onMouseOut="hidePop()" 
%  onMouseOver="refPopUp(345,event)" onMouseOut="hidePop()" 
%  ↓ 
%  3行すべて削除 
%   
%  試した正規表現 
%  onMouseOver="refPopUp(\d+{1,3}.,event)" onMouseOut="hidePop()" 
% 
% 

'以下のような文字列を置換ですべて削除したいのですが onMouseOver="refPopUp(1,event)" onMouseOut="hidePop()" onMouseOver="refPopUp(23,event)" onMouseOut="hidePop()" onMouseOver="refPopUp(345,event)" onMouseOut="hidePop()" 3行すべて削除'(Lines1,Lines2) :-
	'文字列を置換ですべて削除したい'(Lines1,Lines2).

'文字列を置換ですべて削除したい'([],[]) :- !.
'文字列を置換ですべて削除したい'([_文字列|R1],R2) :- !.
	sub_atom(_文字列,_,_,_,'onMouseOver="refPopUp(',S2,',event)" onMouseOut="hidePop()"',L1,L2,L3),
	すべてが数字(L2),
	'文字列を置換ですべて削除したい'(R1,R2).
'文字列を置換ですべて削除したい'([_文字列|R1],[_文字列|R2]) :- !.
	'文字列を置換ですべて削除したい'(R1,R2).

すべてが数値([]) :- !.
すべてが数値([A|R]) :-
	append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']),
	すべてが数値(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  下記の2文にあるfontタグを消したいです。 
%  正規表現を用いた1度の置換で消せますか? 
%   
%  <dd><font style="font-size:;color:;"> テスト <br> テスト </font><br><br></dd> 
%  <dd><font style="font-size:;color:;"> テスト2 <br> テスト2 </font><br><br></dd> 
%   
%   
%  考え方として 
%  <dd><font style="font-size:;color:;">がある行のうち</font>を削除し、そのあと<font style="font-size:;color:;">を削除 
%  これで行けそうかと思ったのですが、●●がある行のうち○○を削除、という正規表現がわかりませんでした・・・ 
% 
% 

'fontタグのみ削除する'(_文字列,_fontタグが削除された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	append([<,f,o,n,t|R1],[>],L2),
	\+(append(_,[>|_],R2)),
	append(L3_0,[<,/,f,o,n,t,>|R3],L3),
	\+(append(_,[<,/,f,o,n,t,>|_],L3_0)),
	append(L1,L3_0,R3,L4),
	atom_chars(_fontタグが削除された文字列,L4).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  すみません、質問させてください。 
%   
%  曲名のリストを一括置換しようとしています。具体的には"〜 by"が 
%  入る丸括弧だけ四角括弧"[ ]"に置き換えたいのです。 
%   
%  例 
%  This is me (talk) (Composed by Johan) 
%  ↓ 
%  This is me (talk) [Composed by Johan] 
%   
%  どのような書式にすればいいかご教示お願いします。 
%   

'曲名のリストを一括置換しようとしています。具体的には"〜 by"が入る丸括弧だけ四角括弧"[ ]"に置き換えたいのです。'(_文字列,_置換された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['('|R1],L3),
	last(R1,')'),
	\+(append(_,['('|_],R1)),
	split(R1,['(',')',' by '],[A,B]),
	concat_atom([S1,'[',A,' by ',B,']',S3],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させて下さい。 
%   
%  ABC 
%  …LMNO……… 
%  ……LMNO…… 
%  ………LMNO… 
%  XYZ 
%   
%  というような文章があったとします。 
%  「LMNO」の前後(「…」)には文字(日本語や英数字)があります。 
%   
%  Perl5互換の正規表現が使えるテキストエディタや、BREGEXP.DLLが使える置換えソフトを使用し、 
%  「ABC」から「XYZ」までにある「LMNO」を「OOOO」に置換えすることは可能でしょうか? 
%  特定の範囲内の文字だけを置換えする正規表現がわからず、検索文字列と置換え文字列の指定で困っています。 
%  どのようにすれば良いのか教えて頂けると助かります。よろしくお願いします。 
% 
% 

'特定の範囲内の文字だけを置換えする正規表現がわからず、検索文字列と置換え文字列の指定'(Lines,_置換されたLines) :-
	append(L0,['ABC'|R1],['XYZ'|R2],Lines),
	findall(Line2,(
		    append(_,[Line|_],R1),
		    'LineのLENOをOOOOに置換する'(Line,Line2)),
		Lines2),
	append(L0,Lines2,R2,_置換されたLines).

'LineのLENOをOOOOに置換する'(Line,Line2) :-
	sub_atom(Line,_,_,_,S1,'LENO',S3,L1,L2,L3),
	concat_atom([S1,'OOOO',S3],_置換されたLine),!.
'LineのLENOをOOOOに置換する'(Line,Line).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Perlの正規表現で質問させて下さい。 
%  yyyy/mm/entry-basename/index.php 
%  ↑はどのように記述すればいいのか、お手数ですがご教授願います<(_ _)> 
% 

'yyyy/mm/entry-basename/index.php を検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	atom_chars('/entry-basename/index.php',Chars1),
	sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[Y1,Y2,Y3,Y4,/,M1,M2|Chars1],L3),
	すべて数字([Y1,Y2,Y3,Y4,M1,M2]),
	append(_,[M1|_],['0','1']),
	\+((last(L1,A),数字(A))).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  perlでテキストデータ内の日付部分を、 
%  2009/1/1 
%  ↓ 
%  2009/01/01 
%  に一行で置換したいのですが。 
%  s|/([0-9][^0-9])|/0$1|gm; 
%  だと、2回同じ処理が必要になってしまいます。 
%  いい方法ありますか? 
% 
% 

'2009/1/1 -> 2009/01/01 に置換したい'(_文字列,_置換された文字列) :-
	'2009/1/1 -> 2009/01/01 に置換したい'(_文字列,'',_置換された文字列).

'2009/1/1 -> 2009/01/01 に置換したい'(_文字列,_前文字列,_置換された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,_後文字列,L1,[Y1,Y2,Y3,Y4,/,M,/,D],L3),
	concat_atom([Y1,Y2,Y3,Y4,/,'0',M,/,'0',D],S22),
	concat_atom([S1,S22],_置換された文字列の一),
	concat_atom([_前文字列,_置換された文字列の一],_前文字列の二),
	'2009/1/1 -> 2009/01/01 に置換したい'(_後文字列,_前文字列の二,_置換された文字列).
'2009/1/1 -> 2009/01/01 に置換したい'(_文字列,_前文字列,_置換された文字列) :-
	concat_atom([_前文字列,_文字列],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  PHP5で、$txtに格納された 
%   
%  <a href="javascript:userid('123456');">テキスト</a> 
%  ※「123456」と「テキスト」は変化します 
%   
%  といった並びの文字列からタグをぬいて 
%   
%  123456,テキスト, 
%   
%  とカンマ区切りにしたいのですが、何か良い方法はないでしょうか 
% 
% 

'<a href="javascript:userid(''123456'');">テキスト</a>といった並びの文字列からタグをぬいて123456,テキストとカンマ区切りにしたい'(_文字列,_置換された文字列) :-
	atom_chars('a href="javascript:userid(''',L0),
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	append(L0,L11,['''',')',';','"',>],L2),
	すべて数字(L11),
	atom_chars(S11,L11),
	append(L03,[<,/,a,>|_],L3),
	concat_atom(L03,S03),
	concat_atom([S11,S03],',',_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  PHPでPerl互換のpreg_replace関数を使った置換を行おうとしているのですが、 
%  やりたいことがうまく実現できません。 
%   
%  やりたいことは、 
%   
%  ・<tagA>という文字列と</tagA>のあいだに<tagInsert>という文字列を挿入したい 
%  ・ただし、<tagA>の中に<tagB>という文字列がある場合は、その<tagB>の下に挿入したい 
%   
%   
%  <失敗した正規表現> 
%  $new_str = preg_replace("/<tagA(.*?)>(.*?)(<(?!tagB).)*/", '<tagA\\1>\\2<tagInsert>\\3', $str); 
%   
%  <実現したい例> 
%  <tagA> 
%    <tagB> 
%    <tagB> 
%    <tagC> 
%  </tagA> 
%   
%  ↓置換実行 
%  <tagA> 
%    <tagB> 
%    <tagB> 
%    <tagInsert> 
%    <tagC> 
%  </tagA> 
% 
% 

'という文字列とのあいだにという文字列を挿入したい。ただし、の中にという文字列がある場合は、そのの下に挿入する'(Lines1,Lines2) :-
	append(L1,[''|R2],[''|R3],Lines1),
	\+(append(_,[''|_],R3)),
	append(_,[''|_],R3),
	append(L1,[''|R2],['',''|R3],Line2),!.
'という文字列とのあいだにという文字列を挿入したい。ただし、の中にという文字列がある場合は、そのの下に挿入する'(Lines1,Lines2) :-
	append(L1,[''|R2],[''|R3],Lines1),
	append(L1,['',''|R2],[''|R3],Line2),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  perl で, 
%  「<と>で囲まれた文字列内の abc を def に全て置換する」 
%  というのは正規表現でどう書けばよいでしょうか。 
%   
%  マッチだけならば 
%  "<asaabcasalaabca>" =~ /\<(.*?)(abc(.*?))*?\>/ 
%  のようにしてマッチさせられるのですが,繰り返しがあるので後方参照で取得できません。 
% 
% 

'<と>で囲まれた文字列内の abc を def に全て置換する'('','') :- !.
'<と>で囲まれた文字列内の abc を def に全て置換する'(_文字列,_置換された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<'|R2],L3),
	append(L00,['>'],R2),
	abcをdefに置換する(L00,L22),
	append(L1,['<',L22],['>'],L4),
	concat_atom(L4,S22),
	'<と>で囲まれた文字列内の abc を def に全て置換する'(S3,S4),
	concat_atom([S22,S4],_置換された文字列).

abcをdefに置換(L1,L2) :-
	append(L0,[a,b,c|R1],L1),
	append(L0,[d,e,f|R1],L2),!.
abcをdefに置換(L,L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  まだ正規表現が素人なので教えてください。 
%  たとえば以下のように四行の文章があって 
%  それら文章の最初(一番目)の空白文字だけを検索するには 
%  どうすればいいのですか? 
%   
%  The environment of contents industries is so drastically changing, 
%  though Japan has not fully. 
%  taken advantage of the changes to develop. 
%  its presence in the global market. 
%   
%  The とenvironmentの間の空白文字 、though と Japanの間 
%  taken とadvantage の間の空白文などなどです 
% 
% 

'それら文章の最初(一番目)の空白文字だけを検索するには'(Lines,_前文字列,_適合文字,_後文字列) :-
	append(_,[Line|R],Lines),
	最初の空白文字(Line,_前文字列,_適合文字,_後文字列),
	R = [].

最初の空白文字(_文字列,_前文字列,_適合文字,_後文字列) :-
	sub_atom(_文字列,_,1,_,_前文字列,' ',_後文字列,L1,L2,L3),!.
最初の空白文字(_文字列,_文字列,'','').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  すいません。行頭のスペースが消えておかしくなりましたので書き込み直します。 
%   
%  ●正規表現の使用環境 
%  Java1.6 
%   
%  ●検索か置換か? 
%  検索(Stringクラス String[] split(String regex)メソッドによる文字列分割) 
%   
%  ●説明 
%  CSVファイル中の一行を対象文字列とし、 
%  その文字列中初出の\s*,\s*をデータ区切り子として見なしマッチさせる。 
%  (その前後で文字列を2つに分割) 
%   
%  ●対象データ 
%  aaa,bbb,ccc 
%  aaa, bbb, ccc 
%  aaa , bbb , ccc 
%   
%  ●希望する結果 
%  "aaa"と"bbb,ccc"に分割 
%  "aaa"と"bbb, ccc"に分割 
%  "aaa"と"bbb , ccc"に分割 
%   
%  ●希望しない結果 
%  "aaa"と"bbb"と"ccc"に分割 
%  etc... 
%   
%  自分で考えた(?<^[^,]*)\s*,\s*では 
%  java.util.regex.PatternSyntaxException: Unknown look-behind group near index 8 
%  というような例外が出てしまいました。 
%   
%  よろしくお願いします。 
% 
% 

'CSVファイル中の一行を対象文字列とし、その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(_csvファイル,_行,_前文字列,_後文字列) :-
        get_lines(_csvファイル,Lines),
	append(L0,[Line|R],Lines),
	_行 is L0 + 1,
	'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列),
	fail.

'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列) :-
	sub_atom(Line,_,_,_,_前文字列,_区切り文字列,_後文字列,L1,L2,L3),
	append(L0,[','|R],L2),
	all(L0,' '),
	\+((append(L01,[A|_],R),\+(A=' '))),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  文字列の中にある¥を除去したかったのですが、preg_replace('/¥/')や 
%  preg_replace('/¥¥/')では削除できなかったのですが、preg_replace('/¥¥¥/')だと削除できました・・・ 
%  これはなぜでしょうか。 
%  ¥は次に有る文字をエスケープするわけですから、preg_replace('/¥¥/')でいけそうな気がするのですが。。。 
%  正規表現初心者につき、低レベルですがご教授よろしくお願いいたします。 
%  (上記は、あえて半角ではなく、全角の¥で説明しています。) 
%   

文字列の中にある¥を除去する(_文字列,_¥を除去した文字列) :-
	findall(A,(
		    sub_atom(_文字列,_,1,_,A),
		    \+(A='\\')),
		L),
	concat_atom(L,_¥を除去した文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  MySQLダンプ内の 
%   
%  /*------------------ここから--------------------*/ 
%  DROP TABLE IF EXISTS `table100`; 
%  /*!40101 SET @saved_cs_client     = @@character_set_client */; 
%  /*!40101 SET character_set_client = utf8 */; 
%  CREATE TABLE `table100` ( 
%    `code1` varchar(5) default NULL, 
%    `zip1` varchar(7) default NULL, 
%    `address1` varchar(250) default NULL, 
%    `address2` varchar(250) default NULL, 
%    `div_1` varchar(1) default NULL, 
%    `div_2` varchar(1) default NULL, 
%    `import_date` timestamp NULL default NULL, 
%    `rec_key1` int(10) unsigned NOT NULL auto_increment, 
%    PRIMARY KEY  (`rec_key1`) 
%  ) ENGINE=InnoDB AUTO_INCREMENT=121471 DEFAULT CHARSET=eucjpms; 
%  /*!40101 SET character_set_client = @saved_cs_client */; 
%  /*------------------ここまで--------------------*/ 
%   
%  `table100` → `TABLE100` 
%  `code1` → `CODE1` 
%  など逆クォートで囲まれた小文字→大文字変換を一括で行いたいです。。 
%  できればlinux コマンドライン、perl などでお願いします。。 
%   

'逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_文字列,_変換した文字列) :-
	sub_atom(_文字列,St,Len,_,S1,S2,S3,L1,['`'|R2],['`'|R3]),
	\+(append(_,['`'|_],R2)),
	concat_atom(R2,S22),
	to_upper(S22,_大文字化した文字列),
	concat_atom(S1,'`',_大文字化した文字列,'`'],_変換した文字列1),
	concat_atom(R3,_残り文字列),
	'逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_残り文字列,_変換した文字列2),
	atom_concat(_変換した文字列1,_変換した文字列2,_変換した文字列),!.
'逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_文字列,_文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させてください! 
%   
%  ああああああ @ ABCD @ abcd 
%   
%  という文字を 
%   
%  <b>ああああああ</b> @ ABCD @ <em>abcd</em> 
%   
%  のように置換したい時はどういう正規表現を使えばいいのでしょうか? 
%   
%  よろしくお願いいたします 
% 
% 

'ああああああ @ ABCD @ abcd という文字を <b>ああああああ</b> @ ABCD @ <em>abcd</em> のように置換したい'(_文字列,_置換された文字列) :-
	sPLIT(_文字列,' @ ',[A,B,C]),
	concat_atom(['',A,'',' @ ',B,' @ ','',C,''],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させてください。 
%   
%  <table> 
%  <tr> 
%    <th>名称1</th> 
%    <td> 
%      値1 
%    </td> 
%  </tr> 
%  <tr> 
%    <th>名称2</th> 
%    <td> 
%      値2 
%    </td> 
%  </tr> 
%  </table> 
%  のようなHTMLがあります。 
%  実際には全ての改行とインデントはトリムされてます。 
%  この値1の部分をとるにはどのような正規表現を使えば良いでしょうか? 
%   
%  <th>名称1</th><td>([^<]*)</td> 
%  のように考えてましたが値1には<img>タグが入る場合があります。 
%  <table>や<td>が入ることはありません。 
%   

'最初のtdタグの値を検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,_後文字列,L1,['<',t,d,'>'|R2],['<',/,t,d,'>'|R3]),
	\+(append(_,['<',t,d,'>'],_,R2)),
	concat_atom([S1,''],_前文字列),
	concat_atom(R2,_適合文字列),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  C# 
%   
%  ●検索か置換か? 
%  検索 
%   
%  ●説明 
%  =の連続がある行で挟まれた部分を抽出したい 
%   
%  ●対象データ 
%  ゲスト======================== 
%  ほげほげ 
%  ほげほげほげ 
%  プロフィール=================== 
%  はげ 
%  はげはげ 
%  ============================= 
%   
%  ●希望する結果 
%  "ほげほげ\nほげほげほげ" 
%  "はげ\nはげはげ" 
%   
%  結果に=の行が含まれていても構いません 
%  =は2つ以上連続している行が対象です 
%   
%  ^.*={2,}$(?'block'.+?)^.*={2,}$ とやってみましたがマッチしませんでした 
%  MultiLineオプションは指定しています 
%  それと対象文字列から\rは事前に除去しています 
%   
%  よろしくお願いします 
% 
% 

'=の連続がある行を区切りとして検索する'([],[]) :- !.
'=の連続がある行を区切りとして検索する'([Line|R1],[S|R2]) :-
	sub_atom(Line,_,2,_,'=='),
	'=の連続がある行が来るまで検索する'(R1,L1,R11),
	concat_atom(L1,'\n',S),
	'=の連続がある行を区切りとして検索する'(R11,R2).
'=の連続がある行を区切りとして検索する'([_|R1],R2) :-
	'=の連続がある行を区切りとして検索する'(R1,R2).

'=の連続がある行が来るまで検索する'([Line|R1],[],[Line|R1]) :-
	sub_atom(Line,_,2,_,'=='),!.
'=の連続がある行が来るまで検索する'([Line|R1],[Line|R2],R3) :-
	'=の連続がある行が来るまで検索する'(R1,R2,R3).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  『プリンターがあります。これはプリンタです。プリンタを使います。プリンターの変更です。』 
%  という文がある時、文中のプリンタをプリンターになおすにはどのような正規表現を 
%  用いればよいでしょうか? 
% 

'『プリンターがあります。これはプリンタです。プリンタを使います。プリンターの変更です。』という文がある時、文中のプリンタをプリンターになおす' :-
	atom_chars('プリンターがあります。これはプリンタです。プリンタを使います。プリンターの変更です。',Chars1),
	'プリンタをプリンターに変換'(Chars1,Chars2),
	atom_chars(_変換した文字列,Chars2).

'プリンタをプリンターに変換'([],[]) :- !.
'プリンタをプリンターに変換'([プ,リ,ン,タ,ー|R1],[プ,リ,ン,タ,ー|R2]) :-
	'プリンタをプリンターに変換'(R1,R2),!.
'プリンタをプリンターに変換'([プ,リ,ン,タ|R1],[プ,リ,ン,タ,ー|R2]) :-
	'プリンタをプリンターに変換'(R1,R2),!.
'プリンタをプリンターに変換'([A|R1],[A|R2]) :-
	'プリンタをプリンターに変換'(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  現在、HTMLのimgタグを使って「/img/jpg/」ディレクトリにある画像ファイルを複数表示しています。 
%   
%  例) 
%  <img src="/img/jpg/1111.jpg" > 
%  <img src="/img/jpg/mm2222.jpg" > 
%  <img src="/img/jpg/kkkkk3333.jpg" > 
%   
%  これをそれぞれ、以下のように置換したいと考えています。 
%  例) 
%  <a href="http://ime.nu/www.xxxxx.jp/1111.jpg"><img src="/img/jpg/1111.jpg" width="240px"></a> 
%  <a href="http://ime.nu/www.xxxxx.jp/mm2222.jpg"><img src="/img/jpg/mm2222.jpg" width="240px"></a> 
%  <a href="http://ime.nu/www.xxxxx.jp/kkkkk3333.jpg"><img src="/img/jpg/kkkkk3333.jpg" width="240px"></a> 
%   
%  imgタグをリンクタグで囲むのですが、リンク先URLには元々の画像ファイル名が使われています。また、imgタグには「width="240px"」が付加されています。 
%   
%  このような置換をPHP5で行うには、どのような正規表現を使用したらよろしいでしょうか。 
%  宜しくお願い致します。 
% 
% 

'imgタグをaタグ+imgタグに書き換える'(Lines,_置換されたLines) :-
	findall(_置換された文字列,(
		    append(_,[_文字列|_],Lines),
		    文字列の置換(_文字列,_置換された文字列)),
		_置換されたLines).

文字列の置換(_文字列,_置換された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	L2 = [<,i,m,g,' ',s,r,c,=,'"',/,i,m,g,/,j,p,g,/|R2],
	L3 = [>|R3],
	\+(append(_,[>|_],R2)),
	concat_atom(R2,S22),
	concat_atom([S1,' '|R3],_置換された文字列),!.
文字列の置換(_文字列,_文字列).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Perl 5.8 /5.10で使用します。 
%   
%  HTMLソースの中のimgタグのファイル名を正規表現などで一括で変えたいです。 
%   
%  <img src="http://ime.nu/www.hoge.com/aaa/bb/ccc/ddd.jpg" alt="sss"> 
%  <img src="/xxx/yyy.png"> 
%  <img src="../aaa/fff/xxx/ccc.gif" width="32" height="16"> 
%   
%             ↓ 
%   
%  <img src="/images/ddd.jpg" alt="sss"> 
%  <img src="/images/yyy.png"> 
%  <img src="/images/ccc.gif" width="32" height="16"> 
%   
%  こんな感じです。どの様にしたらよいでしょうか。 
% 

'imgタグの書き換え'(Lines,_置換されたLines) :-
	findall(_置換された文字列,(
		    append(_,[_文字列|_],Lines),
		    文字列の置換(_文字列,_置換された文字列)),
		_置換されたLines).


文字列の置換(_文字列,_置換された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	L2 = [<,i,m,g,' ',s,r,c,=,'"'|R2],
	L3 = [>|R3],
	\+(append(_,[>|_],R2)),
	concat_atom(R2,S22),
	split(S22,['/'],L),
	last(L,F),
	concat_atom([S1,''),
	sub_atom(LIne,0,S,_,Line2),!.
'行末のbr / タグを削除する'(Line,Line).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   
%  仕上げたコードの可読性をあげるために 
%  演算子の前後にスペースを入れたいです 
%  例 x+y=z 
%    x + y = z 
%   

式文字列の演算子の前後に空白を入れる(_式文字列,_空白を挿入して可読性を上げた式文字列) :-
	空白を一旦取り除く(_式文字列,_空白を取り除いた式文字列),
	sPLIT(_空白を取り除いた式文字列,['=','+','-','*','/','mod','(',')'],L),
	concat_atom(L,' ',_空白を挿入して可読性を上げた式文字列).

空白を一旦取り除く(_式文字列,_空白を取り除いた式文字列) :-
	split(_式文字列,[' '],L),
	concat_atom(L,_空白を取り除いた文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問です。PHP5.3でpreg_matchを使っているのですが、例えば 
%  「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」 
%  という文章より法律名称や条などをwhileループで拾い上げたいのですが、 
%   

'「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」という文章より法律名称や条などをwhileループで拾い上げたい'(_文,_法律名称や条のならび) :-
	法律名称を拾う(_文,0,_開始位置付き法律名称ならび),
	条を拾う(_文,_開始位置付き条ならび),
	法律名称と条を出現順にならびとする(_開始位置付き条ならび,_法律名称や条ならび).


法律名称を拾う(_文,_開始位置,[[_開始位置1,S2]|R]) :-
	sub_atom(_文,_相対開始位置,_長さ,_,S1,S2,S3,L1,L2,L3),
	sub_atom(S2,_,1,0,法),
	法律名称(S2),
	_開始位置1 is _開始位置 + _相対開始位置,
	_開始位置2 is _開始位置 + _相対開始位置 + _長さ,
	法律名称を拾う(S3,_開始位置2,R),!.

条を拾う(_文,[[_開始位置1,S2]|R]) :-
	sub_atom(_文,_相対開始位置,_長さ,_,S1,S2,S3,L1,L2,L3),
	sub_atom(S2,0,1,_,第),
	sub_atom(S2,_,1,0,条),
	_開始位置1 is _開始位置 + _相対開始位置,
	_開始位置2 is _開始位置 + _相対開始位置 + _長さ,
	条を拾う(S3,_開始位置2,R).

法律名称と条を出現順にならびとする(_開始位置付き法律名称ならび,_開始位置付き条ならび,_法律名称や条ならび) :-
	append(_開始位置付き法律名称ならび,_開始位置付き条ならび,L1),
	sort(L1,L2),
	findall(_法律名称または条,(
		    append(_,[[_,_法律名称や条]|_],L2)),
		_法律名称や条ならび).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Abc_def, Ghi_jkl ,Mno_pqr 
%  という文章を、 
%  AbcDef, GhiJkl ,MnoPqr 
%  に変えたいのですが、どのような正規表現を書けばいいでしょうか? 
% 
% 

'Abc_def, Ghi_jkl ,Mno_pqr という文章を、AbcDef, GhiJkl ,MnoPqr に変える'(_文字列,_変換された文字列) :-
	atom_chars(_文字列,Chars),
	変換(Chars,Chars2),
	atom_chars(_変換された文字列,Chars2).

変換([],[]) :- !.        
変換(['_',A|R1],[B|R2]) :-
	to_upper(A,B),
	変換(R1,R2),!.
変換([A|R1],[A|R2]) :-
	変換(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  正規表現の使用環境は秀丸です。 
%  やりたいことは置換で、VBのソースを編集したいのが目的です。 
%   
%  例: 
%  ・Before 
%  Dim s1, s2, s3 As String 
%   
%  ・After 
%  Dim s1 As String, s2 As String, s3 As String 
%   
%  上記のように、1行で複数の変数宣言を行っている箇所で 
%  型の宣言を省略している箇所を、最後の型宣言で補いたいのですが 
%  どのように指定してやればよいでしょうか? 
% 
% 

'型の宣言を省略している箇所を、最後の型宣言で補う'(_文字列,_補正された文字列) :-
	's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分),
	findall(W,(
		    append(_,[_変数|_],_変数部分ならび),
		    concat_atom([_変数,_型部分],W)),
		L2),
	concat_atom(L2,',',S5),
	concat_atom(_型宣言部分,S5,_補正された文字列).

's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分) :-
	split(_文字列,[','],[_第一要素|R1]),
	sPLIT(_第一要素,[' '],L1),
	append(L0,[A],L1),
	concat_atom(L0,_型宣言部分),
	append(L2,[U],R1),
	sPLIT(U,[' '],L3),
	'最後の変数と型部分に分離する'(L3,Z,_型部分),
	append([A],L2,[Z],_変数部分ならび),!.

'最後の変数と型部分に分離する'(L,S,_型部分) :-
	append(L0,[_最後の変数|R],L),
	\+(A = ' '),
	all(L0,' '),
	concat_atom(R,_型部分),!.
'最後の変数と型部分に分離する'([_最後の変数|R],_最後の変数,_型部分) :-
	concat_atom(R,_型部分),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問です 
%  <html><body>abcdefg</body></html>のように間に挟まれたabcdefgだけを取り出すには 
%  やはり 
%  <html><body>(?<label>(\\w+))</body></html> 
%  のようにグループ化を行って後から 
%  Groups["label"].Valueで取り出すのがスマートな方法ですか? 
%   
%  C#です 
%   
%  実際はもっと長い文字列から抽出します 
%  何かもっといいアイディアがありましたらご教授願います 
% 
% 

'ある文字パターンに挟まれた副文字列'(_文字列,_直前にある副文字列,_直後にある文字列,_前文字列,_検索語,_後文字列) :-
	atom_chars(_直前にある副文字列,Chars1),
	atom_chars(_直後にある副文字列,Chars2),
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	append(Chars1,L11,Chars2,L1),
	concat_atom(L11,_検索語),
	concat_atom([S1,_直前にある副文字列],_前文字列),
	concat_atom([_直後にある副文字列,S3],_後文字列).



指定した文字がN回以上連続している文字列に一致させる(_文字列,_指定した文字,_N回,_前文字列,_一致文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,_前文字列,_一致文字列,_後文字列,_,L2,_),
	all(L2,_指定した文字),
	length(L2,_長さ),
	_長さ >= _N回.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  C 
%   
%  ●説明 
%  Apacheのログから一部分を抜き出して検索したい 
%   
%  ●対象データ 
%  host.ne.jp - - [11/May/2011:12:22:15 +0900] "GET /~akasata/index.xml?gat=tPFnlVCP8aUYq8jjPqA=&BSdebug=AV/w3.3r1.1/ HTTP/1.1"  
%  200 6703 "https://server.ne.jp/" "Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14" 
%  (以上1行) 
%  ●希望する結果 
%  1件目 
%  host.ne.jp 
%  2件目 
%  /~akasata/index.xml 
%   
%  以上のような検索を実装しようとして、 
%   regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+)*([^\"]+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); 
%  以下のような正規表現を用いた(Cのエスケープが混じっているため見辛ければすいません)のですが、 
%  後ほど検索対象を調べて一部不要な部分があったため 
%   regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); 
%  以下のように正規表現を変更したところ、同じ結果を返すのにもかかわらず 
%  実行速度が4倍以上もかかるようになってしまいました。原因かわかる方教えていただけないでしょうか? 
% 
% 

'Apacheのログから一部分を抜き出して検索したい'(ApacheLog,X) :-
	get_split_lines(ApacheLog,[' ','"','?'],LL),
	append(_,[L|R],LL),
	選択(L,X).

選択(L,X) :-
	append(_,['GET',X|_],L).
選択(L,X) :-
	append(_,[X|_],L),
	sub_atom(X,0,4,_,http).

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
%  次の正規表現でhogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換しております。 
%   
%  RewriteRule ^/hoge(.*)/(.*).html$ http://ime.nu/example.com/hoge/$1/i/$2.html [L] 
%   
%   
%   
%  下記のような場合は問題ないのですが 
%   
%  http://ime.nu/example.com/hoge → http://ime.nu/example.com/hoge/i/ 
%  http://ime.nu/example.com/hoge/saitama/2011/01/index.html → http://ime.nu/example.com/hoge/saitama/2011/01/i/index.html 
%   
%   
%   
%  ↓のようにhogeで始まるディレクトリまでも変換されてしまいます。 
%  http://ime.nu/example.com/hogehoge/kankeinai.html 
%   
%  hogeフォルダ配下のみ変換されるようにするには、どうしたらいいでしょうか? 
%   
%  環境は 
%  CentOS5 
%  Apache2 
%   
% 
% 

'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :-
	sud_atom(_文字列,_,_,_,S1,'/hoge',S3,L1,L2,L3),
	L3=[],
	concat_atom([S1,S2,'/i/'],_変換された文字列),!.
'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :-
	sud_atom(_文字列,_,_,_,S1,'/hoge',S3,L1,L2,[' '|R3]),
	concat_atom([S1,S2,'/i/',S3],_変換された文字列),!.
'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :-
	sud_atom(_文字列,_,_,_,S1,'/hoge/',S3,L1,L2,[' '|R3]),
	concat_atom([S1,S2,'i/',S3],_変換された文字列),!.
'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :-
	sud_atom(_文字列,_,_,_,S1,'/hoge/',S3,L1,L2,L3),
	'最後の「/」の後に「i/」が挟まるように'(S3,S4),
	concat_atom([S1,S2,S4],_変換された文字列).
	
'最後の「/」の後に「i/」が挟まるように'(S1,S2) :-
	atom_chars(S1,L),
	append(L0,['/'|R],L),
	\+(append(_,[' '|_],L0)),
	\+(append(_,['/'|_],R)),
	append(L0,['/i/'|R],L2),
	atom_chars(S2,L2),!.
'最後の「/」の後に「i/」が挟まるように'(S1,S2) :-
	concat_atom(['i/',S1],S2),).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問です 
%  C++をC#にするにはどうすればよいですか 
% 
% 

'C++をC#にするには'(_文字列,_置換された文字列) :-
	全置換(_文字列,'c++','c#',_置換された文字列).

全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	findall(S,(
		    ひとつひとつ置換(_文字列,'c++','c#',S)),
		L),
	last(L,_置換された文字列),!.
全置換(_文字列,_,_,_文字列).

ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列],_置換された文字列1),
	ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2),
	concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  文字列に対して、置換対象部分すべてを置換します。
%  置換対象となる文字列が見つからなかった時でも、僞にはなりません。
%  
%  ひとつひとつ置換は置換対象文字列を最初からひとつひとつ順に置換して行きます。
%  

全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	findall(S,(
		    ひとつひとつ置換(_文字列,'c++','c#',S)),
		L),
	last(L,_置換された文字列),!.
全置換(_文字列,_,_,_文字列).

ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列],_置換された文字列1),
	ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2),
	concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  ひとつひとつ置換は置換対象文字列をひとつひとつ順に置換していく、
%  非決定性の述語です。
%  一度置換された部分は次の置換候補が置換された時にも置換されたままであり、
%  元に戻ることはありません。
%  置換される対象がなくなって、さらのバックトラックにより、起動されると僞となります。
%  
%  ひとつひとつ置換/6 は置換される度に、前文字列、後文字列を切り出す。
%  置換文字列の引数位置に注意が必要。
%  

ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列],_置換された文字列1),
	ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2),
	concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列).


ひとつひとつ置換(_文字列,_置換対象文字列,__前文字列,_置換文字列,_後文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,_前文字列),
	\+(sub_atom(_前文字列,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,_後文字列),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,__前文字列,_置換文字列,_後文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,_前文字列1),
	\+(sub_atom(_前文字列1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,_残り文字列),
	ひとつひとつ置換(_残り文字列,_置換対象文字列,_前文字列2,_置換文字列,_後文字列,_置換された文字列2),
	concat_atom([_前文字列1,_置換文字列,_前文字列2],_前文字列),
	concat_atom([_前文字列,_置換文字列,_後文字列],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  文字列の置換述語。最初に見つかった置換可能部分を置換する決定性述語。
% 
%  どこが置換された部分であるか、分かりにくいのが欠点です。
%  
%  最初のひとつだけ置換/6 は置換された部分の前文字列と後文字列を明示した。


最初のひとつだけ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列),!.


最初のひとつだけ置換(_文字列,_置換対象文字列,_前文字列,_置換文字列,_後文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,_前文字列),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,_後文字列),
	concat_atom([_前文字列,_置換文字列,_後文字列],_置換された文字列),!.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  常に置換可能な部分のうち一箇所だけが置換される述語定義です。
%  
%  対象文字列がccで文字列中にcが3個以上連なっている場合などは
%  最初のccの切り出しの後、そのccを除外して置換対象を探すか、
%  あるいは最初のcの次のc以後を置換対象とするかの選択が有り得ます。
%  
%  以下は前者、一旦置換対象になった文字列を外して、そのあとからの
%  文字列から次の置換対象文字列を探す場合の述語定義です。
% 
%  この定義はどこが置換された場所であるか、分かりにくいのが欠点です。
%  

'ひとつだけ置換(対象文字列の重なりを許さない)'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
'ひとつだけ置換(対象文字列の重なりを許さない)'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	'ひとつだけ置換(対象文字列の重なりを許さない)'(S3,_置換対象文字列,_置換文字列,_置換された文字列2),
	concat_atom([_置換された文字列1,_置換対象文字列,_置換された文字列2],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  常に置換可能な部分のうち一箇所だけが置換される述語定義です。
%  
%  
%  対象文字列がccで文字列中にcが3個以上連なっている場合などは
%  最初のccの切り出しの後、そのccを除外して置換対象を探すか、
%  あるいは最初のcの次のc以後を置換対象とするかの選択が有り得ます。
%  
%  以下は後者、一旦対象になった文字列に重なって次の対象文字列を
%  探す場合の述語定義です。
% 
%  この定義はどこが置換されたか分かりにくいのが欠点です。
%  

'ひとつだけ置換(対象文字列の重なりを許す)'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させてください。 
%  「<img」以外の「<」を「&lt;」に置き換えるにはどう書けば良いでしょうか? 
%  #「img(中略)>」以外の「>」も「&gt;」に置き換える必要ありがますが、そちらはまた別途考えるとして。。 
%  言語はPHPです。よろしくお願いします。 
% 

'「|R3]),
	'「|R3],_置換した部分までの文字列,_残り文字列),
	concat_atom([_置換した部分までの文字列,_残り文字列],_置き換えた文字列).
'「|R3]),
	'「|R3],_置換した部分までの文字列,_残り文字列) :-
	\+(append(_,[<|_],R2)),
	\+(append(_,[>|_],R2)),
	append(L1,['<'|R2],['>'],L4),
	concat_atom(L4,_置換した部分までの文字列),
	concat_atom(R3,_残り文字列),!.


このディレクトリの索引

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% ユーティリティ述語 sub_atom/10 の提案%
% A .. 文字列 (atom)
% S .. 検索文字列開始変位 (integer)
% L .. 検索文字列の長さ (integer)
% R .. 残り長さ (integer)
% H .. 検索文字列より前側の文字列 (atom)
% X .. 検索文字列 (atom)
% T .. 検索文字列より後の残り文字列 (atom)
% HL .. 検索文字列より前側の文字ならび (chars)
% XL .. 検索文字列文字ならび (chars)
% TL .. 検索文字列より後の残り文字ならび (chars)
% A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 
%

sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :-
    atom(A),
    !,
    sub_atom(A,S,L,R,X),
    sub_atom(A,0,S,_,H),
    N is S + L,
    sub_atom(A,N,R,_,T),
    atom_chars(H,HL),
    atom_chars(X,XL),
    atom_chars(T,TL).

sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :-
    var(A),
    !,
    atom_chars(H,HL),
    atom_chars(X,XL),
    atom_chars(T,TL),
    length(HL,S),
    length(XL,L),
    length(TL,R),
    concat_atom([H,X,T],A),
    sub_atom(A,S,L,R,H,X,T,HL,XL,TL).

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

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

split_1([],SeparatersL,[]).
split_1(L1,SeparatersL,[A|R]) :-
    not(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    not(L2=[]),
    atom_chars(A,L2),
    split_1(R2,SeparatersL,R).
split_1(L1,SeparatersL,X) :-
    not(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    L2=[],
    split_1(R2,SeparatersL,X).

split_2([],_,[],[]).
split_2(L1,SeparatersL,[],R) :-
    member(L2,SeparatersL),
    append(L2,R,L1).
split_2([A|R1],SeparatersL,[A|R2],R) :-
    not((member(L2,SeparatersL),append(L2,_,[A|R1]))),
    split_2(R1,SeparatersL,R2,R).

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

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


% *** user: split / 3 ***
% ?- split('a\n\nbc\n',['\n'],X).
%
% X = [a,bc]
%

split(_文字列,_区切り符号ならび,X) :-
    sPlit(_文字列,_区切り符号ならび,Y),
    findall(U,(member(U,Y) , not U = ''),L),
    L = X,
    ! .

% *** user: sPlit / 3 ***
% ?- sPlit('a\n\nbc\n',['\n'],X).
%
% X = [a,'',bc].
%

sPlit(_文字列,_区切り符号ならび,X) :-
    atom_chars(_文字列,L),
    split_00(L,_区切り符号ならび,Y),
    findall(U,(member(U,Y) , not member(U,_区切り符号ならび)),Z),
    Z = X,
    ! .

% *** user: sPLIT / 3 ***
% ?- sPLIT('a\n\nbc\n',['\n'],X).
%
% X = [a,'\n','\n',bc,'\n']
%

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

% *** user: 'SPLIT' / 3 ***
% ?- 'SPLIT'('a\n\nbc\n',['\n'],X).
%
% X = [a,'\n','','\n',bc,'\n'].
%

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

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

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

% *** user: split_1 / 3 ***
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),
    ! .

% *** user: split_2 / 5 ***
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),
    ! .

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

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

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

% *** user: split_5 / 2 ***
split_5([],'') :-
    ! .
split_5(B,C) :-
    numeric_list(B,Nl),
    number(C,Nl),
    ! .
split_5(B,C) :-
    concat_atom(B,C),
    ! .

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

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

% *** user: split_42 / 4 ***
split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :-
    split_42(R,R2,_区切り符号,_区切り符号ならび,X),
    ! .

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

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

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

concat_atom([A],A) :- !.
concat_atom([A|R],X) :-
    concat_atom(R,Y),
    atom_concat(A,Y,X).

concat_atom([A],Spliter,A) :- !.
concat_atom([A|R],Spliter,X) :-
    concat_atom(R,Spliter,Y),
    atom_concat(A,Spliter,Z),
    atom_concat(Z,Y,X).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  表(或いは行列)形式で与えられたデータをcsvファイル形式で書き出す

put_csv_lines(_csvファイル,_区切り符号,LL) :-
	open(_csvファイル,write,Outstream),
	append(_,[L|R],LL),
	concat_atom(L,_区切り符号,S),
	write_formatted(Outstream,'%t\n',[S]),
	R = [],
	close(Outstream),!.

% concat_atom/3は、concat_atom/2がリストの要素として現れるアトムを結合して一つのアトムを
% 作り上げるのだが、concat_atom/3になると、アトムとアトムの間に区切り符号を挿入しつつ、
% 結合する。区切り符号は一文字で使う場合が多いが、文字列でもよい。


get_bytes(_ファイル,Bytes) :-
	open(_ファイル,read,Instream,[type(binary)]),
	findall(Byte,(
		    repeat,(
			at_end_of_stream(Instream),
			!,
			fail;
			get_byte(Instream,Byte))),
		Bytes),
	close(Instream),!.


put_bytes(_ファイル,Bytes) :-
	open(_ファイル,write,Outstream,[type(binary)]),
	append(_,[Byte|R],Bytes),
	put_byte(Outstream,Byte),
	R = [],
	close(Outstream),!.



get_integer(N) :-
	get_line(Line),
	get_integer_1(Line,N),!.

get_integer(Input,N) :-
	get_line(Input,Line),
	get_integer_1(Input,Line,N),!.

get_integer_1(end_of_file,_) :- !,fail.
get_integer_1(Line,N) :-
	atom_to_term(Line,N,_),
	integer(N),!.
get_integer_1(_,N) :-
	get_line(Line),
	get_integer_1(Line,N).

get_integer_1(_,end_of_file,_) :- !,fail.
get_integer_1(Input,Line,N) :-
	atom_to_term(Line,N,_),
	integer(N),!.
get_integer_1(Input,_,N) :-
	get_line(Input,Line),
	get_integer_1(Input,Line,N).

% list_nth/4 append/3(member/2)の変形

list_nth(N,L0,[A|R],L) :-
	integer(N),
	N > 0,
	M is N - 1,
	length(L0,M),
	append(L0,[A|R],L).
list_nth(N,L0,[A|R],L) :-
	integer(N),
	N < 0,
	N1 is N + 1,
	N2 is abs(N1),
	length(R,N2),
	append(L0,[A|R],L).
list_nth(N,L0,[A|R],L) :-
	var(N),
	append(L0,[A|R],L),
	length(L0,N1),
	N is N + 1.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% ならびのcut 文字列はsub_atom/5でcutし易いがならびは案外面倒

cut(L,[],[]) :- !.
cut(L,[L2|R],[Y|R1])
  :-
    list(L2),
    cut(L,L2,Y),
    cut(L,R,R1),!.
cut(L,[S-(%24)|R],[Y|R1])
  :-
    length(L,Len),
    cut(L,[S-Len|R],[Y|R1]),!.
cut(L,[(^)-E|R],[Y|R1])
  :-
    cut(L,[1-E|R],[Y|R1]),!.
cut(L,[S-E|R],Y)
  :-
    list(L),
    findall(N,for(S,N,E),L2),
    append(L2,R,L3),
    cut(L,L3,Y),!.
cut(L,[S|R],[Y|R1])
  :-
    list(L),
    list_nth(S,L,Y),
    cut(L,R,R1),!.
cut(_対象文字列,_位置情報ならび,_副文字列)
  :-
    atomic(_対象文字列),
    cut(_対象文字列,_位置情報ならび,'',_副文字列),!.
cut(_対象文字列,_位置情報ならび,_区切り文字,_副文字列)
  :-
    atomic(_対象文字列),
    decompcons(_対象文字列,L),
    cut_2(L,_位置情報ならび,_部分ならび),
    concat(_部分ならび,_区切り文字,_副文字列).
cut_2(_,[],[]) :- !.
cut_2(L,[S-E|R],[B|R1])
  :-
    cut(L,[S-E],U),
    concat_atom(U,B),
    cut_2(L,R,R1),!.
cut_2(L,[P|R],[B|R1])
  :-
    cut(L,[P],U),
    concat_atom(U,B),
    cut_2(L,R,R1),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 読み飛ばしはappend/3で実現できる。ただ要素に出会えなかった時にfailすることに注意が必要だ。
% 述語の第一引数、第二引数が逆に定義されていることもあるからこれも注意。

読み飛ばし(_ならび,_要素,_残りのならび) :-
    append(_,[_要素|_残りのならび],_ならび).

読み飛ばし(_ならび,_要素,_読み飛ばしたならび,_残りのならび) :-
    append(_読み飛ばしたならび,[_要素|_残りのならび],_ならび).


% *** user: 要素番号によるならびの置換 / 5 ***
要素番号によるならびの置換(E,E,U,[A|R],[U|R]) :- !.
要素番号によるならびの置換(S,E,U,[A|R],[A|R1]) :-
    S1 is S + 1,
    要素番号によるならびの置換(S1,E,U,R,R1) .

% *** user: 要素番号によるならびの置換 / 4 ***
要素番号によるならびの置換(Pos,U,P,Q) :-
    integer(Pos),
    !,
    要素番号によるならびの置換(1,Pos,U,P,Q) .
要素番号によるならびの置換(Pos,U,P,Q) :-
    \+(integer(Pos)),
    \+(Pos =.. [',',Pos1,Rpos]),
    Pos1 is Pos,
    要素番号によるならびの置換(1,Pos1,U,P,Q) .
要素番号によるならびの置換(Pos,U,P,Q) :-
    Pos =.. [',',Pos1,Rpos],
    要素番号によるならびの置換(1,Pos1,Rpos,U,P,Q) .


swap(A,B,L,LX) :-
    append(L1,[A|L2],[B|L3],L),
    append(L1,[B|L2],[A|L3],LX),!.
swap(A,B,L,LX) :-
    値による,
    append(L1,[B|L2],[A|L3],L),
    append(L1,[A|L2],[B|L3],LX),!.

要素番号によるならびの交換(M,N,_対象ならび,_交換したならび) :-
    要素番号による,
    M1 is M - 1,
    N1 is N - 1,
    append(L1,[A|R1],_対象ならび),
    length(L1,M1),
    append(L2,[B|R2],_対象ならび),
    length(L2,N1),
    append(L1,[B|R1],L3),
    append(L4,[_|R3],L3),
    length(L4,N1),
    append(L4,[A|R3],_交換したならび),!.


% テスト述語を一引数述語にまとめた場合の例。

適切なデータを得るまで入力を得る(_テスト述語,_入力行) :-
	get_line(_入力行),
	functor(Q,_テスト述語,1),
	arg(1,Q,_入力行),
	call(Q),!.
適切なデータを得るまで入力を得る(_テスト述語,_入力行) :-
	write('入力条件に反するデータが入力されました。再入力してください : '),
	適切なデータを得るまで入力を得る(_テスト述語,_入力行).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%[1] 授業単元: プログラミング初歩  
%[2] 問題文(含コード&リンク):(文字列を与えられた時、アルファベットを大文字小文字区別せずに出現頻度順  
%に小文字で並べた文字列を返すプログラムを作りなさい。)  
%[3] 環境  
% [3.1] OS: (WindowsXP)  
% [3.2] バージョン: (Ruby 1.8.6 )  
% [3.3] 言語: (Ruby  
%[4] 期限: ([2009年06月01日21:00まで]  
%[5] その他の制限: 配列などの初歩的な概念まで

t104(Atom,AtomX) :- 
    findall([0,N],for(97,N,122),L), 
    to_lower(Atom,Atom2), 
    atom_codes(Atom2,L1), 
    t104_2(L1,L,L2), 
    sort(L2,L3), 
    t104_3(L3,[],L4), 
    atom_codes(AtomX,L4),!. 

t104(Atom,AtomX) :- 
    findall([0,N],for(97,N,122),L), 
    to_lower(Atom,Atom2), 
    atom_codes(Atom2,L1), 
    t104_2(L1,L,L2), 
    sort(L2,L3), 
    reverse(L3,L4), 
    t104_3(L4,L5), 
    atom_codes(AtomX,L5),!. 

t104_2([],X,X). 
t104_2([A|R1],L,X) :- 
    t104_3(A,L,L1), 
    t104_2(R1,L1,X). 

t104_3(97,[[S,N]|R],[[S1,N]|R]) :- 
    S1 is S+1. 
t104_3(N,[U|R1],[U|R2]) :- 
    N > 97, 
    M is N-1, 
    t104_3(M,R1,R2). 

t104_4([],[]). 
t104_4([[0,_]|R1],X) :- 
    t104_4(R1,X). 
t104_4([[C,N]|R1],[N|R2]) :- 
    C > 0, 
    t104_4(R1,R2). 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% http://pc12.2ch.net/test/read.cgi/tech/1200175247/529
% [1] 授業単元:Ruby 
% [2] 問題文 ファイル分割 
%
% 下記は、hoge.csvを均等に4分割して tmp/ 以下に書き込むプログラムである。 
%
% ruby split.rb hoge.csv tmp/ 4 
%
% 出力例 
% tmp/1out.csv 
% tmp/2out.csv 
% tmp/3out.csv 
% tmp/4out.csv 

t131(_分割されるファイル,_分割数) :-
    get_lines(_分割されるファイル,[_先頭行|L]),
    length(L,Len),
    Div is Len // _分割数,
    Mod is Len mod _分割数,
    t131(L,Div,Mod,1,X),
    t131(_分割数,_先頭行,X),
    fail;
    true.

t131(_分割数,_先頭行,L) :-
    for(1,N,_分割数),
    list_nth(N,L,X),
    concat_atom(['tmp/',N,'out.csv'],F),
    put_lines(F,[_先頭行|X]),
    N=_分割数.

t131([],_,_,_,_).
t131(L,Div,Mod,Gth,[X|R])
    切り取り行数(Div,Mod,Gth,M),
    member_n(M,X,L,RL),
    Gth2 is Gth+1,
    t131(RL,Div,Mod,Gth2,R).

切り取り行数(Div,Mod,Nth,X) :- Nth > Mod,X is Div.
切り取り行数(Div,Mod,Nth,X) :- Nth =< Mod,X is Div + 1.

member_n(N,X,L,R) :-
    length(X,N),
    append(X,R,L).


'課題1-4'(File,X) :-
    open(File,read,Input),
    get_char(Input,C),
    '課題1-4'(Input,C,[],Y),
    close(Input),
    sort(Y,X).

'課題1-4'(_,end_of_file,X,X) :- !.
'課題1-4'(Input,_受取文字,受取リスト,X) :-
    _受取文字 @>= ' ',
    _受取文字 @=< z,
    to_upper(_受取文字,_大文字化した文字),
    鍵と対の値に1を加える(_大文字化した文字,_受取リスト,_更新されたリスト),
    get_char(Input,_次の文字),
    '課題1-4'(Input,_次の文字,_更新されたリスト,X).

鍵と対の値に1を加える(Key,L,X) :-
    append(L1,[[Key,V]|L2],L),
    V2 is V + 1,
    append(L1,[[Key,V2]|L2],X),!.
鍵と対の値に1を加える(Key,L,[[Key,1]|L]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 【 課題 】二つの文字列str1 とstr2 を入力して、str1 とstr2 から交互に一文字ずつ順番にとりだして、交  
% 互にならべた文字列をつくれ。長い方の文字列の後の部分はそのままくっついた形になる。
% String,StringBuffer クラスのメソッドを使え。 
% 

二つの文字列を交互に併合する(Str1,Str2,Str) :-
  atom_chars(Str1,Chars1),
  atom_chars(Str2,Chars2),
  順併合(Chars1,Chars2,Chars3),
  atom_chars(Str,chars3).

順併合([],L,L) :- !.
順併合([A|R1],L2,[A|R]) :-
  順併合(L2,R1,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% <<課題>> C 
% 1行に一つづつ表示するプログラムを作成せよ。 
% 空白が2個以上連続してもうまく動作するようにすること。また、コンマ(,)、 
% ピリオド(,)は表示する単語に含めないこと。 
%
% (実行例) 
% ・入力 
%  This is a pen. 
%
% ・出力 
% This 
% is 
% a 
% pen 
% 

文字列から切り出した単語の行表示(_文字列) :-
    文字列から単語の切り出し(_文字列,_単語ならび),
    wrln(_単語ならび).    

文字列から単語の切り出し(_文字列,_単語ならび) :-
    atom_chars(_文字列,_文字ならび),
    文字ならびを区切り文字により分割する(_文字ならび,L),
    単語ならびに変換(,_単語ならび).

文字ならびを区切り文字により分割する([A|R1],R2) :-
    区切り文字(A),
    文字ならびを区切り文字により分割する(R1,R2),!.
文字ならびを区切り文字により分割する(_文字ならび,[L1|R]) :-
    append(L1,[A|L2],_文字ならび),
    区切り文字(A),
    文字ならびを区切り文字により分割する(L2,R),!.
文字ならびを区切り文字により分割する(_,[]) :- !.

区切り文字(' ').
区切り文字('\n').
区切り文字('.').
区切り文字(',').

単語ならびに変換([]) :- !.
単語ならびに変換([L|R1],[_単語|R2]) :-
    concat_atom(L,_単語),
    単語ならびに変換(R1,2).

wrln([]) :- !.
wrln([A|R]) :-
    write_formatted('%t\n',[A]),
    wrln(R).


データを追加する度に整列する(L) :-
	get_line(Line),
	データを追加する度に整列する(Line,[],L).

データを追加する度に整列する(end_of_file,_,_) :- !,fail.
データを追加する度に整列する(Line,L1,L) :-
	データを挿入する(Line,L1,L).
データを追加する度に整列する(Line,L1,L) :-
	データを挿入する(Line,L1,L2),
	get_line(Line2),
	データを追加する度に整列する(Line2,L2,L).

データを挿入する(A,[],[A]) :- !.
データを挿入する(A,[B|R],[A,B|R]) :- A @=< B,!.
データを挿入する(A,[B|R1],[B|R2]) :- A @> B,データを挿入する(A,R1,R2),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1]  授業単元: C  
% [2] 問題文(含コード&リンク):入力した文字の種類を表示するプログラムを作成せよ。ただし、表示は次に従うとする  
% 入力キーA〜Z 表示メッセージ 英大文字です  
% 入力キーa〜z 表示メッセージ  英小文字です  
% 入力キー0〜9 表示メッセージ  数字です  
% 上記以外    表示メッセージ  その他のキャラクターです  

入力した文字の種類を表示するプログラム(_文字) :-
    文字の範疇(_文字の範疇,_文字),
    表示は次に従うとする(_文字の範疇,_,_表示メッセージ),
    write(_表示メッセージ).
    
表示は次に従うとする(入力キーA〜Z,表示メッセージ,英大文字です).
表示は次に従うとする(入力キーa〜z,表示メッセージ,英小文字です). 
表示は次に従うとする(入力キー0〜9,表示メッセージ,数字です).
表示は次に従うとする(上記以外,表示メッセージ,その他のキャラクターです).

文字の範疇(入力キーA〜Z,_文字) :-
    member(_文字,['A','B','C','D','E','F','G','H',
		  'I','J','K','L','M','N','O','P',
		  'Q','R','S','T','U','V','W','X','Y','Z']).
文字の範疇(入力キーa〜z,_文字) :-
    member(_文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]).
文字の範疇(入力キー0〜9,_文字) :-
    member(_文字,['0','1','2','3','4','5','6','7','8','9']).
文字の範疇(上記以外,_文字) :-
    \+(文字の範疇(入力キーA〜Z,_文字)),
    \+(文字の範疇(入力キーa〜z,_文字)),
    \+(文字の範疇(入力キー0〜9,_文字)).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 課題8 暗号文を作成するプログラム ファイル名(AxP21xxx_kadai8_angou.java)
% 適当な文字列を入力して、暗号化するプログラムである。
% 暗号キーは2桁とし、暗号文は奇数番目と偶数番目の文字位置を、
% 暗号キーの値だけ交互にずらして作成する。
% なお使用する文字種は[!]から[z]までの90 個とする(0x21〜0x7A)
% 。またzを越えたら!に戻すこと。
% (例)暗号キーが「16」のとき
% 元の文字列 暗号文字列
% b u n k y o → c ! o q z u
% +1 +6 +1 +6 +1 +6

文字列の暗号化(_鍵整数,_元の文字列,_暗号文字列) :- 
    integer(_鍵整数), 
    _鍵整数>=10 
    _鍵整数=<99, 
    atom_codes(_元の文字列,Codes), 
    _奇数番目の鍵 is _鍵整数 // 10, 
    _偶数番目の鍵 is _鍵整数 mod 10, 
    文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,Codes,_暗号Codes), 
    atom_codes(_暗号文字列,_暗号Codes). 

文字コードによる暗号化(_,_,[],[]) :- !. 
文字コードによる暗号化(_鍵1,_鍵2,[A|R1],[B|R2]) :- 
    一文字の暗号化(_鍵1,A,B), 
    文字コードによる暗号化(_鍵2,_鍵1,R1,R2). 

一文字の暗号化(_変位,_文字コード,_暗号化された文字コード) :- 
    _文字コード+_変位 =< 122,!, 
    _暗号化された文字コード is _文字コード+_変位. 
一文字の暗号文字化(_変位,_文字コード,_暗号化された文字コード) :- 
    _文字コード+_変位 >122,!, 
    _暗号化された文字コード is _文字コード+_変位-90. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 【 課題 】
% String a ="@test あいう@aaaおえてhttp://test.com/と";
% aから@から始まるアルファベットとURLを取り除く処理
% System.out.println(a);
%
% 出力結果
% あいうおえてと
%
% aから@から始まるアルファベットとURLを取り除く処理はどのように書けばいいのでしょうか。


t251(_文字列,_取り除いた文字列) :-
    atom_chars(_文字列,Chars),
    t251_1(Chars,L),
    atom_chars(_取り除いた文字列,L).

t251_1([],[]) :- !.
t251_1([' '|R1],R2) :-
    t251_1(R1,R2),!.
t251_1([@|R1],R2) :-
    t251_2(R1,R2),!.
t251_1(L,R2) :-
    url_check(L,R1),
    t251_2(R1,R2),!.
t251_1([A|R1],[A|R2]) :-
    t251_1(R1,R2).

t251_2([],[]) :- !.
t251_2([A|R1],R2) :-
    A @>' ',
    A @=< z,!,
    t251_2(R1,R2).
t251_2(L,R2) :-
    t251_1(L,R2).

url_check([h,t,t,p,:,/,/|R],R) :- !.
url_ckeck([h,t,t,p,s,:,/,/,|R],R) :- !.
url_check([f,t,p,:,/,/|R],R) :- !.
url_check([f,i,l,e,:,/,/|R],R) :- !.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% あいうえお
% /*かきくけこ*/
% さしす/*せそ
% なにぬ*/ねの
%
% というファイル(test.txt)から文字数、改行数、コメント文字数をカウントし、出力するプログラムです。
% お願いいたします。

t274(_文字数,_改行数,_コメント文字数) :-
    get_chars('test.txt',Chars),
    length(Chars,_文字数),
    改行数を数える(Chars,_改行数),
    コメント文字数を数える(Chars,_コメント文字数).

改行数を数える(Chars,_改行数) :-
    findall(_,append(_,['\n'|_],Chars),L),
    length(L,_改行数).

コメント文字数を数える(Chars,_コメント文字数) :-
    append(_,['/','*'|L2],Chars),
    append(_コメント文字候補,['*','/'|_],L2),
    not(append(_,['/','*'|_],_コメント文字候補)),
    改行を取り除く(_コメント文字候補,_改行を取り除いたコメント文字候補),
    length(_改行を取り除いたコメント文字候補,_コメント文字数).

改行を取り除く([],[]).
改行を取り除く(['\n'|R1],R2) :-
    改行を取り除く(R1,R2),!.
改行を取り除く([A|R1],[A|R2]) :-
    not(A='\n'),
    改行を取り除く(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 以下のように出力されるプログラムを作成せよ
% 年齢を入力してください
% 16
% 生まれた年を入力してください
% 1986
% 好きな数字を入力してください
% 7
% あなたは1986年生まれの16才で、7が好きですね

t277 :-
    質問文(L),
    findall(U,(member(A,L),write(A),nl,get_line(U)),VL),
    write_formatted('あなたは%t年生まれの%才で、%tが好きですね\n',VL).

質問文([年齢を入力してください,生まれた年を入力してください,好きな数字を入力してください]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1] 授業単元:プログラミング
% [2] 問題文(含コード&リンク):
% 自分の名前の英字名のASCIIコードを順番に表示するプログラムを作りなさい。

t296(Name) :-
    sub_atom(Name,S,1,R,A),
    not(A=' '),
    char_code(A,C),
    N is S+1,
    write_formatted('%2d: %t\n',[N,C]),
    fail;
    true.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1] 授業単元:プログラミング演習
% [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9667.txt

% 課題1 スペースの挿入
% 
% 最大50文字のスペースを含まない文字列をターミナルから読み込み,各文字間にスペースを挿入したものを出力するプログラムを
% 作成しなさい. 
% 課題実行においては以下の点に注意すること.
% ・プログラム名は「space」とすること. 
% ・文字列の先頭と最後にはスペースを入れない. 
% ・ポインタを用いること.
% 
% 実行結果
% ./space
% abc
% a b c

space(_文字列,_スペースを挿入された文字列) :-
    atom_chars(_文字列,Chars),
    concat_atom(Chars,' ',_スペースを挿入された文字列).

concat_atom([],_,'') :- !.
concat_atom([A],_,A) :- !.
concat_atom([A|R],S,X) :-
    concat_atom(R,S,Y),
    atom_concat(A,S,B),
    atom_concat(B,Y,X).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 課題2 Inner Product (内積)
%
% Write a program (innpro) to compute an inner product. 
% First, decide a degree of a vector, next input two vectors of 
% degree n, A and B, then the inner product is output. 
% The maximum degree of the vectors is 20. 
% Remarks.
% ・The name of the program must be innpro. 
% ・The inner product A=(a1,a2, ... ,an) and B=(b1,b2,...,bn) is a1*b1+a2*b2+...+an*bn. 
% 
% 実行結果
% ./innpro
% Degree: 5
% Data of A: 1 2 3 4 5
% Data of B: 2 3 4 5 6
% Inner Product: 70

innpro([],[],0) :- !.
innpro([A|R1],[B|R2],X) :-
    innpro(R1,R2,Y),
    X is A * B + Y.


ファイルサイズを取得する(_ファイル,_サイズ) :-
	get_file_info(_ファイル,L),
	member(size(_サイズ),L).


% *** user: 'URLの文字列をエンコードする' / 2 ***
URLの文字列をエンコードする('','') :- !.
URLの文字列をエンコードする([],'') :- !.
URLの文字列をエンコードする(_URL文字列,_エンコードされたURL文字列) :-
    var(_エンコードされたURL文字列),
    sprintf('%q',[_URL文字列],S),
    decompcons(S,L),
    replace_query_1(L2,L),
    replace_query_6(L2,L3),
    concat(L3,_エンコードされたURL文字列),!.
URLの文字列をエンコードする(_URL文字列,_エンコードされたURL文字列) :-
    \+(var(_エンコードされたURL文字列)),
    \+(var(_URL文字列)),
    sprintf('%q',[_URL文字列],S),
    decompcons(S,L),
    replace_query_1(L2,L),
    replace_query_6(L2,L3),
    concat(L3,_エンコードされたURL文字列),!.

% *** user: replace_query_1 / 2 ***
replace_query_1([],[]) :- !.
replace_query_1([+|R],[' '|R1]) :-
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B,'%',C,D|R],[E|R1]) :-
    atomic(E),
    var(A),
    var(B),
    var(C),
    var(D),
    error_protect(name2(E,[U,V]),fail),
    U > 127,
    V < 128,
    U1 is U // 16,
    U2 is U mod 16,
    char_code(C_1,V),
    replace_query_2(C,D,C_1),
    replace_query_4(A,U1),
    replace_query_4(B,U2),
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B,C|R],[E|R1]) :-
    atomic(E),
    var(A),
    var(B),
    var(C),
    error_protect(name2(E,[U,V]),fail),
    U > 127,
    V < 128,
    U1 is U // 16,
    U2 is U mod 16,
    char_code(C,V),
    \+(replace_query_2(_,_,C)),
    replace_query_4(A,U1),
    replace_query_4(B,U2),
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B,'%',C,D|R],[E|R1]) :-
    atomic(E),
    var(A),
    var(B),
    var(C),
    var(D),
    char_code(E,N),
    N > 4096,
    error_protect(name2(E,[U,V]),fail),
    U1 is U // 16,
    U2 is U mod 16,
    V1 is V // 16,
    V2 is V mod 16,
    replace_query_4(A,U1),
    replace_query_4(B,U2),
    replace_query_4(C,V1),
    replace_query_4(D,V2),
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B|R],[C|R1]) :-
    replace_query_2(A,B,C),
    replace_query_1(R,R1),!.
replace_query_1(['%',A,B,'%',C,D|R],[E|R1]) :-
    \+(error_protect(get_global(sjis,on),fail)),
    atomic(A),
    atomic(C),
    compare(>,A,'7'),
    compare(>,C,'7'),
    \+(replace_query_2(C,D,_)),
    replace_query_3(A,B,N1),
    replace_query_3(C,D,N2),
    name2(E,[N1,N2]),
    set_global(euc,on),
    replace_query_1(R,R1),!.
replace_query_1([A|R],[A|R1]) :-
    replace_query_1(R,R1).

% *** user: replace_query_2 / 3 ***
replace_query_2('2','F',/) :-
    ! .
replace_query_2('2','8','(') :-
    ! .
replace_query_2('2','9',')') :-
    ! .
replace_query_2('2','B',+) :-
    ! .
replace_query_2('2','D',-) :-
    ! .
replace_query_2('2','7','''') :-
    ! .
replace_query_2('2','7','''') :-
    ! .
replace_query_2('5','B','[') :-
    ! .
replace_query_2('5','D',']') :-
    ! .
replace_query_2('3','D',=) :-
    ! .
replace_query_2('3','C',<) :-
    ! .
replace_query_2('3','E',>) :-
    ! .
replace_query_2('3','B',;) :-
    ! .
replace_query_2('3','F',?) :-
    ! .
replace_query_2('2','5','%') :-
    ! .
replace_query_2('2','6',&) :-
    ! .
replace_query_2('2','3',#) :-
    ! .
replace_query_2('5','F','_') :-
    ! .
replace_query_2('2','C',',') :-
    ! .
replace_query_2('2','1',!) :-
    ! .
replace_query_2('5','E',^) :-
    ! .
replace_query_2('3','A',:) :-
    ! .
replace_query_2('5','C',\) :-
    ! .
replace_query_2('2','2','"') :-
    ! .
replace_query_2('7','C','|') :-
    ! .
replace_query_2('0','A','\n') :-
    ! .
replace_query_2('0','D','') :-
    ! .
replace_query_2('6','0',`) :-
    ! .
replace_query_2('7','E',~) :-
    ! .
replace_query_2('4','0',@) :-
    ! .

% *** user: replace_query_3 / 3 ***
replace_query_3(A,B,C) :-
    replace_query_4(A,M),
    replace_query_4(B,N),
    C is M * 16 + N,
    ! .

% *** user: replace_query_4 / 2 ***
replace_query_4('F',15) :-
    ! .
replace_query_4('E',14) :-
    ! .
replace_query_4('D',13) :-
    ! .
replace_query_4('C',12) :-
    ! .
replace_query_4('B',11) :-
    ! .
replace_query_4('A',10) :-
    ! .
replace_query_4('9',9) :-
    ! .
replace_query_4('8',8) :-
    ! .
replace_query_4('7',7) :-
    ! .
replace_query_4('6',6) :-
    ! .
replace_query_4('5',5) :-
    ! .
replace_query_4('4',4) :-
    ! .
replace_query_4('3',3) :-
    ! .
replace_query_4('2',2) :-
    ! .
replace_query_4('1',1) :-
    ! .
replace_query_4('0',0) :-
    ! .
replace_query_4(C,N) :-
    char_code(C,M),
    N is M - 48,!.

replace_query_6(['%','2','7'|R1],X) :-
    replace_query_7(R1,X),!.
replace_query_6(L1,X) :-
    replace_query_7(L1,X).

replace_query_7(L1,X) :-
    append(X,['%','2','7'],L1),!.
replace_query_7(X,X).


% *** user: 'URLの文字列をデコードする' / 2 ***
URLの文字列をデコードする(_エンコードされたURL,_デコードされたURL) :-
    var(_デコードされたURL),
    atom(_エンコードされたURL),
    decompcons(_エンコードされたURL,L),
    replace_query_1(L,L2),
    concat_atom(L2,A),
    atom_to_term(A,_デコードされたURL,_),
    ! .

% replace_query_1/2以下の述語定義はこちらを参照したください


ホスト名のIPアドレスを取得する(_ホスト名,IPアドレス) :-
    get_lines('/etc/hosts',Lines),
    member(Line,Lines),
    split(Line,[' '],[IPアドレス,_ホスト名|_]),!.

'IPアドレスからホスト名を取得する'(IPアドレス,_ホスト名) :-
    get_lines('/etc/hosts',Lines),
    member(Line,Lines),
    split(Line,[' '],[IPアドレス,_ホスト名|_]),!.


'URLのアンカー部分を取得する'(URL,_アンカー部分) :-
    split(URL,['#'],[_|R]),
    concat_atom(R,_アンカー部分).


'URLのファイル名を取得する'(URL,_ファイル名) :-
    atom_chars(URL,Chars),
    append(L1,['://'|L2],Chars),
    append(_,['/'|L3],L2),
    concat_atom(L2,_ファイル名).


'URLのホスト名を取得する'(URL,_ホスト名) :-
    atom_chars(URL,Chars),
    append(L1,['://'|L2],Chars),
    append(L3,['/'|_],L2),
    'URLのホスト名を取得するの二'(L3,_ホスト名),!.

'URLのホスト名を取得するの二'(L3,_ホスト名) :-
    append(L4,[':'|_],L3),
    concat_atom(L4,_ホスト名),!.
'URLのホスト名を取得するの二'(L3,_ホスト名) :-
    concat_atom(L3,_ホスト名),!.


'URLのポート番号を取得する'(URL,_ポート番号) :-
    atom_chars(URL,Chars),
    append(L1,['://'|L2],Chars),
    append(L3,['/'|_],L2),
    append(_,[':'|L4],L3),
    concat_atom(L4,_ポート番号).


'URLのプロトコル名を取得する'(URL,_プロトコル名) :-
    split(URL,['://'],[A|_プロトコル名]).


'URLのクエリー情報を取得する'(URL,_クエリー情報) :-
    split(URL,['?'],[_|L]),
    concat_atom(L,_クエリー情報).


'URLのクエリー情報からnameとvalueならびを得る'(URL,_nameとvalueならび) :-
    'URLのクエリー情報を取得する'(URL,_クエリー情報),
    split(_クエリー情報,['&'],L),
    クエリー情報からnameとvalueならびを得る(L,_nameとvalueならび).

クエリー情報からnameとvalueりならびを得る([],[]) :- !.
クエリー情報からnameとvalueりならびを得る([A|R1],[[_name,_value]|R2]) :-
    split(A,['='],[_name,_value]),
    クエリー情報からnameとvalueならびを得る(R1,R2).


'URLのユーザー情報を取得する'(URL,_ユーザー情報) :-
    atom_chars(URL,Chars),
    append(L1,['://'|L2],Chars),
    append(L3,['/'|_],L2),
    append(L4,['@'|_],L3),
    concat_atom(L4,_ユーザー情報).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1] 授業単元: プログラミングC
% [2] 問題文(含コード&リンク):
% キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字
を大文字にするプログラムを作成せよ。
%
% 実行例 文字列入力 :AbCdEfG123
%     変換文字列 :aBcDeFg123

t386 :-
    get_line(Line),
    atom_chars(Line,Chars),
    大文字小文字変換(Chars,Chars2),
    atom_chars(Line2,Chars2),
    write_formatted('%t\n',[Line2]).

大文字小文字変換([],[]) :- !.
大文字小文字変換([A|R1],[B|R2]) :-
    A @>= 'A',
    A @=< 'Z',!,
    to_lower(A,B),
    大文字小文字変換(R1,R2).
大文字小文字変換([A|R1],[B|R2]) :-
    A @>= a,
    A @=< z,!,
    to_upper(A,B),
    大文字小文字変換(R1,R2).
大文字小文字変換([A|R1],[A|R2]) :-
    大文字小文字変換(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% [1] 授業単元: プログラミングC 
% [2] 問題文(含コード&リンク):  
% キーボードから半角英数で文字列を入力し、これを数字(0→9)、大文字(A→Z)、 
% 小文字(a→z)の順に並べ替えるプログラムを作成せよ。 
% ヒント:並べ替えアルゴリズムは、バブルソート(隣接交換法)を使うと簡単だろう。 
%     文字列長はstrlen命令を使うとよい。みたいです。

t388 :-
  get_line(Line),
  atom_chars(Line,Chars),
  バブルソート(Chars,_整列した文字ならび),
  atom_chars(Line2,_整列した文字ならび),
  write_formatted('%t\n',[Line2]).

バブルソート(L,X) :-
  整順が崩れるまで(L,L2),
  バブルソート(L2,X),!.
バブルソート(L,L).

整順が崩れるまで([A],[A]) :- !,fail.
整順が崩れるまで([A,B|R1],[A|R2]) :-
  A @=< B,
  整順が崩れるまで([B|R1],R2).
整順が崩れるまで([A,B|R1],[B,A|R1]) :-
  A @> B.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す 
% 【 形態 】1. Javaアプリケーション(main()で開始) 
% 【 期限 】7/14 am6:00 
% 【 Ver  】Eclipse Version: 3.4.2 
% 【 補足 】 
% あいう 
% かきく 
% さしす 
% 上記のようなテキストファイルを読み込み、 
% あかさ 
% いきし 
% うくす 
% のように別のテキストファイルに書き出す感じです。 

テキストファイルから文字列5行を読み込み、別のテキストへ縦書きで書き出す(InFile,OutFile) :-
    open(InFile,read,Input),
    open(OutFile,write,Output),
    findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL),
    max(Chars,Max),
    空白文字を付加して文字数一致させる(Max,LL,LL2),
    行列の転置(LL2,LL3),
    出力ファイルに書き出す(Output,LL3).

出力ファイルに書き出す(Output,[]) :- close(Output),!.
出力ファイルに書き出す(Output,[L|R]) :-
    concat_atom(L,S),
    write_formatted(Output,'%t\n',[S]),
    出力ファイルに書き出す(Output,R).

空白文字を付加して文字数を一致させる(Max,LL1,LL2) :-
    findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2).

all([],_).
all([V|R],V) :- all(R,V).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す 
% 【 形態 】1. Javaアプリケーション(main()で開始) 
% 【 期限 】7/14 am6:00 
% 【 Ver  】Eclipse Version: 3.4.2 
% 【 補足 】 
% あいう 
% かきく 
% さしす 
% 上記のようなテキストファイルを読み込み、 
% さかあ 
% しきい 
% すくう 
% のように別のテキストファイルに書き出す感じです。 

テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す(InFile,OutFile) :-
    open(InFile,read,Input),
    open(OutFile,write,Output),
    findall(Chars,(for(1,N,5),get_line(InFile,_行),atom_chars(_行,Chars)),LL),
    findmax(Len,length(Chars,Len),Max),
    空白文字を付加して文字数一致させる(Max,LL,LL2),
    行列の転置(LL2,LL3),
    右書き用に反転して出力ファイルに書き出す(Output,LL3).

右書き用に反転して出力ファイルに書き出す(Output,[]) :- close(Output),!.
右書き用に反転して出力ファイルに書き出す(Output,[L|R]) :-
    reverse(L,L1),
    concat_atom(L1,S),
    write_formatted(Output,'%t\n',[S]),
    右書き用に反転して出力ファイルに書き出す(Output,R).

空白文字を付加して文字数を一致させる(Max,LL1,LL2) :-
    findall(L,(member(L1,LL1),length(L,Max),append(L1,L2,L),all(L2,' ')),LL2).

all([],_).
all([V|R],V) :- all(R,V).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  さくらエディタを使っていて 
%   
%  CHAPTER01=00:00:00.000 
%  CHAPTER01NAME=第一部 オープニング 
%  CHAPTER02=00:09:13.400 
%  CHAPTER02NAME=オラはにんきもの 
%   
%  こういうのを 
%   
%    TRACK 01 AUDIO 
%      TITLE "第一部 オープニング" 
%      INDEX 01 00:00:00 
%    TRACK 02 AUDIO 
%      TITLE "オラはにんきもの" 
%      INDEX 01 09:13:40 
%   
%  こうしたいんですが、正規表現でできるもんなんでしょうか 
%  できるとしたら答えを貰えるのが一番ですが、どこら辺を調べればいいのかヒントをもらえないでしょうか 
% 
% 

変換(_ファイル名) :-
      get_lines(_ファイル名,Lines),
      変換規則('TRACK',Lines,TRACK,S1),
      変換規則('TITLE',Lines,TRACK,S2),
      変換規則('TIME',Lines,TRACK,S3),
      write_formatted('%t\n%t\n%t\n',[S1,S2,S3]),
      fail.      
変換(_).

変換規則('TRACK',Lines,TRACK,S) :-
      member(_文,Lines),
      sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL),
      append(L0,['='|R2],TL),
      \+(append(_,['N','A','M','E'],L0)),
      concat_atom(L0,TRACK),
      concat_atom(['TRACK',' ',TRACK,' ','AUDIO'],S).

変換規則('TITLE',_Lines,TRACK,S) :-
      member(_文,Lines),
      sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL),
      append(L1,['='|R],TL),
      append(L0,['N','A','M','E'|R2],L1),
      concat_atom(L0,TRACK),
      concat_atom(R,TITLE),
      concat_atom(['  ','TITLE',' "',TITLE,'"'],S).

変換規則('TIME',Lines,TRACK,S) :-
      member(_文,Lines),
      sub_atom(_文,0,7,_,H,'CHAPTER',T,HL,XL,TL),
      append(L0,['='|R2],TL),
      \+(append(_,['N','A','M','E'],L0)),
      concat_atom(L0,TRACK),
      concat_atom(R2,TIME),
      concat_atom(['  ','INDEX',' 01 ',TIME],S).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  JMeterで何とか以下のHTMLの『二番目の』optionを拾いたいんだけど、どーも上手くいきません。 
%  <select name="select$item1" onchange="javascript:dummry();" id="select_item1"> 
%   <option selected="selected" value="0">(none)</option> 
%   <option value="1">item1</option> 
%   <option value="2">item2</option> 
%   <option value="3">item2</option> 
%  </select> 
%  ※optionの行にはいくつかタブが入っています。 
%   
%  「id="select_item1">([.\r\n\t\f]*)option value="([1-9]*)"」と書けば拾ってくれると思ったんだけどダメでした。 
%  何か忘れている箇所がありましたら、是非アドバイスをお願いします。 
%   
%  ちなみに(おそらくnameに$が入っているせいだと思いますが)HTMLリンクパーサは動きません(涙 
% 
% 

'『二番目の』optionを拾いたい'(_htmlファイル,_二番目のoption) :-
	get_lines(Lines),
	'『二番目の』option'([],Lines,_二番目のoption).

'『二番目の』option'([_],[_行|R],_二番目のoption) :-
	'SPLIT'(_行,['>',''|_],L),
	last(L0,_二番目のoption),!.
'『二番目の』option'(L,[_行|R],_二番目のoption) :-
	'SPLIT'(_行,['>','',L),
	'『二番目の』option'([_|L],R,_二番目のoption).
'『二番目の』option'(L,[_行|R],_二番目のoption) :-
	'『二番目の』option'(L,R,_二番目のoption).
		    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  質問です。 
%  テキストの中の<location></location>で囲まれた行のみ処理対象にして、 
%  1.<location></location>を残す。 
%  2../(ピリオドとスラッシュ)を追加。 
%  3.前から8個目(後ろから1個目)の/(スラッシュ)以降のファイル名を残す。 
%  という正規表現を教えてください。 
%   
%  例 
%  <location>file:///(ドライブ名):/(フォルダ名)/(フォルダ名)/(フォルダ名)/(フォルダ名)/(ファイル名)</location> 
%  という行がテキストファイル内に存在したら 
%  <location>./(ファイル名)</location> 
%  という内容に変更したい。フォルダ名とファイル名に規則性無し。 
%  特に、8個目の/(スラッシュ)以降の文字列を残す方法が全くワカリマヘン。 
%   
%  現状レベル 
%  昨日から丸1日正規表現に取り組んで、近づいてる様な近づいてない様な抽出実験してるレベルです。 
%   
%  因みに今回のテキストファイルは、VLCのプレイリストのxspfファイルです。 
%  ファイルを移動した時、プレイリストが絶対アドレスで定義されてるので、リンクが切れてしまいます。 
%  今回の変更で、相対アドレスになりある程度のファイル移動が可能になる。まあ仕事じゃない趣味のレベルです。 
%   
%  宜しくお願いします。 
% 

'テキトの中ので囲まれた行のみ処理対象にして、1.を残す。2../(ピリオドとスラッシュ)を追加。3.前から8個目(後ろから1個目)の/(スラッシュ)以降のファイル名を残す。' :-
	get_lines(_テキストファイル,Lines),
	append(_,[_行|R],Lines),
	'で囲まれた行のみ処理対象'(_行),
	R = [].

'で囲まれた行のみ処理対象'(_行) :-
	'SPLIT'(_行,['','/',''],L),
	append([''],L1,[''],L),
	last(L1,_ファイル名),
	concat_atom(['./',_ファイル名,''],S),
	write_formatted('%t\n',[S]),!.
'で囲まれた行のみ処理対象'(_行) :-
	write_formatted('%t\n',[_行]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  [1] 授業単元:C言語 
%  [2] 問題文(含コード&リンク):int main(void) 
%   
%                { 
%   
%              char word[101],boin[5]={'a','i','u','e','o'}; 
%               int i,count[5];  
%   
%               printf("アルファベットで文字列を入力してください>>>"); 
%               scanf("%s",word); 
%   
%               count[0]=0,count[1]=0,count[2]=0,count[3]=0,count[4]=0; 
%   
%               for(i=0; word[i]!='\0'; i++) 
%     
%              { 
%                 if(word[i]==boin[0]) {count[0]++;} if(word[i]==boin[1]) {count[1]++;} 
%              if(word[i]==boin[2]) {count[2]++;} if(word[i]==boin[3]) {count[3]++;} if(word[i]==boin[4]) {count[4]++;} 
%                      }  
%   
%                     printf(" a>>>%d\n i>>>%d\n u>>%d\n e>>>%d\n o>>>%d\n",count[0],count[1],count[2],count[3],count[4]); 
%   
%       return 0; 
%   
%         }  
%  アルファベット文字列の中から母音をカウントするプログラムなのですが、現在ソース中の配列は 
%  定数によって値が参照されています。これをboin[i] count[j]のように変数で値を参照するものに書き換えてください。 
%  [3]環境:linux コンパイラ:gcc  C言語 
%  [4] 期限:2010年10月19日10:00まで 
%  [5] その他の制限:変数で配列要素の値を参照するときfor文と組み合わせること。 
%  どうか、よろしくお願いします 
% 

母音([a,i,u,e,o]).

アルファベット文字列の中から母音をカウントする(_アルファベット文字列,_母音の数) :-
	母音(_母音ならび),
	findall(_,(
		    sub_atom(_アルファベット文字列,_,1,_,_文字),
		    append(_,[_文字|_],_母音ならび)),
		L),
	length(L,_母音の数).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  [1] 授業単元: プログラム  
%  [2] 問題文(含コード&リンク):テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。 
%  

'テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。'(_距離ならび,_最大距離,_最小距離) :-
	データの読み込み(L),
	length(L,Length),
	findall(N,for(1,N,Length),NL),
	findall(_距離,(
		    組み合わせ(NL,2,[Nth1,Nth2]),
		    list_nth(Nth1,L,[X1,X2,X3]),
		    list_nth(Nth2,L,[Y1,Y2,Y3]),
		    _距離 is sqrt((X1-Y1)^2 + (X2-Y2)^2 + (X3-Y3)^2))),
		_距離ならび),
	max(_距離ならび,_最大距離),
	min(_距離ならび,_最小距離).
	
データの読み込み(L) :-
	write('データ(x1,x2,x3を)カンマ区切りで入力してください。(終了は空行で) : '),
	get_line(Line),
	データの読み込み(Line,L).

データの読み込み('',[]) :- !.
データの読み込み(Line,[[X1,X2,X3]|R]) :-
	split(Line,[',',' '],[X1,X2,X3]),
	get_line(Line2),
	データの読み込み(Line2,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  ●正規表現の使用環境  
%  php5  
%   
%  ●検索か置換か?  
%  置換  
%   
%  ●説明  
%  tableタグ内の改行(<br />)を全て削除したい  
%   
%  ●対象データ  
%  <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"><br />  
%  <tbody><br />  
%  <tr><br />  
%  <td><br />  
%  </td><br />  
%  </tr><br />  
%  </tbody><br />  
%  </table>  
%   
%  ●希望する結果  
%  <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx">  
%  <tbody>  
%  <tr>  
%  <td>  
%  </td>  
%  </tr>  
%  </tbody>  
%  </table>  
% 
% 

'tableタグ内の改行タグを全て削除したい'(_ファイル) :-
	get_chars(_ファイル,Chars),
	'tableタグ内の改行タグを全て削除したい'(Chars,L),
	put_chars(_ファイル,L).

'tableタグ内の改行タグを全て削除したい'([],[]) :- !.
'tableタグ内の改行タグを全て削除したい'(L1,L2) :-
	append(L0,[<,t,a,b,l,e,>|R],L1),
	append(L2,[<,/,t,a,b,l,e,>|R2],R),
	'改行タグの削除'(L2,L3),
	'tableタグ内の改行タグを全て削除したい'(R2,L4),
	append(L0,[<,t,a,b,l,e,>|L3],L4,L2),!.
'tableタグ内の改行タグを全て削除したい'(L,L).

'改行タグの削除'([],[<,/,t,a,b,l,e,>]) :- !.
'改行タグの削除'([<,b,r,' ',/,>|R1],R2) :-
	'改行タグの削除'(R1,R2),!.
'改行タグの削除'([A|R1],[A|R2]) :-
	'改行タグの削除'(R1,R2),!.

%  先頭から3文字にマッチする表現を教えてください 
% 

先頭から3文字にマッチする表現([A,B,C|R],[A,B,C],R).

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

先頭から3文字にマッチする表現(_文字列,'',_先頭から3文字にマッチする表現の文字列,_残り文字列) :-
	sub_atom(_文字列,0,3,R,_先頭から3文字にマッチする表現の文字列),
	sub_atom(_文字列,3,R,_,_残り文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  見出しと任意文字列の間にtabを挿入したいのですが、そうした置換は可能でしょうか? 
%  サクラエディタを使っています。 
%  幼稚な質問をお許し下さい 
%   
%   
%  見出し1=任意文字列1 
%  見出し2=任意文字列2=任意文字列3 
%  見出し3=任意文字列4=任意文字列5=任意文字列6 
%   
%  【こうしたい】 
%  見出し1=  任意文字列1 
%  見出し2=  任意文字列2=任意文字列3 
%  見出し3=  任意文字列4=任意文字列5=任意文字列6 
%   

見出しと任意文字列の間にtabを挿入したい(_対象となる行ならび,_見出しと任意文字列の間にtabを挿入した行ならび) :-
	findall(_tabを挿入された行,(
		     append(_,[_行|_],_対象となる行ならび),
		     文字列置換(_行,'=','=\t',_tabを挿入された行)),
		_見出しと任意文字列の間にtabを挿入した行ならび).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 文字列置換/4 が未定義だったら、

見出しと任意文字列の間にtabを挿入したい(_対象となる行ならび,_見出しと任意文字列の間にtabを挿入した行ならび) :-
	findall(_tabを挿入された行,(
		     append(_,[_行|_],_対象となる行ならび),
		     split(_行,['='],[_見出し|R]),
		     concat_atom(R,'=',S),
		     concat_atom([_見出し,'=','\t',S],_tabを挿入された行)),
		_見出しと任意文字列の間にtabを挿入した行ならび).


%  A3AACD9ABD377E716127E010FEAC9EBE のような半角英数字32文字の取得はどう書けばいいんでしょうか? 


'A3AACD9ABD377E716127E010FEAC9EBE のような半角英数字32文字の取得'(_文字列,_前文字列,_検索文字列,_後文字列) :-
	atom_chars(_文字列,Chars),
	半角英数N文字の連続を検索(Chars,32,L0,[],L0,L,R),
	atom_chars(_前文字列,L0),
	atom_chars(_検索文字列,L),
	atom_chars(_後文字列,R).

半角英数N文字の連続を検索([],N,[],L1,[],L) :-
	length(L1,N),
	reverse(L1,L),!.
半角英数N文字の連続を検索(R,N,L1,[],L,R) :-
	length(L1,N),
	reverse(L1,L),!.
半角英数N文字の連続を検索([A|R1],N,L1,[A|R0],L,R) :-
	\+(半角英数字(A)),
	半角英数N文字の連続を検索(R1,N,[],R0,L,R),!.
半角英数N文字の連続を検索([A|R1],N,L1,[A|R0],L,R) :-
	半角英数N文字の連続を検索(R1,N,[A|L1],R0,L,R).

半角英数字(C) :-
	member([U1,U2],[['A','Z'],[a,z],['0','9']]),
	C @>= U1,
        C @=< U2,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  ●正規表現の使用環境  
%  PHP5.29 
%   
%  ●検索か置換か?  
%  検索 
%   
%  ●説明 
%  :より前の記号部分を取得したい。 
%   
%  ●対象データ  
%  5789:石鹸 
%  w555-2:タオル 
%  Zxcvb:ハンガー 
%   
%  ●希望する結果  
%  5789 
%  w555-2 
%  Zxcvb 
% 

':より前の記号部分を取得したい。 '(_行ならび,_置換された行ならび) :-
	findall(_コロンより前の記号部分,(
		    append(_,[_行|_],_行ならび),
		    コロンより前の記号部分(_行,_コロンより前の記号部分)),
		_置換された行ならび).

コロンより前の記号部分(_行,_コロンより前の記号部分) :-
	sub_atom(_行,_コロンの位置,1,_,':'),
	sub_atom(_行,0,_コロンの位置,_,_コロンより前の記号部分),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  http://ime.nu/test.com/test1/test2/test3/pic.jpg から 
%  test.com/test1/test2/test3 を取るにはどう書いたらいいでしょうか 
%   
%  test1やtest2の階層は増えたり減ったりします。 
%  要するにhttp://ime.nu/から最後の/の間の値がほしいです 
% 
% 

'要するにhttp://ime.nu/から最後の/の間の値がほしいです'(_行,_欲しい部分文字列) :-
	atom_chars(_行,Chars),
	append(_,[h,t,t,p,:,/,/,i,m,e,'.',n,u,/|L],[/|R],Chars),
	\+(append(_,[/|_],R)),
	atom_chars(_欲しい部分文字列,L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  シェルの中で入力ファイル名から出力ファイル名を生成しています。 
%  特定の文字列・記号を正規表現でリネームしたいのですが思いつきません。 
%   
%  ファイル名前半部が異なるファイルが50以上あるのですが、思い通りにrenameしてくれません。 
%  ご教示お願いいたします。 
%   
%  対象ファイル: 
%  iko_foobar_hogehoge_20101008.tsv 
%   
%  リネーム後ファイル: 
%  iko_foobar_hogehoge-20101008.tsv 
%   
%  コマンドの実行イメージ 
%  rename iko*_[\d,8].tsv iko*-[\d,8].tsv 
%   
%  IN_FILE = ma_sina_syo_20100101 
%  OUT_FILE="${DIR_PATH_RCV}/${PREFIX}$(basename ${IN_FILE})${MARK}${YMD}.tsv" 
%  OUT_FILE=iko_ma_sina_syo-20100101.tsv 
%   
% 
% 

ファイル名前半部が異なるファイルをrenameする(_ディレクトリ名) :-
	concat_atom(['ls -N ',_ディレクトリパス名',S),
	shs(S,_行ならび),
	append(_,[_行|R],_行ならび),
	atom_chars(_行,Chars),
	length(L2,9),
	append(L1,L2,Chars),
	append([_],L3,L2),
	全部数字(L3),
	concat_atom(L1,S1),
	concat_atom(L3,S3),
	concat_atom(['mv ',_行,' ','iko_',S1,'-',S3,'.tsv']),Mv),
	system(Mv),
	R = [],!.

全部数字([]) :- !.
全部数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']),全部数字(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  秀丸ですが、指定の文字列が無い行全てを削除したいです。 
%   
%  以下の様な複数行のターゲットがあって、zyzの文字列が有る行のみ 
%  残したいのです。 
%   
%  .+[^(zyz)].+\n じゃダメだったし、力不足でニッチもサッチもいきませんorz 
%  どなたかHELP ME・・・・・ 
%   
%  AAABBBzzyCCDDDEEEAAA 
%  AAABBBDDzyzEEEAAA 
%  AAABBBCCzyzEEEAAA 
%  AAABBBCCDDDAAA 
%  AAACCDDDEEEAA 
%  AzyzAABBBCCDDDEEEAAA 
% 

指定の文字列が無い行全てを削除したい(_ファイル名,_削除指定文字列) :-
	get_lines(_ファイル名,Lines),
	findall(_行,(
		    append(_,[_行|_],Lines),
		    指定文字列がある(_行,_削除指定文字列)),
		Lines2),
	put_lines(_ファイル名,Lines2).                    

指定文字列がある(_行,_指定文字列) :- sub_atom(_行,_,_,_,_指定文字列),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  2桁の英数字にはマッチするけど3桁にはマッチしない正規表現はどう書けば良いんでしょうか? 
% 
% 「3桁にはマッチしない」は表現できない。
%  こちらを参照してください

'2桁の英数字にはマッチするけど3桁にはマッチしない'(_文字列,_2桁の英数字) :-
	sub_atom(_文字列,_,2,_,_2桁の英数字),
	atom_codes(_2桁の英数字,[Code1,Code2]),
	英数コード(Code1),
	英数コード(Code2).

英数コード(Code) :- Code >=48,Code =< 57,!.
英数コード(Code) :- Code >=65,Code =< 90,!.
英数コード(Code) :- Code >=97,Code =< 122,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  2桁以上の英数字にマッチするけど3桁にはマッチしない正規表現はどう書けば良いんでしょうか? 
% 

'2桁以上の英数字にマッチするけど3桁にはマッチしない'(_文字列,_2桁以上の英数字) :-
	sub_atom(_文字列,_,_副文字列の長さ,_,_2桁以上の英数字),
	_副文字列の長さ >= 2,
	\+(_副文字列の長さ=3),
	atom_codes(_2桁以上の英数字,L),
	すべて英数コード(L).

すべて英数コード([]) :- !.
すべて英数コード([_コード|R]) :-
	英数コード(_コード),
	すべて英数コード(R).

英数コード(Code) :- Code >=48,Code =< 57,!.
英数コード(Code) :- Code >=65,Code =< 90,!.
英数コード(Code) :- Code >=97,Code =< 122,!.

%  "A"にはマッチするけど"ABC"にはマッチしない正規表現お願いします 
% 
% 

'"A"にはマッチするけど"ABC"にはマッチしない'(_文字列,S0,'A',S1) :-
	sub_atom(_文字列,St,Len,R1,'A'),
	\+(sub_atom(_文字列,St,3,R2,'ABC')),
	sub_atom(_文字列,0,St,_,S0),
	St2 is St + Len,
	sub_atom(_文字列,St2,R2,0,S1).

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

'"A"にはマッチするけど"ABC"にはマッチしない'(_文字列,S0,S,S1) :-
	atom_chars(_文字列,Chars),
	'"A"にはマッチするけど"A","B","C"にはマッチしない'(Chars,L0,L,L1),
	concat_atom(L,S),
	concat_atom(L0,S0),
	concat_atom(L1,S1).

'"A"にはマッチするけど"A","B","C"にはマッチしない'(Chars,L0,['A'],L1) :-
	append(L0,['A'],L1,Chars),
	\+(append(L0,['A','B','C'],_,Chars)).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  特定の文字だけで構成される行 にマッチする正規表現をお願いします。 
%   
%  あああああああ 
%  wwwwwwwwwww 
%  HHHHHHHHHHHHH 
%   
%  のような行です。 
% 
% 

'特定の文字だけで構成される行にマッチする'([_行|_],_行)  :-
	atom_chars(_行,Chars),
	all(Chars,_).
'特定の文字だけで構成される行にマッチする'([_|R],_行)  :-
	'特定の文字だけで構成される行にマッチする'(R,_行).

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

'特定の文字だけで構成される行にマッチする'(_文字列,_行) :-
	atom(_文字列),
	atom_chars(_文字列,_文字ならび),
	'特定の文字だけで構成される行にマッチする'(_文字ならび,_行).
'特定の文字だけで構成される行にマッチする'(_文字ならび,_行)  :-
	append(L0,['\n'|R],_文字ならび),
	all(L0,A),
	\+(A='\n'),
	concat_atom(L0,_行).
'特定の文字だけで構成される行にマッチする'(_文字ならび,_行)  :-
	append(L0,['\n'|R],_文字ならび),
	all(L0,A),
	\+(A='\n'),
	'特定の文字だけで構成される行にマッチする'(R,_行).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  【】で囲まれた任意の同一文字列(文字数可変)が2回続いた場合にマッチする正規表現をお願いします 
%   
%  【AAA】【AAA】はマッチ 
%  【AAA】【BBB】はマッチしない 
%   
%  という感じです 
% 
% 

'【】で囲まれた任意の同一文字列(文字数可変)が2回続いた場合にマッチする'(_対象文字列,_照合部分より前の文字列,_照合部分文字列,_残り文字列) :-
	atom_chars(_対象文字列,Chars),
	照合基本部分(L,L0,L1,L2),
	append(L1,R,L2),
	append(L1,L1,L11),
	atom_chars(_照合部分より前の文字列,L0),
	atom_chars(_照合部分文字列,L11),
	atom_chars(_残り文字列,R).

照合基本部分(L,L0,L1,L2) :-
	append(L0,['【'|L10],['】'|L2],L),
	all(L10,A),
	append(['【'|L10],['】'],L1).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   
%  .replace(/^(http:\/\/farm1\.static\.flickr\.com\/[^/]+\/\w+_\w+_)m(\.\w+)$/, "$1o$2") 
%   
%  ↑ 
%  のスクリプトを改変したいのですが、 
%  以下の場合の正規表現をそれぞれ教えてください  
% 
%  ( 1 ) 
%  http://ime.nu/img.pics.livedoor.com/*/*/*/*-*.jpg 
%  ↓ 「*-*.jpg」を「*-1024.jpg」に変える 
%  http://ime.nu/img.pics.livedoor.com/*/*/*/*-1024.jpg 
%   
%  ※こういうURL置換させることを目指してます  
%  http://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-M.jpg 
%  ↓ 
%  http://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-1024.jpg 
%   
%   
%  ( 2 ) 
%  http://ime.nu/*.photobucket.com/*/*/*/th_*.jpg 
%  ↓ 「th_」を削除 
%  http://ime.nu/*.photobucket.com/*/*/*/*.jpg 
%   
%  ※こういうURL置換させることを目指してます  
%  http://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/th_alex1a.jpg 
%  ↓ 
%  http://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/alex1a.jpg 
%   
%   
%  ( 3 ) 
%  http://ime.nu/*.content.foto.mail.ru/*/*/*/*-*.jpg 
%  ↓ 「*-*.jpg」を「i-*.jpg」に変える 
%  http://ime.nu/*.content.foto.mail.ru/*/*/*/i-*.jpg 
%   
%  ※こういうURL置換させることを目指してます  
%  http://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/p-5879.jpg 
%  ↓ 
%  http://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/i-5879.jpg 
% 
% 

'例えば、http://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-M.jpgをhttp://ime.nu/img.pics.livedoor.com/009/0/b/0b3b287d7e66fff3ec46-1024.jpg に変えたい'(URL1,URL2) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['.jpeg'],[A,B]),
       append(L1,[A,'-1024',B],L2),
       concat_atom(L2,URL2).

'例えば、http://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/th_alex1a.jpgをhttp://ime.nu/i784.photobucket.com/albums/yy125/Pusgin/alex1a.jpg に変えたい'(URL1,URL2) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['.jpeg'],[A,B]),
       append(L1,[alex1a,B],L2),
       concat_atom(L2,URL2).

'例えば、http://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/p-5879.jpgをhttp://ime.nu/img3.content.foto.mail.ru/mail/semins/3294/i-5879.jpg に変えたい'(URL1,URL2) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['-'],[A,'-',B]),
       append(L1,[i,'-',B],L2),
       concat_atom(L2,URL2).

'例えば、http://c3.ac-images.myspacecdn.com/images02/80/m_22e6adfa8f2b4dafbf00b28a78e9db6e.jpgをhttp://c3.ac-images.myspacecdn.com/images02/80/l_22e6adfa8f2b4dafbf00b28a78e9db6e.jpg に変えたい'(UR1,URW) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['_'],[A,'_',B]),
       append(L1,[i,'_',B],L2),
       concat_atom(L2,URL2).

'例えば、http://sphotos.ak.fbcdn.net/hphotos-ak-snc1/hs137.snc1/5852_132531839605_775304605_3072465_7463459_s.jpgをhttp://sphotos.ak.fbcdn.net/hphotos-ak-snc1/hs137.snc1/5852_132531839605_775304605_3072465_7463459_n.jpg に変えたい'(URL1,URL2) :-
       sPLIT(URL1,['/'],L),
       append(L1,[File],L),
       sPLIT(File,['_','.jpeg'],L),
       append(L1,[_,'.jpeg'],L),
       append(L1,[n,'.jpeg'],L2),
       concat_atom(L2,URL2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  A=01 
%  A=02 
%  A=abc01 
%  A=_abc_02 
%  A=01_02_abc 
%   
%  これで、A=01 や A=02 だけにマッチさせる記述を教えてください 
%  A=(?!abc|_abc)\w+ 
%  ではA=01_02_abcまでマッチしてしまいます 
%  A=(?!abc|_abc)\w+(?!_abc) でも A=(?!abc|_abc)\w+(?!_abc)$ でもダメでした 
%  よろしくお願いします 
% 

'A=01\\nA=02\\nA=abc01\\nA=_abc_02\\nA=01_02_abc\\n これで、A=01 や A=02 だけにマッチさせる'(A,'','01','') :-
	sub_atom(A,0,_,0,'01'),!.
'A=01\\nA=02\\nA=abc01\\nA=_abc_02\\nA=01_02_abc\\n これで、A=01 や A=02 だけにマッチさせる'(A,'','02','') :-
	sub_atom(A,0,_,0,'02'),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  test.abc.ne.jp 
%  test.abcdef.ne.jp 
%  test.ztv.ne.jp 
%   
%  「test.abc.ne.jpは除外」というルールを 
%  ^test\.[^abc]+\.ne\.jp$ 
%  と書いたのですが、test.abcdef.ne.jpも除外されてしまいます 
%   
%  ^test\.(?!abc(?!def))\w+\.ne\.jp$ 
%  と書けばいいのですが、(?!)は環境により使えません 
%  (?!)を使わず、「test.abc.ne.jpを除外し、test.abcdef.ne.jpは除外しない」というルールを教えていただきたいです。よろしくお願いします 
% 
% 
% abcとneの間にdefだけは入ることができない場合

除外文字列(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c|L1],['.',n,e,'.',j,p|_],Chars),
	\+(L1 = [d,e,f]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% abcとneの間には何も入ることができない

除外文字列(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c'.',n,e,'.',j,p|_],Chars).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  test.abc.ne.jp 
%  test.abcdef.ne.jp 
%  test.ztv.ne.jp 
%   
%  「test.abc.ne.jpは除外」というルールを 
%  ^test\.[^abc]+\.ne\.jp$ 
%  と書いたのですが、test.abcdef.ne.jpも除外されてしまいます 
%   
%  ^test\.(?!abc(?!def))\w+\.ne\.jp$ 
%  と書けばいいのですが、(?!)は環境により使えません 
%  (?!)を使わず、「test.abc.ne.jpを除外し、test.abcdef.ne.jpは除外しない」というルールを教えていただきたいです。よろしくお願いします 
% 
% 

'test.abcと.ne.jpの間にdefだけは入ることができない'(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c|L1],['.',n,e,'.',j,p|_],Chars),
	\+(L1 = [d,e,f]).

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

'test.abcと.ne.jpの間には何も入ることができない'(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c'.',n,e,'.',j,p|_],Chars).

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

'test.abcと.ne.jpの間には何も入ることができない'(_文字列) :-
	atom_chars(_文字列,Chars),
	append(_,[t,e,s,t,'.',a,b,c|L1],['.',n,e,'.',j,p|_],Chars),
	L1 = [].

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Flexible Renamerというソフトで音楽ファイル名の検索&一括置換したいのですが、 
%   
%  対象: aaa_bbb_01ccc.mp3 
%  ↓ 
%  結果: aaa_bbb_01_ccc.mp3 
%   
%  "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい、ということです。 
%   
%  よろしくおねがいします。 
% 
% sub_atom/10 は http://nojiriko.asai/prolog/t264_u.html を参照

'対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_区切り直された名前) :-
	split(_名前,['_'],[_項1,_項2,_項3]),
	sub_atom(_項3,_検索位置,1,_残り文字数,H,A,T,_,_,_),
	\+((A@>='0',A@=<'9')),
	concat_atom([_項1,'_',_項2,'_',H,'_',A,T],_区切り直された名前),!.
'対象:aaa_bbb_01ccc.mp3 -> 結果:aaa_bbb_01_ccc.mp3 "_"区切りの三番目の2桁数字部分が区切られていないヤツを(選び)全て結果のように区切りたい'(_名前,_名前).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  サクラエディタで、改行部分を連番+改行に置き換えたいのですけど、連番に変換するには
%  どうしたらよろしいでしょうか? 
%   
%  文字列1 
%  文字列2 
%   
%  を 
%  1 
%  文字列1 
%  2 
%  文字列2 
%   
%  といったかんじです。 
%   

'改行部分を連番+改行に置き換える'(_ファイル) :-
	get_lines(_ファイル,Lines),
	open(_ファイル,write,Outstream),
	append(L0,[Line|R],Lines),
	length([_|L0],N),
	write_formatted(Outstream,'%t\n%t\n',[N,Line]),
	R = [],
	close(Outstream).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  ●正規表現の使用環境 
%  Devas(ディレクトリ内の再帰検索及び置換ソフトでGrep互換) 
%   
%  ●検索か置換か? 
%  検索と置換 
%   
%  ●説明 
%  HTMLのaタグにonclick属性を追加,または追記したい 
%   
%  ●対象データ 
%  数百のSmartyテンプレート 
%  (HTMLやフレームワークのコードを含む文字列) 
%  単純に<a hrefで始まるものばかりではなく,<a class等で始まるものもある 
%   
%  ●希望する結果 
%  htmlのaタグから 
%  href="xxxxx-regist"を含んでおり, 
%  かつonclick="xxx"含んでいる または 含んでいないものを検索,置換し 
%  onclickにアクションを追加または追記 
%   
%  <a href="xxx-regist" onclick="追加または追記したい"> 
%   
%   
%   
%  対象ページが数百もあり,とても手作業で修正できないため正規表現の力を借りたいです 
%  aタグはすぐにhrefで始まるものばかりではないため,以下のような正規表現を考えたのですが, 
%  なぜか複数行に渡ってしまう結果が抽出されたりとうまくいきません 
%   
%  href=".+\-regist".+?(onclick="(.+)")?.+?\n 
%   
%   
%  ご教授いただけないでしょうか・・ 
% 
% 

数百のSmartyテンプレートのonclickタグを追加または変更する(_ファイル名ならび) :-
	append(_,[_ファイル|R],_ファイル名ならび),
	'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル),
	R = [],!.        

'htmlのaタグからhref="xxxxx-regist"を含んでおり,かつonclick="xxx"含んでいる。または含んでいないものを検索,置換しonclickにアクションを追加または追記'(_ファイル) :-
	get_chars(_ファイル,Chars),
	'onclickにアクションを追加または追記'(Chars),!.

'onclickにアクションを追加または追記'(Chars) :-
	'aタグを選別'(Chars,L0,R1,R2,_Atag),
	'onclick要素候補'(_Atag,_onclick要素候補),
	'onclick句の生成'(_onclick要素候補,_onclick句),
	put_chars(L0),
	'現在のonclick句の削除'(R1,R11),
	append(R11,_onclick句,R12),
	put_chars(['<',a,' '|R12]),
	put_chars(['<','/',a,'>']),
	'onclickにアクションを追加または追記'(R2).

'aタグを選別'(Chars,L0,R1,R2,_Atag) :-
	append(L0,['<',a,' '|R1],['<','/',a,'>'|R2],Chars),
	\+(append(_,['<','a',' '|_],R1)),
	\+(append(_,['<','/',a,'>'|_],R1)),
	_Atag = ['<',a',' '|R1].

'onclick要素候補'(_Atag,_onclick要素候補) :-
	append(L0,[h,r,e,f,'=','"'|_onclick要素候補],['-',r,e,g,i,s,t,'"'|R2],_Atag),!.

'onclick句の生成'(_onclick要素候補,_onclick句) :-
	append([' ',o,n,c,l,i,c,k,'=','"'|_onclick要素候補],['"',' '],_onclick句).

'現在のonclick句の削除'([],[]) :- !.
'現在のonclick句の削除'([' ',o,n,c,l,i,c,k,'=','"'|R1],[' '|R2]) :-
	append(_,['"',' '|R2],R1),!.
'現在のonclick句の削除'([A|R1],[A|R2]) :-
	'現在のonclick句の削除'(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  撮影した写真に付けた名前を一括変更しようと思い、 
%  正規表現を扱えるFlexible Renamerを用いて色々と試しているのですが、いまいち行いたいことが出来ません。 
%  ファイルに付いている一定の法則でついている共通したタグを、ファイル名の末尾に"移動"させたいのです。 
%  例: [2010-12-13] [IN] AABBCC.nef -> [IN] AABBCC [2010-12-13].nef 
%  検索では \[20..-..-..] と打つことで指定することができたのですが、移動の仕方が検索しても見つかりません… 
%   
%  正規表現では"移動"を行うことは出来ないのでしょうか? 
%  どうかご教示お願いします! 
% 

'ファイル名に付いている一定の法則でついている共通したタグを、ファイル名の末尾に"移動"させたい'(_ファイル名,_タグを末尾に移動したファイル名) :-
	sPLIT(_ファイル名,['[',']','.','-'],L),
	append(L0,['[',A,-,B,-,C,']'|R],L),
	sub_atom(A,0,2,_,'20'),
	append(R0,['.'|R1],R),
	append(L0,['[',A,-,B,-,C,']'|R0],[.|R1],L),
	concat_atom(L,_タグを末尾に移動したファイル名),!.

%  2回以上続く改行だけ検索したいのですが、どうやっても1回のみの改行も検索してしまいます。 
%  \r\nを2回ってだけではだめなようで、解決策はありますか? 
% 
% 

'2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :-
	atom_chars(_文字列,Chars),
	append(L0,['\n'|R],Chars),
	append(L1,R1,R),
	\+(R1=['\n'|_]),
	all(L1,'\n'),
	concat_atom(L0,_検索語より前の文字列),
	concat_atom(L1,_検索語),
	concat_atom(R1,_検索語より後の文字列).
'2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :-
	atom_chars(_文字列,Chars),
	append(L0,['\n'|R],Chars),
	append(L1,R1,R),
	\+(R1=['\n'|_]),
	all(L1,'\n'),
	concat_atom(L0,_),
	concat_atom(L1,_),
	concat_atom(R1,_検索語より後の文字列_1),
	'2回以上続く改行だけ検索したい'(_検索語より後の文字列_1,_検索語より前の文字列,_検索語,_検索語より後の文字列).

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

'2回以上続く改行だけ検索したい'(Lines,L0,[A|L1],R) :-
	append(L00,L1,R,Lines),
	all(L1,''),
	\+(R=[''|_]),
	append(L0,[A],L00).
'2回以上続く改行だけ検索したい'(Lines,L0,L1,L2) :-
	append(L00_1,L1_1,R_1,Lines),
	all(L1_1,''),
	\+(R_1=[''|_]),
	append(L0_1,[Line],L00_1),
	'2回以上続く改行だけ検索したい'(R,L0,L1,L2).

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

'2回以上続く改行だけ検索したい'(Chars,L0,['\n','\n'],R) :-
	append(L0,L1,L2,Chars),
	\+(last(L0,'\n')),
	\+(list_nth(1,L2,'\n')).
'2回以上続く改行だけ検索したい'(Chars,L0,L1,L2) :-
	append(L00,L11,L22,Chars),
	all(L11,'\n'),
	\+(last(L00,'\n')),
	\+(list_nth(1,L22,'\n')),
	'2回以上続く改行だけ検索したい'(L22,L0,L1,L2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  すみません、後ひとつ聞きたいんですが 
%   
%  2桁以上の整数を、すべて+1する置き換えかたはありますか? 
%  5 
%  50 
%  100 
%  134 
%  1295 
%  ↓ 
%  5 
%  51 
%  101 
%  135 
%  1296 
%  って感じです 
%  よろしくお願いします。 
% 
% 

f(X,Y) :- X > 10,Y is X + 1,!.
f(X,X).

'2桁以上の整数を、すべて+1する置き換え'(_文字列,_置き換えられた文字列) :-
	文字列の中の数値列を選別して関数を適用する(_文字列,_置き換えられた文字列).

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

文字列の中の数値列を選別して関数を適用する(_文字列,_適用後の文字列) :-
	sPLIT(_文字列,['0','1','2','3','4','5','6','7','8','9'],L1),
	一文字の数字または数字ならびを数値にまとめる(L1,L2),
	数値要素のみに関数を適用(L2,L3),
	concat_atom(L3,_適用後の文字列).

一文字の数字または数字ならびを数値にまとめる([],[]) :- !.
一文字の数字または数字ならびを数値にまとめる(L1,[_数値|R2]) :-
	数字以外に出会うまで(L1,_数値,R),
	一文字の数字または数字ならびを数値にまとめる(R1,R2),!.
一文字の数字または数字ならびを数値にまとめる([A|R1],[A|R2]) :-
	一文字の数字または数字ならびを数値にまとめる(R1,R2).

数字以外に出会うまで(L1,_数値,R) :-
	append(L0,[A|_],L1),
	\+(append(_,[A|_],['0','1','2','3','4','5','6','7','8','9'])),
	concat_atom(L0,_数値アトム),
	atom_to_term(_数値アトム,_数値,_),!.
数字以外に出会うまで(L1,L1,[]).

数値要素のみに関数を適用([],[]) :- !.
数値要素のみに関数を適用([A|R1],[B|R2]) :-
	number(A),
	f(A,B),
	数値要素のみに関数を適用(R1,R2),!.
数値要素のみに関数を適用([A|R1],[A|R2]) :-
	\+(number(A)),
	数値要素のみに関数を適用(R1,R2).

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

numbers(['0','1','2','3','4','5','6','7','8','9']).

'2桁以上の整数を、すべて+1する置き換え'(_文字列,_置き換えられた文字列) :-
	numbers(Numbers),
	'sPLIT'(_文字列,Numbers,L1),
	'2桁以上の整数を、すべて+1する置き換え'(L1,Numbers,L2),
	concat_atom(L2,_置き換えられた文字列).

'2桁以上の整数を、すべて+1する置き換え'([A|R1],Numbers,[A|R2]) :-
	\+(member(A,Numbers)),
	'2桁以上の整数を、すべて+1する置き換え'(R1,Numbers,R2).
'2桁以上の整数を、すべて+1する置き換え'(L1,Numbers,[S|R3]) :-
	'数値文字ならびの切り取り'(L1,Numbers,L4,R),
	concat_atom(L4,A),
	atom_to_term(A,N),
	N2 is N + 1,
	write_formatted_atom(S,'%02d',[N2]),
	'2桁以上の整数を、すべて+1する置き換え'(R,Numbers,R3).

数値文字ならびの切り取り([],Numbers,[],[]) :- !.
数値文字ならびの切り取り([A|R],Numbers,[],[A|R]) :- \+(member(A,Numbers)),!.
数値文字ならびの切り取り([A|R1],Numbers,[A|R2],R3) :-
	数値文字ならびの切り取り(R1,Numbers,R2,R3).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境  
%  PHP5 
%   
%  ●検索か置換か?  
%  検索  
%   
%  ●説明  
%  [[ と ]] に囲まれた文字列を配列で取得したい  
%   
%  ●対象データ  
%  [[hare]][[ame]][[kumori]][[yuki]][[]][[kaminari]][[taifuu]] 
%   
%  ●希望する結果  
%  matches[0] = hare 
%  matches[1] = ame 
%  matches[2] = kumori 
%  matches[3] = yuki 
%  matches[4] = 
%  matches[5] = kaminari 
%  matches[6] = taifuu 
%   
%  よろしくお願いします。 
% 

'[[ と ]] に囲まれた文字列をならびとして取得したい'(_文字列,L) :-
	atom_chars(_文字列,Chars),
	'文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,L).

'文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(Chars,[_文字列1|R]) :-
	append(L0,['[','['|R1],[']',']'|R2],Chars),
	concat_atom(R1,_文字列1),
	'文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(R2,R),!.
'文字ならびから[[ と ]] に囲まれた文字列をならびとして取得したい'(_,[]) :- !.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●環境 
%  vb.net 
%   
%  ●したいこと 
%  3文字以上の繰り返し表現を抽出 
%   
%  ●サンプル 
%  例文1)死にたい死にたい死にたい死にたい死にたい 
%  結果1)死にたい 
%   
%  ●したいこと 
%  2箇所以上出現する3文字以上の文字列
%   
%  例文2)筋肉バスターと阿修羅バスター 
%  結果2)バスター 
%   
%   
%  ってのを正規表現でやるのは無理でしょうか・・・ 
% 

'重複しない3文字以上の繰り返し表現を抽出'(_文字列,_重複しない3文字以上の繰り返し表現ならび) :-
	findsetof(_3文字以上の繰り返し表現,(
		    '3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現),
		  _重複しない3文字以上の繰り返し表現ならび).

'3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現) :-
	sub_atom(_文字列,_開始点,_長さ,_残り長さ,[_3文字以上の繰り返し表現|R]),
	_長さ >= 3,
	_開始点2 is _開始点 + _長さ,
	sub_atom(_文字列,_開始点2,_長さ,_残り長さ2,_3文字以上の繰り返し表現).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  .net Framework 2.0 - 3.5 (C#) 
%   
%  ●検索か置換か? 
%  検索 
%   
%  ●説明 
%  artist, titleの各グループの文字列を取得したい 
%   
%  ●対象データ 
%  Artist - Title 
%   
%  ●希望する結果 
%  artist = Artist 
%  title = Title 
%   
%  よろしくおねがいします。 
% 

'artist, titleの各グループの文字列を取得したい'(_対象データ,_希望する結果) :-
	split(_対象データ,[' '],L),
	'artist, titleの切り出し'(L,Artist,Title),
	write_formatted_atom(_希望する結果,'artist = %t\ntitle = %t',[Artist,Title]). 

'artist, titleの切り出し'([Artist,Title],Artist,Title) :- !.
'artist, titleの切り出し'([Artist,_,Title|_],Artist,Title) :- !.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  秀丸 8.0.2 b5 
%   
%  ●検索か置換か? 
%  検索 
%   
%  ●説明 
%  条件にマッチする行を指定数だけ抽出する 
%   
%  ●対象データ 
%  a hogehoge1 
%  b hogehoge2 
%  c hogehoge3 
%  a hogehoge4 
%  a hogehoge5 
%  c hogehoge6 
%  a hogehoge7 
%  b hogehoge8 
%   
%  ●希望する結果 
%  "a " で始まる行を 3 つだけ表示させる 
%  a hogehoge1 
%  a hogehoge4 
%  a hogehoge5 
%   
%  宜しくお願いします。 
% 
%
%  3つだけと言う場合、3つ未満だった時どうするか。failにするなら2引数の方の第一節を削除する。
%

'"a " で始まる行を 3 つだけ表示させる'(Lines) :-
       '"a " で始まる行を 3 つだけ表示させる'([_,_,_],Lines).

'"a " で始まる行を 3 つだけ表示させる'(_,[]) :- !.
'"a " で始まる行を 3 つだけ表示させる'([],_) :- !.
'"a " で始まる行を 3 つだけ表示させる'([_|Ln],[Line|R]) :-
	sub_atom(Line,0,_,_,'a '),
	write_fromatted('%t\n',[Line]),
	'"a " で始まる行を 3 つだけ表示させる'(Ln,R),!.
'"a " で始まる行を 3 つだけ表示させる'(Ln,[_|R]) :-
	'"a " で始まる行を 3 つだけ表示させる'(Ln,R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  使用言語はjavascript。 
%  独自のタグ(<A#...#A>)が設定されたテキスト行から、このタグを取り除きたい。 
%  テキスト行中にタグが複数出てくることもあり。 
%   
%  置換前 : あいうえお <A#かきくけこ#A> さしすせそ <A#たちつてと#A> なにぬねの 
%   
%  置換後 : あいうえお  さしすせそ  なにぬねの 
%   
%   
%  どうやったらいいですかあああああボスケテーーー!!! 
% 

'独自のタグ(<A#...#A>)が設定されたテキスト行から、このタグを取り除きたい。'(_文字列,_独自のタグを取り除いた文字列) :-
	atom_chars(_文字列,Chars),
	append(L0,['<','A','#'|R1],['#','A','>'|R2],Chars),
	append(L0,R2,L2),
	concat_atom(L2,_独自のタグを取り除いた文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  .net(C#3.0) 
%   
%  ●検索か置換か? 
%  検索 
%   
%  ●説明 
%  空白をデリミタとして、最初の文字列を取得したい 
%  空白は半角全角両方あり、複数連続することもあり得る 
%  ただし、()や[]で囲まれる文字列はスルー(空白として処理する) 
%  正規表現一発で抜き出したいです 
%   
%  下記例の各行は全て「山田太郎」だけ抽出されるようにしたいです 
%   
%  山田太郎 39才 
%   山田太郎 39才 
%  (A社) 山田太郎 39才 
%  (A社)山田太郎  39才 
%  (A社 B課)山田太郎 39才 
%  山田太郎(A社)39才 

'空白をデリミタとして、最初の文字列を取得したい。空白は半角全角両方あり、複数連続することもあり得るただし、()や[]で囲まれる文字列はスルー(空白として処理する)'(_文字列,_最初の文字列) :-
	split(_文字列,[' ',' ','(',')','[',']'],L1),
	'空白をデリミタとして、最初の文字列を取得したい。'(L1,_最初の文字列).


'空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :-
	'()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2),
	'空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!.
'空白をデリミタとして、最初の文字列を取得したい。'(L1,Atom) :-
	空白は半角全角両方あり、複数連続することもあり得る(L1,L2),
	'空白をデリミタとして、最初の文字列を取得したい。'(L2,Atom),!.
'空白をデリミタとして、最初の文字列を取得したい。'([A|_],Atom).

'()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :-
	append(L0,['('|R1],[')'|R2],L1),
	append(L0,[' '|R2],L2),!.
'()や[]で囲まれる文字列はスルー(空白として処理する)'(L1,L2) :-
	append(L0,['['|R1],[']'|R2],L1),
	append(L0,[' '|R2],L2),!.

空白は半角全角両方あり、複数連続することもあり得る([],[]) :- !.
空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :-
	空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!.
空白は半角全角両方あり、複数連続することもあり得る([' '|R1],R2) :-
	空白は半角全角両方あり、複数連続することもあり得る(R1,R2),!.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  ABCと続く場合を除くABという文字列を指定したい場合は
%  どのように書いたらよいでしょうか・・・ 

'ABCと続く場合を除くABという文字列'(_文字列,_前文字列,'AB',_後文字列) :-
	sub_atom(_文字列,S,2,R,'AB'),
	\+(sub_atom(_文字列,S+2,1,_,'C')),
	sub_atom(_文字列,0,S,_,_前文字列),
	sub_atom(_文字列,S+2,R,0,_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  /tatakanamk/ 
%  と言う文字列があって/から/までの検出をするにはどう書けばよいでしょうか? 
%  /と/も含めて12文字を検出したいのです。 
%  超初歩的ですがよろしくお願いします。 
% 
% 
% http://nojiriko.asia/prolog/t264_u.html

'/tatakanamk/ と言う文字列があって/から/までの検出をする'(_文字列,_前文字列,'/tatakanamk/',_後文字列) :-
	sub_atom(_文字列,0,12,_,_前文字列,'/tatakanamk/',_後文字列,_,_,_).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  <html> 
%  <head> 
%  <title>テスト</title> 
%  </head> 
%  <body> 
%  <!-- ここから --> 
%  あああああああああああ<br /> 
%  あああああああああああ<br /> 
%  あああああああああああ<br /> 
%  あああああああああああ<br /> 
%  あああああああああああ 
%  <!-- ここまで --> 
%  </body> 
%  </html> 
%   
%  このようなhtmlをPHP5のfile_get_contentsで読み込んで 
%  <!-- ここから -->〜<!-- ここまで -->を取得したいのですが 
%  どうすれば良いですか? 
%   
%  "/<!-- ここから -->(.*)<!-- ここまで -->/" 
%  で読めませんでした 
% 
% 

'このようなhtmlをPHP5のfile_get_contentsで読み込んで<!-- ここから -->〜<!-- ここまで -->を取得したい'(_html,_ここから_ここまで) :-
	get_chars(_html,Chars),
	append(_,[<,!,-,-,' ',こ,こ,か,ら,' ',-,-,>]|R1],[<,!,-,-,' ',こ,こ,ま,で,' ',-,-,>]|R2],Chars),
	concat_atom(R1,_ここから_ここまで).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  php5です。ファイルのフルパスをディレクトリ,ファイル名,拡張子に分割してその配列を返したくてこう書きました。 
%   
%  $pattern1 = '`^(.*)(?:[/\\\](.*)){1}$`'; 
%  preg_match($pattern1, $fullpath, $match1); 
%  $pos = strpos($match1[2], '.'); 
%  if($pos === false){ 
%      return array($match1[1], $match1[2]); 
%  }else{ 
%      $pattern2='`^(.*?)\.(.*)$`'; 
%      preg_match($pattern2, $match1[2], $match2); 
%      return array($match1[1], $match2[1], $match2[2]); 
%  } 
%   
%  必ず拡張子があるなら一度のpreg_matchでキャプチャ出来たのですが 
%  拡張子無しファイル混じりだった場合の正規表現がうまく思いつかずに二段階(三段階?)になってしまいました 
%  でもpreg_matchやってその中で'.'探して、あったらさらにpreg_matchというのはまわりくどいように思います 
%   
%  この処理を一度にこなす正規表現の考え方のヒントをください 
% 
% 

'ファイルのフルパスをディレクトリ,ファイル名,拡張子に分割'(_ファイル名,_ディレクトリ,_ファイル名,_拡張子) :-
	sPLIT(_ファイル名,['/','.'],L),
	append(L0,[_ファイル,'.',_拡張子],L),
	concat_atom(L0,_ディレクトリ),!.
'ファイルのフルパスをディレクトリ,ファイル名,拡張子に分割'(_ファイル名,_ディレクトリ,_ファイル名,'').
	sPLIT(_ファイル名,['/','.'],L),
	append(L0,[_ファイル],L),
	concat_atom(L0,_ディレクトリ),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  php4.3.11です 
%  --------------------------------- 
%  $str = <<< DOC_END 
%  あああああ 
%  いいいいい 
%  <html_start> 
%  ううううう 
%  えええええ 
%  <html_end> 
%  おおおおお 
%  DOC_END; 
%   
%  $pattern = "/<html_start>(.*)<html_end>/"; 
%  $replacement = 'aaaabbbb'; 
%   
%  $res = preg_replace($pattern, $replacement, $str); 
%  print_r($res); 
%  --------------------------------- 
%  と出力してみましたが何も表示されませんでした。 
%  ホントは「あああああいいいいいaaaabbbbおおおおお」と出て欲しかったのですが…。 
%  最終的には<html_start><html_end>で囲まれた範囲に 
%  PHPのhtmlspecialchars()やnl2br()関数を適用して出力したいです。 
% 

'あああああ\nいいいいい\n\nううううう\nえええええ\n\n\nおおおおお\n を あああああいいいいいaaaabbbbおおおおお に置換する'(_置換された文字列) :-
	split(''あああああ\nいいいいい\n\nううううう\nえええええ\n\n\nおおおおお\n',['\n'],L),
	append(L0,[''|R1],[''|R2],L),
	append(L0,[aaaabbb|R2],L2),
	concat_atom(L2,_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  IPを正規表現でチェックしたいのですが 
%  210.000.111.1〜210.000.111.255 
%  215.100.000.1〜215.100.000.255 
%  の2つに当てはまる場合、TRUE(int1)をかえすにはどうすればいいでしょうか? 
%  以下のようにやってみたのですが他のIPでもint(1)がかえってきます。 
%   
%  preg_match('/^210\.000\.111\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ || ^215\.100\.000\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $_SERVER['REMOTE_ADDR']) 
%   
% 

'IPが210.000.111.1〜210.000.111.255 か 215.100.000.1〜215.100.000.255 の範囲にある'(IP) :-
	split(IP,['.'],[210,0,111,D]),
	D >= 1,
	D =< 255,!.
'IPが210.000.111.1〜210.000.111.255 か 215.100.000.1〜215.100.000.255 の範囲にある'(IP) :-
	split(IP,['.'],[215,100,0,D]),
	D >= 1,
	D =< 255,!.

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

'IPがある範囲にあるか'(IPの文字列表現,IPの範囲表現) :-
	split(IPの文字列表現,[U1,U2,U3,U4]),
	split(IPの範囲表現,['~'],[IP1,IP2]),
	split(IP1,['.'],[A1,A2,A3,A4]),
	split(IP2,['.'],[B1,B2,B3,B4]),
	U1 >= A1,U1 =< B1,
	U2 >= A2,U2 =< B2,
	U3 >= A3,U3 =< B3,
	U4 >= A4,U4 =< B4,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  VB.NETで正規表現を書いています。 
%  条件としては、「A0123」のように、先頭がアルファベットのAでその他が数字4桁という正規表現と、 
%  「01234」のような数字5桁という二種類のどちらかにマッチする正規表現を作っています。 
%  正規表現は苦手で困っています。 
%  どなたかご教授下さい。 
%  よろしくお願いします。 
% 

'「A0123」のように、先頭がアルファベットのAでその他が数字4桁か「01234」のような数字5桁という二種類のどちらか'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,St,5,R,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
	L2=['A'|R1]),
	すべてが数字(R2).        
'「A0123」のように、先頭がアルファベットのAでその他が数字4桁か「01234」のような数字5桁という二種類のどちらか'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,St,5,R,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
	すべてが数字(L2).

すべてが数字([]) :- !.
すべてが数字([A|R]) :-
	append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']),
	すべてが数字(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%        <TD width="52" height="25" bordercolor="#CCCCCC" valign="middle">  
%          <div align="center">F8FA</div> 
%        </TD> 
%   
%  これの 
%   
%  「F8FA」の部分をpreg_match_all取得したいのですが、 
%  '/<TD .*><div .*>(.*)</div><\/TD>/Ums' 
%   
%  としたのですが、何も取得されません。 
%  どのように表記すれば良いのでしょうか? 
% 

'TDタグの中のdivタグの値'(_文字列,_前文字列,_タグの値,_後文字列) :-
	sPLIT(_文字列,['','','',''|R2],L),
	append(L02,[''|R22],R2),
	append(L03,[''|R3],R22),
	append(L04,[''|R4],R3).
	concat_atom(L03,_タグの値),
	append(L01,[''|L02],L3),
	append(L3,[''],L4),
	concat_atom(L4,_前文字列),
	concat_atom([''|R3],_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  「あいうえおABC+F481ABC+F485かきくけこABC+F7A5さしすせそABC+F3F0ABC+F39EたちつてとABC+F65AなにぬねのABC+F485ABC+F7A5はひふへほABC+F7A5ABC+F39Eまみむめも」 
%   
%  上記の中に、「ABC+16進数x2回」がいくつ含まれているかをPHPの正規表現で表すにはどうかけばよろしいでしょうか? 
%  ご鞭撻よろしくお願いいたします。 
%   

'文字列の中に「ABC+16進数x2回」がいくつ含まれているか'(_文字列,_いくつ) :-
	atom_chars(_文字列,Chars),
	'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(Chars,[],Ln),
	length(Ln,_いくつ).

'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'([],Ln,Ln) :- !.
'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(['A','B','C','+',X1,X2,X3,X4|R1],Ln1,Ln) :-
	すべて16進数文字([X1,X2,X3,X4]),
	'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(Ln,R1,[_|Ln1]).
'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'([_|R1],Ln1,Ln) :-
	'ならびの中に「ABC+16進数x2回」がいくつ含まれているか'(R1,Ln1,Ln).

すべて16進数文字([]) :- !.
すべて16進数文字([A|R]) :-
	member(A,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']),
	すべて16進数文字(R).

先頭から16進数文字ならび([],[],[]) :- !.
先頭から16進数文字ならび([A|R1],[A|R2],R) :-
	member(A,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']),
	先頭から16進数文字ならび(R1,R2,R),!.
先頭から16進数文字ならび(L,[],L).

'16進数表示文字ならび'(['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  時間(13:00:00〜18:00:00)までを正規表現であらわしたいのですが、 
%   
%  1[3-8]:[0-5][0-9]:[0-5][0-9] 
%   
%  という感じに今なっています 
%  誰が見てもわかりやすいしこれでもいいのですが、もっと短い書き方はないものでしょうか? 
%   
%  [0-5][0-9]ここが反復なので、([0-5][0-9]:?){2}とか思いつくのですが、 
%  これだと最後にコロンが入っててもマッチしてしまうので回避できるような書き方はないものかなぁと。 
% 
% 

'コロン区切りの時分秒範囲の表現'(_時分秒文字列,_時下限,_分下限,_秒下限,_時上限,_分上限,_秒上限,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_時分秒文字列,_,_,_,_前文字列,_適合文字列,_後文字列,_,[A1,A2,:,B1,B2,:,C1,C2],_),
	最後が数字またはコロンではない(L1),
	先頭が数字またはコロンではない(L3),
	H is H1 * 10 + H2,
	M is M1 * 10 + M2,
	S is S1 * 10 + S2,
	[H,M,S] @>= [_時下限,_分下限,_秒下限],
	[H,M,S] @=< [_時上限,_分上限,_秒上限].

最後が数字またはコロンではない(L) :-
	last(L,A),
	append(_,[A|_],['0','1','2','3','4','5','6','7','8','9',':']),
	!,fail.
最後が数字またはコロンではない(_).

最初が数字またはコロンではない([A|_]) :-
	append(_,[A|_],['0','1','2','3','4','5','6','7','8','9',':']),
	!,fail.
最後が数字またはコロンではない(_).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  すみませんが、価格にマッチする正規表現を教えていただけないでしょうか。 
%   
%  例 
%  \1,000,000,000 
%  \12,345 
%  \1,230 
%  \200 
%  \10 
%   
%   
%  数字3つごとに、カンマが入り、先頭に円マーク(\)のくるものです。 
%   
%  判らないためググッたのですが、正規表現に関する本ばかり検索結果として出てきまして…。 
% 
% 

'価格にマッチする'(_文字列,_前文字列,_価格表現文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,_前文字列,_価格表現文字列,_後文字列,L1,['\\'|R2],L3),
	\+((L3=[A|_],append(_,[A|_],[',','0','1','2','3','4','5','6','7','8','9']))),
	カンマ付き数値ならび(R2).

カンマ付き数値ならび([]) :- !.
カンマ付き数値ならび(L) :-
	length(L,Len),
	Len =< 3,
	すべて数字(L),!.
カンマ付き数値ならび([A,B,C,','|R]) :-
	すべて数字([A,B,C]),
	カンマ付き数値ならび(R).
カンマ付き数値ならび([A,B,','|R]) :-
	すべて数字([A,B]),
	カンマ付き数値ならび(R).
カンマ付き数値ならび([A,','|R]) :-
	すべて数字([A]),
	カンマ付き数値ならび(R).

すべて数字([]) :- !.
すべて数字([A|R]) :-
	append(_[A|_],['0','1','2','3','4','5','6','7','8','9']),
	すべて数字(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  JavaScriptで下記のようなデータを取得したいです。 
%   
%  hogehoge[1]→1 
%  hogehoge[123]→123 
%  hogehoge[1243][]→1243 
%   
%  []の中身を取得したく、[]が2つあった場合は最初の[]の中身を取得します。 
%  (ただし、2個目の[]は常に空です。) 
%   
%  hogehogeは任意の文字列で、[]の中身は何桁か分からない数字の繰り返しです。 
%   
%  以上ご鞭撻の程お願いします。 
% 
% 

'[]の中身を取得したく、[]が2つあった場合は最初の[]の中身を取得します。'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	 sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[h,o,g,e,h,o,g,e,'['|R2],L3),
	 append(L0,[']'|R4],R2),
	 concat_atom(L0,_適合文字列),
	 concat_atom([S1,'hogehoge['],_前文字列),
	 concat_atom([']'|R4],S4),
	 concat_atom([S4|L3],_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ,"/web/sendmail.php","10","10","2000" 
%  こういう感じの文章の 
%  ,"2000" 
%  のみ抽出したいんですが、どう書けばいいんでしょうか? 
%   
%  ",".*[0-9]"$ 
%  だと"10","10","2000"まで拾っちゃうんです・・・。 
% 
% 

'"/web/sendmail.php","10","10","2000" こういう感じの文章の,"2000"のみ抽出したい'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	append(['"'|R1],['"'],L2),
	すべて数字(R1),
	length(R1,4),
	concat_atom(R1,_適合文字列),
	concat_atom([S1,'"'],_前文字列),
	concat_atom(['"',S3],_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  PHP 正規表現 
%   
%  PHPの正規表現を勉強しているのですが、どうもうまくいきません。今回は一番簡単な正規表現をつくったのですが、どうやったらよいのでしょうか。 
%   
%  $h = '(名前)様の会員IDは(abc12)で、(5)番目に偉い方です。'; 
%   
%  とあったら、名前、会員ID、番号を抜き出すには、どのようにしたらよいのでしょうか? 
%  実際に()は使用しません。 
%  また、$1 や $2 などを使いたいのですが、解説までできればお願いしたいです。 
%  一応自分なりに考えました。 
%  preg_match('/^*.([a-zA-Z0-9]){2}([0-9]+)','名前$2.ID$1 $3 番目に偉い'); 
%  ()を使えば、2つマッチさせたいときなどに分けることができるのでしょうか?  
%  (名前)様は(数字) 
%  例:太郎様は5 
%   
%  このとき太郎様という日本語の文字を取得するには/^(+.)([0-9])$/ 
%   
%  ここで名前は$1になり、数字は$2になるのでしょうか? 
%  どのような時に$1や$2がどっちがどっちなのかは、どのようにしたらわかるのでしょうか? 
%   
%   
%  長々した質問すいません。わかるかた教えてください。 
% 

'(名前)様の会員IDは(abc12)で、(5)番目に偉い方です。とあったら、名前、会員ID、番号を抜き出すには、どのようにしたらよいのでしょうか? 実際に()は使用しません。 '(_名前,_会員ID,_n番目) :-
	_文字列 = '名前様の会員IDはabc12で、5番目に偉い方です。',
	'名前、会員ID、番号を抜き出す'(_文字列,_名前,_会員ID,_n番目).

'名前、会員ID、番号を抜き出す'(_文字列,_名前,_会員ID,_n番目) :-
	split(_文字列,[様の会員IDは,'で、',番目に],[_名前,_会員ID,_n番目|_].

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させて下さい。 
%  PHP5を使っています。 
%  PHPの正規表現関数を使ってデータを取得しようと思っているのですが上手くいきません 
%  <INPUT maxLength=20 name=id value=""> 
%  このような文字列を対象に、文字列「type」が含まれていない場合、後方の「maxLength=20 name=id value=""」 
%  を取得したいのです。 
%  全文に対して繰り返し取得したいのでpreg_match_allを使っています。 
%   
%  preg_match_all( "/<input (^type)[^<](.*?)>/is", $data, $matchs ) 
%  このように書いたのですがヒットしてくれません。 
%  ドキュメントを見ると、特定文字に関しては[^a-z]のような書き方で対応できるのですが 
%  文字列に関してはどのようにすればよいのでしょうか? 
%  アドバイス頂ければ幸いです。 
%  宜しくお願い致します。 
% 
% 

'<INPUT maxLength=20 name=id value="">このような文字列を対象に、文字列「type」が含まれていない場合、後方の「maxLength=20 name=id value=""」を取得したい'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	  sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<','I','N','P','U','T',' '|R2],L3),
	  append(L,['>'],R2),
	  \+(append(_,['>'|_],L)),
	  \+(検索(S2,type)),
	  concat_atom(L,_適合文字列),
	  concat_atom([S1,''],R2),
	\+(append(_,['>'|_],R21)),
	'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(R2,L),
	concat_atom(L,_置換された文字列).

'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'([' ',/,>],[' ',/,>]) :- !.
'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(['>'],[' ',/,>]) :- !.
'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'([A|R1],[A|R2]) :-
	'html内のimgタグの記述部分をxhtmlにするために最後にスペースとスラッシュを付け加えたい'(R1,R2).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%  PHP5で使います 
%   
%  $numには、 
%   
%  +数字 
%  -数字 
%  数字 
%   
%  というようなパターンの時のみマッチさせたいです 
%  数字のところは 0〜999999999までの値が入ってきますが、0以外の時に頭に0がある場合0123とかは除外したいです 
%  試行錯誤して下記のようにしてみましたが、思った結果が得られません。エラー出まくりでなみだ目です 
%  どうかよろしくお願いします 
%   
%   
%  preg_match('/^(([^+]*)*(++[^-][^+]*)*)*?[^0-9]*$/',$num) 
% 

'+数字 -数字 数字 というようなパターンの時のみマッチさせたいです。数字のところは 0〜999999999までの値が入ってきますが、0以外の時に頭に0がある場合0123とかは除外したいです'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,_文字列,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
	適合診断(L2),
	\+((append(_,[A],L1),数字(A))),
	\+((L3 = [B|_],数字(B))).

適合診断([+|R]) :- すべて数字(R),!.
適合診断([-|R]) :- すべて数字(R),!.
適合診断([A|R]) :-
	A @>= '1',
	A @=< '9',
	すべて数字(R),!.

すべて数字([]) :- !.
すべて数字([A|R]) :-
	A @>= '0',
	A @=< '9',
	すべて数字(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Jeditで 
%  【あいう】を【6あいう】 
%  【かき】を【4かき】 
%  のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですが 
%  どのように検索してどのように置換すればよいでしょうか? 
%  【 】ではさまれた文字数はまちまちです。 
%  よろしくお願いします。 
% 

'【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加したいのですがどのように検索してどのように置換すればよいか'(_文字列,_置換された文字列) :-
	atom_chars(_文字列,Chars),
	'【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,L),
	concat_atom(L,_置換された文字列).

'【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(Chars,[S|R]) :-
	append(L0,['['|R1],[']'|R2],Chars),
	\+(append(_,['['|_],R1)),
	\+(append(_,[']'|_],R1)),
	length(R0,Len),
	Len2 is Len * 2,
	append(L0,['[',Len2|R0],[']'],L3),
	concat_atom(L3,S),
	'【あいう】を【6あいう】 【かき】を【4かき】 のように【 】でははさまれた文字列の頭に文字数×2の数値を追加する'(R2,R).
	
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  失礼します 
%  使用言語はperl5です 
%   
%  配列に、前からマッチしたところまでの文字列を繰り返し入れようとしています 
%  ($str = 'hogehugahage'; 
%  という文字列があって、hでマッチさせたら 
%  @data = ['h', 'hogeh', 'hogehugah'] 
%  という配列になることを想定しています) 
%   
%  @data = $str =~ m/h/g; 
%  のときは予想どおり 
%  @data = ['h', 'h', 'h'] 
%  となったのですが、 
%  @data = $str =~ m/^.*h/g 
%  の場合は 
%  @data = ['hogehugah'] 
%  となって1回最大マッチするだけのようです 
%   
%  どうすれば予想通りの結果になるでしょうか? 
% 

'配列に、前からマッチしたところまでの文字列を繰り返し入れようとしています($str = ''hogehugahage'';という文字列があって、hでマッチさせたら@data = [''h'', ''hogeh'', ''hogehugah'']という配列になる'(_検索文字列,_文字列,_先頭から検索文字列までの文字列ならび) :-
	findall(_先頭から適合文字列まで文字列,
		    '前からマッチしたところまでの文字列ならび'(_検索文字列,_文字列,_先頭か適合文字列までの文字列),
		_先頭から適合文字列までの文字列ならび).

'前からマッチしたところまでの文字列ならび'(_検索文字列,_文字列,_適合文字列) :-
	sub_atom(_文字列,_,_,_,S1,_検索文字列,S3,L1,L2,L3),
	concat_atom([S1,_検索文字列],_適合文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  「id="72157612930889935" primary="3224910389" secret="be0cf48b4f" server="3468" farm="4" photos="131" videos="0"」という文字列から、 
%  「id=""」の数字を抜きたいのですが(この例であれば「72157612930889935」が欲しいです) 
%   
%  $patern = 'id="(.*)" ?'; 
%  ereg($patern,$line,$id); 
%  echo $id[1]."<br />\n"; 
%   
%  では最後のvideosの終わりのダブルコーテーションまで入ってしまいました。 
%   
%  ../test/read.cgi/php/1168450843/421に近いと思うのですが?で最短マッチ?になるような気もしますし 
%  ../test/read.cgi/php/1168450843/412にあるように?は0か1回の繰り返しのようにも思うし…。 
%  OSはCent4系、PHP4.1.3、関数はeregを使いました。どなたか助けて下さい 
% 
% 

'「id="72157612930889935" primary="3224910389" secret="be0cf48b4f" server="3468" farm="4" photos="131" videos="0"」という文字列から、「id=""」の数字を抜きたいのですが(この例であれば「72157612930889935」が欲しいです)'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[i,d,=,'"'|R2],['"'|R3]),
	\+(append(_,['"'|_],R2)),
	concat_atom(R2,_適合文字列),
	concat_atom([S1,'id="'],_前文字列),
	concat_atom(['"',S3],_後文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  phpです。 
%  たとえば普通に 
%  http://ime.nu/google.co.jpと書いてあるものと 
%  <a href="http://ime.nu/google.co.jp">test</a>と書いてある文字列があります。 
%   
%  この文字列内のタグになってないUrlをAタグでリンクを張りたいんですがどうしたらいいでしょうか。 
%   
% 
% 

'httpから始まるURLを取り出す'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[h,t,t,p,:,/,/,'"'|R2],L3),
	すべてURL構成文字(R2),
	\+((L3=[A|_],\+('URL構成文字'(A)))),
	concat_atom(R2,_適合文字列),
	concat_atom([S1,'http://"'],_前文字列),
	concat_atom(['"'|R2],_後文字列).

すべてURL構成文字([]) :- !.
すべてURL構成文字([A|R]) :-
	'URL構成文字'(A),
	すべてURL構成文字(R).

'URL構成文字'(A) :- append(_,[A|_],[:,/,+,-,%,~]),!.
'URL構成文字'(A) :- A @>= a,A @=< z,!.
'URL構成文字'(A) :- A @>= 'A',A @=< 'Z',!.
'URL構成文字'(A) :- A @>= '0',A @=< '9',!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  phpのクラスファイルの特定の関数を正規表現で抜き出したいのですが可能でしょうか? 
%   
%     例 class.test.php から public function test($a){ 本文 } 
%   
%  スケルトンコードの場合簡単に抜き出せるのですが、 
%  本文中にif,swichなどで } が存在した場合どうすれば良いのか悩んでいます。 
% 
% 

'function定義で{ } で括られた本文を取り出す。本文中にif,swichなどで } が存在した場合どうするか'(_文字列,_前文字列,_本文,_後文字列) :-
	atom_chars(_文字列,Chars),
	append(L0,[f,u,n,c,t,i,o,n,' '|R1],['{'|R2],Chars),
	\+(append(_,['{'|_],R1)),
	括弧が閉じられるまで切り取る(R2,L,R3),
	append([_],L1,[_],L11),
	concat_atom(L11,_本文),
	concat_atom(['}'|R3],_後文字列),
	append(L0,[f,u,n,c,t,i,o,n,' '|R1],['{'],L01),
	concat_atom(L01,_前文字列).
	
括弧が閉じられるまで切り取る(['}'|R],[],['}'|R]) :- !.
括弧が閉じられるまで切り取る(['{'|R1],L,R) :-
	括弧が閉じられるまで切り取る(R1,L1,['}'|R2]),
	括弧が閉じられるまで切り取る(R2,L2,R),
	append(['{'|L1],['}'|L2],L),!.
括弧が閉じられるまで切り取る([A|R1],[A|R2],R) :-
	括弧が閉じられるまで切り取る(R1,R2,R).


%  文字xが連続して10個以上である場合にマッチさせるのに 

文字xが10個以上である場合にマッチさせるのに(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
	length(L2,Len),
	Len >= 10,
	all(L2,x).

%  文字xが離散して10個以上であるか(一箇所でも連続してはいけない)

'文字列の中に文字xが離散して10個以上であるか(一箇所でも連続してはいけない)'(_文字列) :-
	'文字列の中に文字が離散してn個以上であるか(一箇所でも連続してはいけない)'(x,10,_文字列).

'文字列の中に文字が離散してn個以上であるか(一箇所でも連続してはいけない)'(_文字,_n個,_文字列) :-
	\+(sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[_文字,_文字],L3)),
	count(sub_atom(_文字列,_,1,_,_文字),Count),
	Count >= _n個,!.

%  文字xが離散して10個以上であるか(連続している部分は数えない)

'文字列の中に文字xが離散して10個以上であるか(連続している部分は数えない)'(_文字列) :-
	'文字列の中に文字が離散してn個以上であるか(連続している部分は数えない)'(x,10,_文字列).

'文字列の中に文字が離散してn個以上であるか(連続している部分は数えない)'(_文字,_n個,_文字列) :-
	count((
		    sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[_文字],L3),
		    \+((last(L1,_文字),L3=[_文字|_]))),
		Count),
	Count >= _n個,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  PHP 正規表現について 
%   
%  $str = 'test1?test2/test3;test4'; 
%   
%  この文字の 
%  test1 
%  test2 
%  test3 
%  test4 
%  を取り出すにはどうしたらよいでしょうか? 
%   
%  この価を 
%  data1=test1&data2=test2&data3=test3&data4=test4 
%  と変換したいです 
%   
%  preg_replaceを使っています 
%  $str = preg_replace("・^([a-zA-Z0-9]+\?+[a-zA-Z0-9]+)\/+[a-zA-Z0-9];+[a-zA-Z0-9)$・","data1=$1&data2=$2&data3=$3&data4=$4",$str)); 
%   
%   
%  これではダメみたいです 
% 

'$str = ''test1?test2/test3;test4''; この文字の test1 test2 test3 test4 を取り出すにはどうしたらよいでしょうか?'(_文字列,L) :-
	split(_文字列,['?','/',';'],L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  以下のような文字列を置換ですべて削除したいのですが 
%  どうかけばいいのでしょうか 
%   
%  onMouseOver="refPopUp(1,event)" onMouseOut="hidePop()" 
%  onMouseOver="refPopUp(23,event)" onMouseOut="hidePop()" 
%  onMouseOver="refPopUp(345,event)" onMouseOut="hidePop()" 
%  ↓ 
%  3行すべて削除 
%   
%  試した正規表現 
%  onMouseOver="refPopUp(\d+{1,3}.,event)" onMouseOut="hidePop()" 
% 
% 

'以下のような文字列を置換ですべて削除したいのですが onMouseOver="refPopUp(1,event)" onMouseOut="hidePop()" onMouseOver="refPopUp(23,event)" onMouseOut="hidePop()" onMouseOver="refPopUp(345,event)" onMouseOut="hidePop()" 3行すべて削除'(Lines1,Lines2) :-
	'文字列を置換ですべて削除したい'(Lines1,Lines2).

'文字列を置換ですべて削除したい'([],[]) :- !.
'文字列を置換ですべて削除したい'([_文字列|R1],R2) :- !.
	sub_atom(_文字列,_,_,_,'onMouseOver="refPopUp(',S2,',event)" onMouseOut="hidePop()"',L1,L2,L3),
	すべてが数字(L2),
	'文字列を置換ですべて削除したい'(R1,R2).
'文字列を置換ですべて削除したい'([_文字列|R1],[_文字列|R2]) :- !.
	'文字列を置換ですべて削除したい'(R1,R2).

すべてが数値([]) :- !.
すべてが数値([A|R]) :-
	append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']),
	すべてが数値(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  下記の2文にあるfontタグを消したいです。 
%  正規表現を用いた1度の置換で消せますか? 
%   
%  <dd><font style="font-size:;color:;"> テスト <br> テスト </font><br><br></dd> 
%  <dd><font style="font-size:;color:;"> テスト2 <br> テスト2 </font><br><br></dd> 
%   
%   
%  考え方として 
%  <dd><font style="font-size:;color:;">がある行のうち</font>を削除し、そのあと<font style="font-size:;color:;">を削除 
%  これで行けそうかと思ったのですが、●●がある行のうち○○を削除、という正規表現がわかりませんでした・・・ 
% 
% 

'fontタグのみ削除する'(_文字列,_fontタグが削除された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	append([<,f,o,n,t|R1],[>],L2),
	\+(append(_,[>|_],R2)),
	append(L3_0,[<,/,f,o,n,t,>|R3],L3),
	\+(append(_,[<,/,f,o,n,t,>|_],L3_0)),
	append(L1,L3_0,R3,L4),
	atom_chars(_fontタグが削除された文字列,L4).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  すみません、質問させてください。 
%   
%  曲名のリストを一括置換しようとしています。具体的には"〜 by"が 
%  入る丸括弧だけ四角括弧"[ ]"に置き換えたいのです。 
%   
%  例 
%  This is me (talk) (Composed by Johan) 
%  ↓ 
%  This is me (talk) [Composed by Johan] 
%   
%  どのような書式にすればいいかご教示お願いします。 
%   

'曲名のリストを一括置換しようとしています。具体的には"〜 by"が入る丸括弧だけ四角括弧"[ ]"に置き換えたいのです。'(_文字列,_置換された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['('|R1],L3),
	last(R1,')'),
	\+(append(_,['('|_],R1)),
	split(R1,['(',')',' by '],[A,B]),
	concat_atom([S1,'[',A,' by ',B,']',S3],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させて下さい。 
%   
%  ABC 
%  …LMNO……… 
%  ……LMNO…… 
%  ………LMNO… 
%  XYZ 
%   
%  というような文章があったとします。 
%  「LMNO」の前後(「…」)には文字(日本語や英数字)があります。 
%   
%  Perl5互換の正規表現が使えるテキストエディタや、BREGEXP.DLLが使える置換えソフトを使用し、 
%  「ABC」から「XYZ」までにある「LMNO」を「OOOO」に置換えすることは可能でしょうか? 
%  特定の範囲内の文字だけを置換えする正規表現がわからず、検索文字列と置換え文字列の指定で困っています。 
%  どのようにすれば良いのか教えて頂けると助かります。よろしくお願いします。 
% 
% 

'特定の範囲内の文字だけを置換えする正規表現がわからず、検索文字列と置換え文字列の指定'(Lines,_置換されたLines) :-
	append(L0,['ABC'|R1],['XYZ'|R2],Lines),
	findall(Line2,(
		    append(_,[Line|_],R1),
		    'LineのLENOをOOOOに置換する'(Line,Line2)),
		Lines2),
	append(L0,Lines2,R2,_置換されたLines).

'LineのLENOをOOOOに置換する'(Line,Line2) :-
	sub_atom(Line,_,_,_,S1,'LENO',S3,L1,L2,L3),
	concat_atom([S1,'OOOO',S3],_置換されたLine),!.
'LineのLENOをOOOOに置換する'(Line,Line).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Perlの正規表現で質問させて下さい。 
%  yyyy/mm/entry-basename/index.php 
%  ↑はどのように記述すればいいのか、お手数ですがご教授願います<(_ _)> 
% 

'yyyy/mm/entry-basename/index.php を検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	atom_chars('/entry-basename/index.php',Chars1),
	sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[Y1,Y2,Y3,Y4,/,M1,M2|Chars1],L3),
	すべて数字([Y1,Y2,Y3,Y4,M1,M2]),
	append(_,[M1|_],['0','1']),
	\+((last(L1,A),数字(A))).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  perlでテキストデータ内の日付部分を、 
%  2009/1/1 
%  ↓ 
%  2009/01/01 
%  に一行で置換したいのですが。 
%  s|/([0-9][^0-9])|/0$1|gm; 
%  だと、2回同じ処理が必要になってしまいます。 
%  いい方法ありますか? 
% 
% 

'2009/1/1 -> 2009/01/01 に置換したい'(_文字列,_置換された文字列) :-
	'2009/1/1 -> 2009/01/01 に置換したい'(_文字列,'',_置換された文字列).

'2009/1/1 -> 2009/01/01 に置換したい'(_文字列,_前文字列,_置換された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,_後文字列,L1,[Y1,Y2,Y3,Y4,/,M,/,D],L3),
	concat_atom([Y1,Y2,Y3,Y4,/,'0',M,/,'0',D],S22),
	concat_atom([S1,S22],_置換された文字列の一),
	concat_atom([_前文字列,_置換された文字列の一],_前文字列の二),
	'2009/1/1 -> 2009/01/01 に置換したい'(_後文字列,_前文字列の二,_置換された文字列).
'2009/1/1 -> 2009/01/01 に置換したい'(_文字列,_前文字列,_置換された文字列) :-
	concat_atom([_前文字列,_文字列],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  PHP5で、$txtに格納された 
%   
%  <a href="javascript:userid('123456');">テキスト</a> 
%  ※「123456」と「テキスト」は変化します 
%   
%  といった並びの文字列からタグをぬいて 
%   
%  123456,テキスト, 
%   
%  とカンマ区切りにしたいのですが、何か良い方法はないでしょうか 
% 
% 

'<a href="javascript:userid(''123456'');">テキスト</a>といった並びの文字列からタグをぬいて123456,テキストとカンマ区切りにしたい'(_文字列,_置換された文字列) :-
	atom_chars('a href="javascript:userid(''',L0),
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	append(L0,L11,['''',')',';','"',>],L2),
	すべて数字(L11),
	atom_chars(S11,L11),
	append(L03,[<,/,a,>|_],L3),
	concat_atom(L03,S03),
	concat_atom([S11,S03],',',_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  PHPでPerl互換のpreg_replace関数を使った置換を行おうとしているのですが、 
%  やりたいことがうまく実現できません。 
%   
%  やりたいことは、 
%   
%  ・<tagA>という文字列と</tagA>のあいだに<tagInsert>という文字列を挿入したい 
%  ・ただし、<tagA>の中に<tagB>という文字列がある場合は、その<tagB>の下に挿入したい 
%   
%   
%  <失敗した正規表現> 
%  $new_str = preg_replace("/<tagA(.*?)>(.*?)(<(?!tagB).)*/", '<tagA\\1>\\2<tagInsert>\\3', $str); 
%   
%  <実現したい例> 
%  <tagA> 
%    <tagB> 
%    <tagB> 
%    <tagC> 
%  </tagA> 
%   
%  ↓置換実行 
%  <tagA> 
%    <tagB> 
%    <tagB> 
%    <tagInsert> 
%    <tagC> 
%  </tagA> 
% 
% 

'という文字列とのあいだにという文字列を挿入したい。ただし、の中にという文字列がある場合は、そのの下に挿入する'(Lines1,Lines2) :-
	append(L1,[''|R2],[''|R3],Lines1),
	\+(append(_,[''|_],R3)),
	append(_,[''|_],R3),
	append(L1,[''|R2],['',''|R3],Line2),!.
'という文字列とのあいだにという文字列を挿入したい。ただし、の中にという文字列がある場合は、そのの下に挿入する'(Lines1,Lines2) :-
	append(L1,[''|R2],[''|R3],Lines1),
	append(L1,['',''|R2],[''|R3],Line2),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  perl で, 
%  「<と>で囲まれた文字列内の abc を def に全て置換する」 
%  というのは正規表現でどう書けばよいでしょうか。 
%   
%  マッチだけならば 
%  "<asaabcasalaabca>" =~ /\<(.*?)(abc(.*?))*?\>/ 
%  のようにしてマッチさせられるのですが,繰り返しがあるので後方参照で取得できません。 
% 
% 

'<と>で囲まれた文字列内の abc を def に全て置換する'('','') :- !.
'<と>で囲まれた文字列内の abc を def に全て置換する'(_文字列,_置換された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<'|R2],L3),
	append(L00,['>'],R2),
	abcをdefに置換する(L00,L22),
	append(L1,['<',L22],['>'],L4),
	concat_atom(L4,S22),
	'<と>で囲まれた文字列内の abc を def に全て置換する'(S3,S4),
	concat_atom([S22,S4],_置換された文字列).

abcをdefに置換(L1,L2) :-
	append(L0,[a,b,c|R1],L1),
	append(L0,[d,e,f|R1],L2),!.
abcをdefに置換(L,L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  まだ正規表現が素人なので教えてください。 
%  たとえば以下のように四行の文章があって 
%  それら文章の最初(一番目)の空白文字だけを検索するには 
%  どうすればいいのですか? 
%   
%  The environment of contents industries is so drastically changing, 
%  though Japan has not fully. 
%  taken advantage of the changes to develop. 
%  its presence in the global market. 
%   
%  The とenvironmentの間の空白文字 、though と Japanの間 
%  taken とadvantage の間の空白文などなどです 
% 
% 

'それら文章の最初(一番目)の空白文字だけを検索するには'(Lines,_前文字列,_適合文字,_後文字列) :-
	append(_,[Line|R],Lines),
	最初の空白文字(Line,_前文字列,_適合文字,_後文字列),
	R = [].

最初の空白文字(_文字列,_前文字列,_適合文字,_後文字列) :-
	sub_atom(_文字列,_,1,_,_前文字列,' ',_後文字列,L1,L2,L3),!.
最初の空白文字(_文字列,_文字列,'','').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  すいません。行頭のスペースが消えておかしくなりましたので書き込み直します。 
%   
%  ●正規表現の使用環境 
%  Java1.6 
%   
%  ●検索か置換か? 
%  検索(Stringクラス String[] split(String regex)メソッドによる文字列分割) 
%   
%  ●説明 
%  CSVファイル中の一行を対象文字列とし、 
%  その文字列中初出の\s*,\s*をデータ区切り子として見なしマッチさせる。 
%  (その前後で文字列を2つに分割) 
%   
%  ●対象データ 
%  aaa,bbb,ccc 
%  aaa, bbb, ccc 
%  aaa , bbb , ccc 
%   
%  ●希望する結果 
%  "aaa"と"bbb,ccc"に分割 
%  "aaa"と"bbb, ccc"に分割 
%  "aaa"と"bbb , ccc"に分割 
%   
%  ●希望しない結果 
%  "aaa"と"bbb"と"ccc"に分割 
%  etc... 
%   
%  自分で考えた(?<^[^,]*)\s*,\s*では 
%  java.util.regex.PatternSyntaxException: Unknown look-behind group near index 8 
%  というような例外が出てしまいました。 
%   
%  よろしくお願いします。 
% 
% 

'CSVファイル中の一行を対象文字列とし、その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(_csvファイル,_行,_前文字列,_後文字列) :-
        get_lines(_csvファイル,Lines),
	append(L0,[Line|R],Lines),
	_行 is L0 + 1,
	'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列),
	fail.

'その文字列中初出の\\s*,\\s*をデータ区切り子として見なし分割する'(Line,_前文字列,_後文字列) :-
	sub_atom(Line,_,_,_,_前文字列,_区切り文字列,_後文字列,L1,L2,L3),
	append(L0,[','|R],L2),
	all(L0,' '),
	\+((append(L01,[A|_],R),\+(A=' '))),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  文字列の中にある¥を除去したかったのですが、preg_replace('/¥/')や 
%  preg_replace('/¥¥/')では削除できなかったのですが、preg_replace('/¥¥¥/')だと削除できました・・・ 
%  これはなぜでしょうか。 
%  ¥は次に有る文字をエスケープするわけですから、preg_replace('/¥¥/')でいけそうな気がするのですが。。。 
%  正規表現初心者につき、低レベルですがご教授よろしくお願いいたします。 
%  (上記は、あえて半角ではなく、全角の¥で説明しています。) 
%   

文字列の中にある¥を除去する(_文字列,_¥を除去した文字列) :-
	findall(A,(
		    sub_atom(_文字列,_,1,_,A),
		    \+(A='\\')),
		L),
	concat_atom(L,_¥を除去した文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  MySQLダンプ内の 
%   
%  /*------------------ここから--------------------*/ 
%  DROP TABLE IF EXISTS `table100`; 
%  /*!40101 SET @saved_cs_client     = @@character_set_client */; 
%  /*!40101 SET character_set_client = utf8 */; 
%  CREATE TABLE `table100` ( 
%    `code1` varchar(5) default NULL, 
%    `zip1` varchar(7) default NULL, 
%    `address1` varchar(250) default NULL, 
%    `address2` varchar(250) default NULL, 
%    `div_1` varchar(1) default NULL, 
%    `div_2` varchar(1) default NULL, 
%    `import_date` timestamp NULL default NULL, 
%    `rec_key1` int(10) unsigned NOT NULL auto_increment, 
%    PRIMARY KEY  (`rec_key1`) 
%  ) ENGINE=InnoDB AUTO_INCREMENT=121471 DEFAULT CHARSET=eucjpms; 
%  /*!40101 SET character_set_client = @saved_cs_client */; 
%  /*------------------ここまで--------------------*/ 
%   
%  `table100` → `TABLE100` 
%  `code1` → `CODE1` 
%  など逆クォートで囲まれた小文字→大文字変換を一括で行いたいです。。 
%  できればlinux コマンドライン、perl などでお願いします。。 
%   

'逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_文字列,_変換した文字列) :-
	sub_atom(_文字列,St,Len,_,S1,S2,S3,L1,['`'|R2],['`'|R3]),
	\+(append(_,['`'|_],R2)),
	concat_atom(R2,S22),
	to_upper(S22,_大文字化した文字列),
	concat_atom(S1,'`',_大文字化した文字列,'`'],_変換した文字列1),
	concat_atom(R3,_残り文字列),
	'逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_残り文字列,_変換した文字列2),
	atom_concat(_変換した文字列1,_変換した文字列2,_変換した文字列),!.
'逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_文字列,_文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させてください! 
%   
%  ああああああ @ ABCD @ abcd 
%   
%  という文字を 
%   
%  <b>ああああああ</b> @ ABCD @ <em>abcd</em> 
%   
%  のように置換したい時はどういう正規表現を使えばいいのでしょうか? 
%   
%  よろしくお願いいたします 
% 
% 

'ああああああ @ ABCD @ abcd という文字を <b>ああああああ</b> @ ABCD @ <em>abcd</em> のように置換したい'(_文字列,_置換された文字列) :-
	sPLIT(_文字列,' @ ',[A,B,C]),
	concat_atom(['',A,'',' @ ',B,' @ ','',C,''],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させてください。 
%   
%  <table> 
%  <tr> 
%    <th>名称1</th> 
%    <td> 
%      値1 
%    </td> 
%  </tr> 
%  <tr> 
%    <th>名称2</th> 
%    <td> 
%      値2 
%    </td> 
%  </tr> 
%  </table> 
%  のようなHTMLがあります。 
%  実際には全ての改行とインデントはトリムされてます。 
%  この値1の部分をとるにはどのような正規表現を使えば良いでしょうか? 
%   
%  <th>名称1</th><td>([^<]*)</td> 
%  のように考えてましたが値1には<img>タグが入る場合があります。 
%  <table>や<td>が入ることはありません。 
%   

'最初のtdタグの値を検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,_後文字列,L1,['<',t,d,'>'|R2],['<',/,t,d,'>'|R3]),
	\+(append(_,['<',t,d,'>'],_,R2)),
	concat_atom([S1,''],_前文字列),
	concat_atom(R2,_適合文字列),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  C# 
%   
%  ●検索か置換か? 
%  検索 
%   
%  ●説明 
%  =の連続がある行で挟まれた部分を抽出したい 
%   
%  ●対象データ 
%  ゲスト======================== 
%  ほげほげ 
%  ほげほげほげ 
%  プロフィール=================== 
%  はげ 
%  はげはげ 
%  ============================= 
%   
%  ●希望する結果 
%  "ほげほげ\nほげほげほげ" 
%  "はげ\nはげはげ" 
%   
%  結果に=の行が含まれていても構いません 
%  =は2つ以上連続している行が対象です 
%   
%  ^.*={2,}$(?'block'.+?)^.*={2,}$ とやってみましたがマッチしませんでした 
%  MultiLineオプションは指定しています 
%  それと対象文字列から\rは事前に除去しています 
%   
%  よろしくお願いします 
% 
% 

'=の連続がある行を区切りとして検索する'([],[]) :- !.
'=の連続がある行を区切りとして検索する'([Line|R1],[S|R2]) :-
	sub_atom(Line,_,2,_,'=='),
	'=の連続がある行が来るまで検索する'(R1,L1,R11),
	concat_atom(L1,'\n',S),
	'=の連続がある行を区切りとして検索する'(R11,R2).
'=の連続がある行を区切りとして検索する'([_|R1],R2) :-
	'=の連続がある行を区切りとして検索する'(R1,R2).

'=の連続がある行が来るまで検索する'([Line|R1],[],[Line|R1]) :-
	sub_atom(Line,_,2,_,'=='),!.
'=の連続がある行が来るまで検索する'([Line|R1],[Line|R2],R3) :-
	'=の連続がある行が来るまで検索する'(R1,R2,R3).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  『プリンターがあります。これはプリンタです。プリンタを使います。プリンターの変更です。』 
%  という文がある時、文中のプリンタをプリンターになおすにはどのような正規表現を 
%  用いればよいでしょうか? 
% 

'『プリンターがあります。これはプリンタです。プリンタを使います。プリンターの変更です。』という文がある時、文中のプリンタをプリンターになおす' :-
	atom_chars('プリンターがあります。これはプリンタです。プリンタを使います。プリンターの変更です。',Chars1),
	'プリンタをプリンターに変換'(Chars1,Chars2),
	atom_chars(_変換した文字列,Chars2).

'プリンタをプリンターに変換'([],[]) :- !.
'プリンタをプリンターに変換'([プ,リ,ン,タ,ー|R1],[プ,リ,ン,タ,ー|R2]) :-
	'プリンタをプリンターに変換'(R1,R2),!.
'プリンタをプリンターに変換'([プ,リ,ン,タ|R1],[プ,リ,ン,タ,ー|R2]) :-
	'プリンタをプリンターに変換'(R1,R2),!.
'プリンタをプリンターに変換'([A|R1],[A|R2]) :-
	'プリンタをプリンターに変換'(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Perl 5.8 /5.10で使用します。 
%   
%  HTMLソースの中のimgタグのファイル名を正規表現などで一括で変えたいです。 
%   
%  <img src="http://ime.nu/www.hoge.com/aaa/bb/ccc/ddd.jpg" alt="sss"> 
%  <img src="/xxx/yyy.png"> 
%  <img src="../aaa/fff/xxx/ccc.gif" width="32" height="16"> 
%   
%             ↓ 
%   
%  <img src="/images/ddd.jpg" alt="sss"> 
%  <img src="/images/yyy.png"> 
%  <img src="/images/ccc.gif" width="32" height="16"> 
%   
%  こんな感じです。どの様にしたらよいでしょうか。 
% 

'imgタグの書き換え'(Lines,_置換されたLines) :-
	findall(_置換された文字列,(
		    append(_,[_文字列|_],Lines),
		    文字列の置換(_文字列,_置換された文字列)),
		_置換されたLines).


文字列の置換(_文字列,_置換された文字列) :-
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	L2 = [<,i,m,g,' ',s,r,c,=,'"'|R2],
	L3 = [>|R3],
	\+(append(_,[>|_],R2)),
	concat_atom(R2,S22),
	split(S22,['/'],L),
	last(L,F),
	concat_atom([S1,''),
	sub_atom(LIne,0,S,_,Line2),!.
'行末のbr / タグを削除する'(Line,Line).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   
%  仕上げたコードの可読性をあげるために 
%  演算子の前後にスペースを入れたいです 
%  例 x+y=z 
%    x + y = z 
%   

式文字列の演算子の前後に空白を入れる(_式文字列,_空白を挿入して可読性を上げた式文字列) :-
	空白を一旦取り除く(_式文字列,_空白を取り除いた式文字列),
	sPLIT(_空白を取り除いた式文字列,['=','+','-','*','/','mod','(',')'],L),
	concat_atom(L,' ',_空白を挿入して可読性を上げた式文字列).

空白を一旦取り除く(_式文字列,_空白を取り除いた式文字列) :-
	split(_式文字列,[' '],L),
	concat_atom(L,_空白を取り除いた文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問です。PHP5.3でpreg_matchを使っているのですが、例えば 
%  「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」 
%  という文章より法律名称や条などをwhileループで拾い上げたいのですが、 
%   

'「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」という文章より法律名称や条などをwhileループで拾い上げたい'(_文,_法律名称や条のならび) :-
	法律名称を拾う(_文,0,_開始位置付き法律名称ならび),
	条を拾う(_文,_開始位置付き条ならび),
	法律名称と条を出現順にならびとする(_開始位置付き条ならび,_法律名称や条ならび).


法律名称を拾う(_文,_開始位置,[[_開始位置1,S2]|R]) :-
	sub_atom(_文,_相対開始位置,_長さ,_,S1,S2,S3,L1,L2,L3),
	sub_atom(S2,_,1,0,法),
	法律名称(S2),
	_開始位置1 is _開始位置 + _相対開始位置,
	_開始位置2 is _開始位置 + _相対開始位置 + _長さ,
	法律名称を拾う(S3,_開始位置2,R),!.

条を拾う(_文,[[_開始位置1,S2]|R]) :-
	sub_atom(_文,_相対開始位置,_長さ,_,S1,S2,S3,L1,L2,L3),
	sub_atom(S2,0,1,_,第),
	sub_atom(S2,_,1,0,条),
	_開始位置1 is _開始位置 + _相対開始位置,
	_開始位置2 is _開始位置 + _相対開始位置 + _長さ,
	条を拾う(S3,_開始位置2,R).

法律名称と条を出現順にならびとする(_開始位置付き法律名称ならび,_開始位置付き条ならび,_法律名称や条ならび) :-
	append(_開始位置付き法律名称ならび,_開始位置付き条ならび,L1),
	sort(L1,L2),
	findall(_法律名称または条,(
		    append(_,[[_,_法律名称や条]|_],L2)),
		_法律名称や条ならび).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Abc_def, Ghi_jkl ,Mno_pqr 
%  という文章を、 
%  AbcDef, GhiJkl ,MnoPqr 
%  に変えたいのですが、どのような正規表現を書けばいいでしょうか? 
% 
% 

'Abc_def, Ghi_jkl ,Mno_pqr という文章を、AbcDef, GhiJkl ,MnoPqr に変える'(_文字列,_変換された文字列) :-
	atom_chars(_文字列,Chars),
	変換(Chars,Chars2),
	atom_chars(_変換された文字列,Chars2).

変換([],[]) :- !.        
変換(['_',A|R1],[B|R2]) :-
	to_upper(A,B),
	変換(R1,R2),!.
変換([A|R1],[A|R2]) :-
	変換(R1,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  正規表現の使用環境は秀丸です。 
%  やりたいことは置換で、VBのソースを編集したいのが目的です。 
%   
%  例: 
%  ・Before 
%  Dim s1, s2, s3 As String 
%   
%  ・After 
%  Dim s1 As String, s2 As String, s3 As String 
%   
%  上記のように、1行で複数の変数宣言を行っている箇所で 
%  型の宣言を省略している箇所を、最後の型宣言で補いたいのですが 
%  どのように指定してやればよいでしょうか? 
% 
% 

'型の宣言を省略している箇所を、最後の型宣言で補う'(_文字列,_補正された文字列) :-
	's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分),
	findall(W,(
		    append(_,[_変数|_],_変数部分ならび),
		    concat_atom([_変数,_型部分],W)),
		L2),
	concat_atom(L2,',',S5),
	concat_atom(_型宣言部分,S5,_補正された文字列).

's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分) :-
	split(_文字列,[','],[_第一要素|R1]),
	sPLIT(_第一要素,[' '],L1),
	append(L0,[A],L1),
	concat_atom(L0,_型宣言部分),
	append(L2,[U],R1),
	sPLIT(U,[' '],L3),
	'最後の変数と型部分に分離する'(L3,Z,_型部分),
	append([A],L2,[Z],_変数部分ならび),!.

'最後の変数と型部分に分離する'(L,S,_型部分) :-
	append(L0,[_最後の変数|R],L),
	\+(A = ' '),
	all(L0,' '),
	concat_atom(R,_型部分),!.
'最後の変数と型部分に分離する'([_最後の変数|R],_最後の変数,_型部分) :-
	concat_atom(R,_型部分),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問です 
%  <html><body>abcdefg</body></html>のように間に挟まれたabcdefgだけを取り出すには 
%  やはり 
%  <html><body>(?<label>(\\w+))</body></html> 
%  のようにグループ化を行って後から 
%  Groups["label"].Valueで取り出すのがスマートな方法ですか? 
%   
%  C#です 
%   
%  実際はもっと長い文字列から抽出します 
%  何かもっといいアイディアがありましたらご教授願います 
% 
% 

'ある文字パターンに挟まれた副文字列'(_文字列,_直前にある副文字列,_直後にある文字列,_前文字列,_検索語,_後文字列) :-
	atom_chars(_直前にある副文字列,Chars1),
	atom_chars(_直後にある副文字列,Chars2),
	sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3),
	append(Chars1,L11,Chars2,L1),
	concat_atom(L11,_検索語),
	concat_atom([S1,_直前にある副文字列],_前文字列),
	concat_atom([_直後にある副文字列,S3],_後文字列).



指定した文字がN回以上連続している文字列に一致させる(_文字列,_指定した文字,_N回,_前文字列,_一致文字列,_後文字列) :-
	sub_atom(_文字列,_,_,_,_前文字列,_一致文字列,_後文字列,_,L2,_),
	all(L2,_指定した文字),
	length(L2,_長さ),
	_長さ >= _N回.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ●正規表現の使用環境 
%  C 
%   
%  ●説明 
%  Apacheのログから一部分を抜き出して検索したい 
%   
%  ●対象データ 
%  host.ne.jp - - [11/May/2011:12:22:15 +0900] "GET /~akasata/index.xml?gat=tPFnlVCP8aUYq8jjPqA=&BSdebug=AV/w3.3r1.1/ HTTP/1.1"  
%  200 6703 "https://server.ne.jp/" "Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14" 
%  (以上1行) 
%  ●希望する結果 
%  1件目 
%  host.ne.jp 
%  2件目 
%  /~akasata/index.xml 
%   
%  以上のような検索を実装しようとして、 
%   regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+)*([^\"]+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); 
%  以下のような正規表現を用いた(Cのエスケープが混じっているため見辛ければすいません)のですが、 
%  後ほど検索対象を調べて一部不要な部分があったため 
%   regerror(regcomp(&preg, "(.+) - [^[] \\[.+\\] \"[^\" ]+ ((/~akasata/[^\"]+)\\?g.+) [^\" ]+\".+", REG_EXTENDED|REG_NEWLINE), &preg, errbuf, sizeof(errbuf)); 
%  以下のように正規表現を変更したところ、同じ結果を返すのにもかかわらず 
%  実行速度が4倍以上もかかるようになってしまいました。原因かわかる方教えていただけないでしょうか? 
% 
% 

'Apacheのログから一部分を抜き出して検索したい'(ApacheLog,X) :-
	get_split_lines(ApacheLog,[' ','"','?'],LL),
	append(_,[L|R],LL),
	選択(L,X).

選択(L,X) :-
	append(_,['GET',X|_],L).
選択(L,X) :-
	append(_,[X|_],L),
	sub_atom(X,0,4,_,http).

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
%  次の正規表現でhogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換しております。 
%   
%  RewriteRule ^/hoge(.*)/(.*).html$ http://ime.nu/example.com/hoge/$1/i/$2.html [L] 
%   
%   
%   
%  下記のような場合は問題ないのですが 
%   
%  http://ime.nu/example.com/hoge → http://ime.nu/example.com/hoge/i/ 
%  http://ime.nu/example.com/hoge/saitama/2011/01/index.html → http://ime.nu/example.com/hoge/saitama/2011/01/i/index.html 
%   
%   
%   
%  ↓のようにhogeで始まるディレクトリまでも変換されてしまいます。 
%  http://ime.nu/example.com/hogehoge/kankeinai.html 
%   
%  hogeフォルダ配下のみ変換されるようにするには、どうしたらいいでしょうか? 
%   
%  環境は 
%  CentOS5 
%  Apache2 
%   
% 
% 

'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :-
	sud_atom(_文字列,_,_,_,S1,'/hoge',S3,L1,L2,L3),
	L3=[],
	concat_atom([S1,S2,'/i/'],_変換された文字列),!.
'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :-
	sud_atom(_文字列,_,_,_,S1,'/hoge',S3,L1,L2,[' '|R3]),
	concat_atom([S1,S2,'/i/',S3],_変換された文字列),!.
'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :-
	sud_atom(_文字列,_,_,_,S1,'/hoge/',S3,L1,L2,[' '|R3]),
	concat_atom([S1,S2,'i/',S3],_変換された文字列),!.
'hogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換する'(_文字列,_変換された文字列) :-
	sud_atom(_文字列,_,_,_,S1,'/hoge/',S3,L1,L2,L3),
	'最後の「/」の後に「i/」が挟まるように'(S3,S4),
	concat_atom([S1,S2,S4],_変換された文字列).
	
'最後の「/」の後に「i/」が挟まるように'(S1,S2) :-
	atom_chars(S1,L),
	append(L0,['/'|R],L),
	\+(append(_,[' '|_],L0)),
	\+(append(_,['/'|_],R)),
	append(L0,['/i/'|R],L2),
	atom_chars(S2,L2),!.
'最後の「/」の後に「i/」が挟まるように'(S1,S2) :-
	concat_atom(['i/',S1],S2),).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問です 
%  C++をC#にするにはどうすればよいですか 
% 
% 

'C++をC#にするには'(_文字列,_置換された文字列) :-
	全置換(_文字列,'c++','c#',_置換された文字列).

全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	findall(S,(
		    ひとつひとつ置換(_文字列,'c++','c#',S)),
		L),
	last(L,_置換された文字列),!.
全置換(_文字列,_,_,_文字列).

ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列],_置換された文字列1),
	ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2),
	concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  文字列に対して、置換対象部分すべてを置換します。
%  置換対象となる文字列が見つからなかった時でも、僞にはなりません。
%  
%  ひとつひとつ置換は置換対象文字列を最初からひとつひとつ順に置換して行きます。
%  

全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	findall(S,(
		    ひとつひとつ置換(_文字列,'c++','c#',S)),
		L),
	last(L,_置換された文字列),!.
全置換(_文字列,_,_,_文字列).

ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列],_置換された文字列1),
	ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2),
	concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  ひとつひとつ置換は置換対象文字列をひとつひとつ順に置換していく、
%  非決定性の述語です。
%  一度置換された部分は次の置換候補が置換された時にも置換されたままであり、
%  元に戻ることはありません。
%  置換される対象がなくなって、さらのバックトラックにより、起動されると僞となります。
%  
%  ひとつひとつ置換/6 は置換される度に、前文字列、後文字列を切り出す。
%  置換文字列の引数位置に注意が必要。
%  

ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列],_置換された文字列1),
	ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2),
	concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列).


ひとつひとつ置換(_文字列,_置換対象文字列,__前文字列,_置換文字列,_後文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,_前文字列),
	\+(sub_atom(_前文字列,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,_後文字列),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,__前文字列,_置換文字列,_後文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,_前文字列1),
	\+(sub_atom(_前文字列1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,_残り文字列),
	ひとつひとつ置換(_残り文字列,_置換対象文字列,_前文字列2,_置換文字列,_後文字列,_置換された文字列2),
	concat_atom([_前文字列1,_置換文字列,_前文字列2],_前文字列),
	concat_atom([_前文字列,_置換文字列,_後文字列],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  文字列の置換述語。最初に見つかった置換可能部分を置換する決定性述語。
% 
%  どこが置換された部分であるか、分かりにくいのが欠点です。
%  
%  最初のひとつだけ置換/6 は置換された部分の前文字列と後文字列を明示した。


最初のひとつだけ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列),!.


最初のひとつだけ置換(_文字列,_置換対象文字列,_前文字列,_置換文字列,_後文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,_前文字列),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,_後文字列),
	concat_atom([_前文字列,_置換文字列,_後文字列],_置換された文字列),!.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  常に置換可能な部分のうち一箇所だけが置換される述語定義です。
%  
%  対象文字列がccで文字列中にcが3個以上連なっている場合などは
%  最初のccの切り出しの後、そのccを除外して置換対象を探すか、
%  あるいは最初のcの次のc以後を置換対象とするかの選択が有り得ます。
%  
%  以下は前者、一旦置換対象になった文字列を外して、そのあとからの
%  文字列から次の置換対象文字列を探す場合の述語定義です。
% 
%  この定義はどこが置換された場所であるか、分かりにくいのが欠点です。
%  

'ひとつだけ置換(対象文字列の重なりを許さない)'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).
'ひとつだけ置換(対象文字列の重なりを許さない)'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	\+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	'ひとつだけ置換(対象文字列の重なりを許さない)'(S3,_置換対象文字列,_置換文字列,_置換された文字列2),
	concat_atom([_置換された文字列1,_置換対象文字列,_置換された文字列2],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  常に置換可能な部分のうち一箇所だけが置換される述語定義です。
%  
%  
%  対象文字列がccで文字列中にcが3個以上連なっている場合などは
%  最初のccの切り出しの後、そのccを除外して置換対象を探すか、
%  あるいは最初のcの次のc以後を置換対象とするかの選択が有り得ます。
%  
%  以下は後者、一旦対象になった文字列に重なって次の対象文字列を
%  探す場合の述語定義です。
% 
%  この定義はどこが置換されたか分かりにくいのが欠点です。
%  

'ひとつだけ置換(対象文字列の重なりを許す)'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
	sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
	sub_atom(_文字列,0,Len1,_,S1),
	St is Len1+Len2,
	sub_atom(_文字列,St,Len3,_,S3),
	concat_atom([S1,_置換文字列,S3],_置換された文字列).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  質問させてください。 
%  「<img」以外の「<」を「&lt;」に置き換えるにはどう書けば良いでしょうか? 
%  #「img(中略)>」以外の「>」も「&gt;」に置き換える必要ありがますが、そちらはまた別途考えるとして。。 
%  言語はPHPです。よろしくお願いします。 
% 

'「|R3]),
	'「|R3],_置換した部分までの文字列,_残り文字列),
	concat_atom([_置換した部分までの文字列,_残り文字列],_置き換えた文字列).
'「|R3]),
	'「|R3],_置換した部分までの文字列,_残り文字列) :-
	\+(append(_,[<|_],R2)),
	\+(append(_,[>|_],R2)),
	append(L1,['<'|R2],['>'],L4),
	concat_atom(L4,_置換した部分までの文字列),
	concat_atom(R3,_残り文字列),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% N1からN2までの数字に一致させる

'N1からN2までの数字に一致させる'(_N1,_N2,_文字列,_前文字列,_適合文字列,_後文字列) :-
        sub_atom(_文字列,_,Len,_,S1,S2,S3,L1,L2,L3),
        Len =< 3,
        \+((last(L1,A),数字(A)),
        \+((L3=[B|_],数字(B)),
        atom_to_term(S2,N,_),
        integer(N),
        N >= _N1,
        N =< _N2.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% -N1からN2までの数字に一致させる

'-N1からN2までの数字に一致させる'(_N1,_N2,_文字列,_前文字列,_適合文字列,_後文字列) :-
        sub_atom(_文字列,_,Len,_,S1,S2,S3,L1,L2,L3),
        \+((last(L1,A),数字または符号(A)),
        Len =< 4,
        \+((L3=[B|_],数字(B)),
        atom_to_term(S2,N,_),
        integer(N),
        N >= _N1,
        N =< _N2.

数字または符号(A) :-
        append(_,[A|_],['0','1','2','3','4','5','6','7','8','9','+','-']).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% YYYY/MM/DD HH:MI 形式に一致させる

'「YYYY/MM/DD HH:MI」形式に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :-
        sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,後文字列,L1,L2,L3),
        sPLIT(_適合文字列,['/',' ',':'],[_年,/,_月,/,_日,' ',_時,':',_分]),
        すべて整数([_年,_月,_日,_時,_分]),
        \+((L3=[A|_],append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']))).

すべて整数([]) :- !.
すべて整数([N|R]) :-
        integer(N),
        すべて整数(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% YYYY/MM/DD HH:MI PM 形式に一致させる

'「'(_文字列,_前文字列,_適合文字列,_後文字列) :-
        sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3),
        sPLIT(_適合文字列,['/',' ',':'],[_年,/,_月,/,_日,' ',_時,':',_分,' '_AMまたはPM]),
        すべて整数([_年,_月,_日,_時,_分]),
        \+((L3=[A|_],append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']))).

すべて整数([]) :- !.
すべて整数([N|R]) :-
        integer(N),
        すべて整数(R).

'AMまたはPM'('AM').
'AMまたはPM'('PM').

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 英数文字を含まない日本語の文を抽出する

英数文字を含まない日本語の文を抽出する(_文字列,_前文字列,_抽出文字列,_後文字列) :-
        sub_atom(_文字列,_,_,_,_前文字列,_抽出文字列,_後文字列,L1,L2,L3),
        \+((last(L1,A),多バイト文字(A))),
        \+((L3=[B|_],他バイト文字(B))),
        すべて多バイト文字(L2).

すべて多バイト文字([]) :- !.
すべて多バイト文字([A|R]) :-
        char_code(A,Code),
        Code >= 256,
        すべて多バイト文字(R).