このディレクトリの索引
#  ●問題文 
#  <b>タグのように開始タグの部分にマッチする正規表現を最小限の階数のキャプチャを用いて書きなさい。 
#  タグ名は1文字以上の英単語であり、属性には「>」以外の任意の文字を使えるものとする。 
#  ●例文 
#  <b>ゴレイヌさん</b>は、えげつねぇ・・・<font color="red">ゴレイヌさん</font>は 
#  えげつねぇ。。。<font color="blue">富樫仕事</font>しろ。 
#  ●マッチする例 
#  <b> 
#  <font color="red"> 
#  <font color="blue"> 
#   
#  ●答え 
#  <(?:\w+)(?:\s+[^>]*)*> 
#  ●解説 
#  「<」と「>」に囲まれた部分にマッチさせればよいのですが、属性付きのタグを考慮しなくてはいけません。 
#  また、最小限のキャプチャという条件があるため、グループ化のみでキャプチャを必要としない場所では「(?:)」を使います。 
#  この問題の場合には、1回もキャプチャを使わずに記述する事が可能です。 
#   
#  と、あるのですが 
#  <\w+(?:\s+[^>]*)*> 
#  でないかと思っています。 
#  \w+はグループ化する必要がそもそもあるのでしょうか? 
# 

'<b>タグのように開始タグの部分にマッチする'(_文字列,_前文字列,_開始タグ,_後文字列) :-
        開始タグを切り出す(_文字列,_前文字列_1,_開始タグ_1,_後文字列_1),
        開始タグ名は1文字以上の英単語であり(_開始タグ_1),
        '<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_開始タグ_1,_後文字列_1,_前文字列,_開始タグ,_後文字列).


'<b>タグのように開始タグの部分にマッチする'(_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列).
'<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :-
        '<b>タグのように開始タグの部分にマッチする'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列),
        atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列).

開始タグを切り出す(_前文字列,_開始タグ,_後文字列) :-
        sub_atom(_文字列,St,Len,R,_開始タグ),
        開始タグ(_開始タグ),
        sub_atom(_文字列,0,St,_,_前文字列),
        sub_atom(_文字列,_,R,0,_後文字列),!.

開始タグ(_開始タグ) :-
        sub_atom(_開始タグ,0,1,_,<),
        \+(sub_atom(_開始タグ,0,2,_,').

'開始タグの情報部分は>を含まない'(_開始タグ) :-
        sub_atom(_開始タグ,1,_,1,_開始タグの情報部分),
        \+(sub_atom(_開始タグの情報部分,_,1,_,>)),!.

開始タグ名は1文字以上の英単語であり(_開始タグ) :-
        開始タグ名は(_開始タグ,_開始タグ名),
        '1文字以上の英単語である'(_開始タグ名),!.

開始タグ名は(_開始タグ,_開始タグ名) :-
        sub_atom(_開始タグ,1,_,1,_開始タグの情報部分),
        開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名),!.

開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名) :-
        sub_atom(_開始タグの情報部分,St,1,_,' '),
        sub_atom(_開始タグの情報部分,0,St,_,_開始タグ名),!.
開始タグ名を切り出す(_開始タグ名,_開始タグ名).

'1文字以上の英単語である'(_タグ名の文字ならび) :-
        forall(sub_atom(_開始タグ名,_,1,_,A),英文字か数字(A)).

英文字か数字(A) :-
        英文字(A).
英文字か数字(A) :-
        数字(A).

英文字(A) :-
        A @>= 'a',
        A @=< 'z',!.
英文字(A) :-
        A @>= 'A',
        A @=< 'Z',!.

数字(A) :-
        A @>= '0',
        A @=< '9',!.