Хорошо, я бы пошел с чем-то подобным, но, возможно, есть гораздо лучшие решения, использующие 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).