1

以下の Prolog プログラムは、パスワードが特定のルール (パスワードには文字 (az)、数字 (0-9)、二重文字 (aa、ll、ww など) が含まれている必要がある) を満たしているかどうかを調べるもので、開始する必要があります。文字 (a、aa、c など) を使用する場合は、6 文字以上にする必要があります)。

2文字が1文字としてカウントされるように拡張するにはどうすればよいですか? (たとえば、aa25b1 は 5 文字しかないため正しいパスワードではありません)。

contains_letter(Password) :- wildcard_match('*[a-zA-Z]*', Password).

contains_number(Password) :- wildcard_match('*[0-9]*', Password).

contains_double_letter(Password) :-
    (between(65, 90, Letter) ; between(97, 122, Letter)),
    append([_, [Letter, Letter], _], Password),
    !.

starts_with_letter(Password) :- wildcard_match('[a-zA-Z]*', Password).

long_enough(Password) :-
    length(Password, Length),
    Length >= 6.

check_everything(Password) :-
    contains_letter(Password),
    contains_number(Password),
    contains_double_letter(Password),
    starts_with_letter(Password),
    long_enough(Password).
4

3 に答える 3

3

等しい文字を一緒に押しつぶす述語を使用してパスワードを前処理します。

uniq([], []).
uniq([X], [X]).
uniq([X,X|L], R) :-
     !,
     uniq([X|L], R).
uniq([X,Y|L], [X|R]) :-
     uniq([Y|L], R).

(私は Unix ツールにちなんでこれに名前を付けました。好みに合わせuniqて名前を変更したり、他の名前にしたりすることもできます。)without_adjacent_repetitions

于 2011-12-05T15:18:49.737 に答える
2

独自の lengthWithDoubleLetters/2 ルールを記述して、文字のリストを取得し、2 文字を 1 つとして数えてその長さを返します。

lengthWithDoubleLetters([],0).
lengthWithDoubleLetters([F,F|T],C) :-
    lengthWithDoubleLetters(T,TC),
    !,
    C is TC + 1.
lengthWithDoubleLetters([H|T], C) :-
    lengthWithDoubleLetters(T,TC),
    C is TC + 1.
于 2011-12-05T15:25:51.553 に答える
2

最初に、最初の質問で正確に述べたように、それを組み合わせることができることに注意してください。

contains_letter(Password) :- wildcard_match('*[a-zA-Z]*', Password).

contains_number(Password) :- wildcard_match('*[0-9]*', Password).

starts_with_letter(Password) :- wildcard_match('[a-zA-Z]*', Password).

その中に:

letter_start_and_number(Password) :-
    wildcard_match('[a-zA-Z]*[0-9]*', Password).

これで、次のように二重文字と長さを処理できます。

length_double_letters([], Acc, yes, Acc).
length_double_letters([Char, Char|Password], Acc, _Contains, Length) :-
    !,
    NewAcc is Acc + 1,
    length_double_letters(Password, NewAcc, yes, Length).
length_double_letters([_Char|Password], Acc, Contains, Length) :-
    NewAcc is Acc + 1,
    length_double_letters(Password, NewAcc, Contains, Length).

その述語をこの主述語に使用する:

check_everything(Password) :-
    letter_start_and_number(Password),
    length_double_letters(Password, 0, no, Length),
    Length >= 6.

PS : 時間をかけて、最も建設的な回答を受け入れ、役に立った回答に賛成票を投じてください。

于 2011-12-05T21:46:40.187 に答える