Passwords 用prolog检查密码
我想编写一个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
- 密码必须包含字母(a-z)
- 一个数字(0-9)
- 双字母(aa、ll、ww等)
- 必须以字母(a、aa、c等)开头
- 长度必须至少为6个字符
谢谢你提前回复。这非常重要,我真的很感激 好吧,我会选择这样的方式,但使用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真的合格吗?