【发布时间】:2011-12-01 11:22:42
【问题描述】:
我想写一个序言程序,告诉我密码是否符合规则,即:
- 密码必须包含字母(a-z),
- 一个数字(0-9),
- 双字母(aa,ll,ww 等),
- 必须以字母开头(a、aa、c 等),
- 长度必须至少为 6 个字符
我该怎么做?在那之后我应该如何“提问”? (Q1:这个密码对吗?Q2:够长吗?)
提前感谢您的回答。这非常重要,我真的很感激。
【问题讨论】:
-
“aaaaa0”真的符合条件吗?
我想写一个序言程序,告诉我密码是否符合规则,即:
我该怎么做?在那之后我应该如何“提问”? (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 谓词 wildcard_match/2,我不知道它是否在其他实现中可用。
我希望这能有所帮助!
注意contains_letter/1、contains_number/1 和starts_with_letter/1 都可以合并为一个wildcard_match/2 顺便说一句:
starts_with_letter_has_number(Password) :-
wildcard_match('[a-zA-Z]*[0-9]*', Password).
【讨论】: