【问题标题】:Password-checking with prolog使用 prolog 进行密码检查
【发布时间】:2011-12-01 11:22:42
【问题描述】:

我想写一个序言程序,告诉我密码是否符合规则,即:

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

我该怎么做?在那之后我应该如何“提问”? (Q1:这个密码对吗?Q2:够长吗?)

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

【问题讨论】:

  • “aaaaa0”真的符合条件吗?

标签: passwords prolog grammar


【解决方案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 顺便说一句:

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

【讨论】:

  • 是的,这是一个很大的帮助,它工作正常。非常感谢你的帮助。 :)
  • 我添加了一个可能的简化顺便说一句。
  • 我还有一个问题。我希望每个双字母都算作一个。我该怎么做?
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2019-04-18
相关资源
最近更新 更多