このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1301067486/570
#  小文字英字、大文字英字、数字、「@_#」、のどれか3つが入っているかの条件は正規表現で可能でしょうか? 
#  どれか3つのやり方がわかりません。 
#   
#  以下は全く動作せず… 
#  ^(?=(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])|(?=.*[A-Z])(?=.*[a-z])(?=.*[@_#])).*$ 
# 
# 

'小文字英字、大文字英字、数字、「@_#」、のどれか3つが入っているか'(_文字列) :-
        findall(_,'小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列),L),
        '3つが入っている'(L).

'小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列) :-
        小文字英字(_文字列).
'小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列) :-
        大文字英字(_文字列).
'小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列) :-
        数字(_文字列).
'小文字英字、大文字英字、数字、「@_#」、のどれか'(_文字列) :-
        '@_#'(_文字列).

小文字英字(_文字列) :-
        sub_atom(_文字列,_,1,_,_文字),
        _文字 @>= 'a',
        _文字 @=< 'z',!.

大文字英字(_文字列) :-
        sub_atom(_文字列,_,1,_,_文字),
        _文字 @>= 'A',
        _文字 @=< 'Z',!.

数字(_文字列) :-
        sub_atom(_文字列,_,1,_,_文字),
        _文字 @>= '0',
        _文字 @=< '9',!.

'@_#'(_文字列) :-
        sub_atom(_文字列,_,3,_,'@_#'),!.

'3つが入っている'(L) :-
        length(L,3).


%  このPrologプログラムのポイントは 小文字英字/1, 大文字英字/1, 数字/1, '@_#'/1
%  各述語の本体最後のカットです。組込み述語sub_atom/5は非決定性の述語なので
%  このカットがないと例えば小文字英数がn個あれば、n個分_を収集してしまいます。
%  文字種検査は一度現れたらそれまで。ただ一とだけ勘定したいのです。