Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用prolog/2进行密码检查_Prolog_Grammar_Password Checker - Fatal编程技术网

用prolog/2进行密码检查

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

我在下面有一个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([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