用prolog/2进行密码检查
我在下面有一个Prolog程序,它检查密码是否符合某些规则(密码必须包含字母(a-z)、数字(0-9)、双字母(aa、ll、ww等),必须以字母(a、aa、c等)开头,长度必须至少为6个字符) 如何将其展开,以便将双字母计算为一个字母?(例如,aa25b1的长度只有五个字符,因此不是正确的密码)用prolog/2进行密码检查,prolog,grammar,password-checker,Prolog,Grammar,Password Checker,我在下面有一个Prolog程序,它检查密码是否符合某些规则(密码必须包含字母(a-z)、数字(0-9)、双字母(aa、ll、ww等),必须以字母(a、aa、c等)开头,长度必须至少为6个字符) 如何将其展开,以便将双字母计算为一个字母?(例如,aa25b1的长度只有五个字符,因此不是正确的密码) 使用将相等字符压缩在一起的谓词预处理密码,例如 uniq([], []). uniq([X], [X]). uniq([X,X|L], R) :- !, uniq([X|L], R)
使用将相等字符压缩在一起的谓词预处理密码,例如
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的名字命名它;
uniq
;您可能希望重命名它,而无需重复
或其他更符合您口味的内容。)使用将相等字符压缩在一起的谓词预处理密码,例如
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的名字命名它;
uniq
;您可能希望重命名它,而无需重复
或其他更符合您口味的内容。)编写您自己的纵向双字母/2规则,获取字符列表并返回其长度,将双字母作为一个字符计数:
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.
编写自己的纵向双字母/2规则,获取字符列表并返回其长度,将双字母计算为一个:
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.
首先,正如我在你的第一个问题中所指出的,请注意,你可以将以下内容结合起来:
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.
注:请花点时间接受你认为最有建设性的答案,并投票选出对你有帮助的答案。首先,正如我在你的第一个问题中所指出的,请注意,你可以结合以下内容:
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.
附言:请花时间接受你认为最有建设性的答案,并投票选出对你有帮助的答案。你的第二条似乎不合适useful@Mog你说得对,最后一个案子涵盖了它,不是吗?我从1996年年中开始就没有做过Prolog,所以我已经很生疏了。谢谢你的更正!没错!所以这很好,它给了一个机会,即使在大学毕业的时候,也会有一点开场白:你的第二条似乎没有useful@Mog你说得对,最后一个案子涵盖了它,不是吗?我从1996年年中开始就没有做过Prolog,所以我已经很生疏了。谢谢你的更正!没错!因此,这很好,即使在大学毕业后,它也给了一个开场白的机会:有趣的问题是,“aaaa”应该如何计算,是3还是2,这是正确的答案有趣的问题是,“aaaa”应该如何计算,这里的正确答案是3还是2