使用prolog进行密码检查

时间:2011-12-01 11:22:42

标签: passwords prolog grammar

我想写一个prolog程序,告诉我密码是否符合以下规则:

  • 密码必须包含字母(a-z),
  • 一个数字(0-9),
  • 双字母(aa,ll,ww等),
  • 必须以字母(a,aa,c等)开头,
  • 必须至少6个字符

我该怎么做?那之后我该如何“提问”呢? (Q1:这个密码是否正确?Q2:它足够长吗?)

提前感谢您的回答。这非常重要,我真的很感激。

1 个答案:

答案 0 :(得分:1)

好吧,我会选择类似的东西,但使用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/1contains_number/1starts_with_letter/1都可以合并为一个wildcard_match/2 btw:

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