Сначала и как я уточнил в вашем первом вопросе, обратите внимание, что вы можете объединить следующее:
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: пожалуйста, найдите время, чтобы принять ответы, которые вы находите наиболее конструктивными, и одобрить те, которые помогливы.