Passwords 用prolog检查密码

Passwords 用prolog检查密码,passwords,prolog,grammar,Passwords,Prolog,Grammar,我想编写一个prolog程序,告诉我密码是否满足以下规则: 密码必须包含字母(a-z) 一个数字(0-9) 双字母(aa、ll、ww等) 必须以字母(a、aa、c等)开头 长度必须至少为6个字符 我该怎么做?在那之后我该如何“提问”?(Q1:这个密码正确吗?Q2:足够长吗?) 谢谢你提前回复。这非常重要,我真的很感激 好吧,我会选择这样的方式,但使用DCG或其他方式可能会有更好的解决方案: contains_letter(Password) :- wildcard_match('*[a-zA

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

  • 密码必须包含字母(a-z)
  • 一个数字(0-9)
  • 双字母(aa、ll、ww等)
  • 必须以字母(a、aa、c等)开头
  • 长度必须至少为6个字符
我该怎么做?在那之后我该如何“提问”?(Q1:这个密码正确吗?Q2:足够长吗?)


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

好吧,我会选择这样的方式,但使用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谓词
通配符匹配/2
,我不知道它是否在其他实现中可用。
我希望这能有所帮助

请注意,
包含字母/1
包含字母/1
以字母/1开头可以组合成一个
通配符匹配/2
顺便说一句:

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

好吧,我会选择类似的方式,但可能有更好的解决方案使用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谓词
通配符匹配/2
,我不知道它是否在其他实现中可用。
我希望这能有所帮助

请注意,
包含字母/1
包含字母/1
以字母/1开头可以组合成一个
通配符匹配/2
顺便说一句:

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

是的,这是一个很大的帮助,它工作正常。非常感谢您的帮助。:)顺便说一句,我添加了一个可能的简化。我还有一个问题。我想把每一封重复的信都算作一封。我该怎么做?是的,这是一个很大的帮助,它工作正常。非常感谢您的帮助。:)顺便说一句,我添加了一个可能的简化。我还有一个问题。我想把每一封重复的信都算作一封。我该怎么做?AAAA0真的合格吗?AAAA0真的合格吗?