Проверка пароля с прологом - PullRequest
1 голос
/ 01 декабря 2011

Я хочу написать прологическую программу, которая сообщает мне, соответствует ли пароль правилам:

  • пароль должен содержать букву (az),
  • число(0-9),
  • двойная буква (aa, ll, ww и т. Д.),
  • должна начинаться с буквы (a, aa, c и т. Д.),
  • должен содержать не менее 6 символов

Как я могу это сделать?И как после этого «задавать вопросы»?(Q1: этот пароль правильный? Q2: он достаточно длинный?)

Спасибо за ваш ответ заранее.Это очень важно, и я действительно ценю это.

1 Ответ

1 голос
/ 01 декабря 2011

Хорошо, я бы пошел с чем-то подобным, но, возможно, есть гораздо лучшие решения, использующие DCG или что-то еще:

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).

Использование будет:

?- check_everything("password_to_test").

илитолько один из критериев:

?- long_enough("password_to_test").

Обратите внимание, что он использует предикат swi-pl wildcard_match/2, и я не знаю, доступен ли он в других реализациях.
Я надеюсь, что это может бытьнекоторая помощь!

Обратите внимание, что contains_letter/1, contains_number/1 и starts_with_letter/1 могут быть объединены в один wildcard_match/2 кстати:

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