答案集编程:如何分配数字,使得没有两个连续的字符或整数在同一个密码中
Answer Set Programming: how to assign numbers such that no two consecutive chars or ints are in a same password
创建一个 ASP 模型,在给定以下密码约束的情况下生成所有可能的密码。存在多少个密码?
请不要对答案发表评论,而只是告诉我我的 clingo 解决方案在过程中哪里出错了。
NV = 1.. N. %numerical values
sc = #;*;$;!; %special characters
c = 1..c. %characters
pcn = 1..cn. %password character numbers
2.) 密码必须最少包含 4 个字符,最多包含 6 个字符,并混合使用数字和特殊字符。
:-Pass(P #count (cn : in(p,cn)) < 4.
:-Pass(P #count (cn : in(p,cn)) > 6.
3.) 密码必须至少包含一个数字字符。
1{in(p,sc) : sc(sc))1 :- Pass(p).
4.) 密码必须至少有一个特殊字符。
1{in(p,NV) : NV(N))1 :- Pass(p).
5.) 密码不能有连续的重复字符[invalid password
示例:9988*] [有效密码示例:9897#]
:-in(a,b,p1), in(c,d,P2), consecutive(a,b,c,d), pass(p1), pass(p2), pass(p3), pass(p4), pass(p5), pass(p6), G1==G2,, G3==G4, G5==G6.
#show/6.
编辑添加
我还认为另一种看待问题的方式可能是
char= 1..13.
consecutive(1,1,2,2).consecutive(3,3,4,4).consecutive(5,5,6,6).consecutive(7,7,8,8).consecutive(9,9,10,10).consecutive(11,11,12,12).
:-Pass(P #count (cn : in(p,cn)) < 4.
:-Pass(P #count (cn : in(p,cn)) > 6.
%3.) 密码必须至少有一个小于或等于 9 的数字字符,大于 9 为特殊字符。
1{in(p,char) : Char(c))1 > 9 :- Pass(p).
1{in(p,char) : Char(c))1 < 9 :- Pass(p).
5.) 密码不能有连续的重复字符[无效密码示例:9988*][有效密码示例:9897#]
:-in(X,p1), in(Y,P2), consecutive(X1,X2,Y1,Y2), pass(p1), pass(p2), pass(p3), pass(p4), pass(p5), pass(p6), P1==P2,, P3==P4, P5==P6.
您的代码不符合CLINGO的基本语法要求。例如,在第一部分中,当您声明密码中单个元素的所有可能选择时,您应该将它们定义为谓词,如
number(0..9).
sc("#";"*";"$";"!").
请注意,特殊字符必须在 CLINGO 中作为字符串引用。我不知道 c = 1..c
是什么意思?还有,character number
是指字符的长度还是字符的位置?无论如何,这些在CLINGO中必须被视为事实。
接下来是约束条件。 #count
的用法也是错误的:
:-Pass(P #count (cn : in(p,cn)) < 4.
以这一行为例,Pass(...)
表示Pass
是谓词或函数,但是CLINGO中的谓词都必须小写。 #count
后面应该跟大括号而不是括号。由于你的问题描述不清楚,我只能给你一个简单的例子来说明你的问题的可能用法。
如果我们简化问题:
The password is with a length of 6 and it is constructed only with number 0~9, and the only constraint is Passwords cannot have consecutive repeating characters
一种可能的方法是:(按照您的想法,因为您要求不给出完整的答案)
首先,生成所有可能的长度为6的密码。
number(0..9).
position(1..6).
1{final_password(P, N):number(N)}1 :- position(P). % each position should be assigned with one and only one number
#show final_password/2.
您将获得 1000000(10^6) 个答案集,其中一个可能是
final_password(1,6) final_password(2,4) final_password(3,9) final_password(4,2) final_password(5,2) final_password(6,3)
final_password
的第一个数字表示数字的位置,第二个是数值。因此对应的密码为649223.
这显然不满足连续不重复的约束条件。所以我们添加约束:
:- final_password(P, V), final_password(Q, V), Q = P + 1. %constraint(A)
这次答案集的数量减少到590490个,之前错误的答案集被constraint(A)淘汰了。
您可以通过进行小的更改将特殊字符等其他元素添加到密码中,例如:
number(0..9).
position(1..6).
special_character("*").
num(P) | special_char(P) :- position(P).% each position should be
assigned with one and only one number
1{final_password(P, N):number(N)}1 :- num(P).
1{final_password(P, N):special_character(N)}1 :- special_char(P).
:- final_password(P, V), final_password(Q, V), Q = P + 1.
#show final_password/2.
另外,如果您要求密码中的数字元素个数大于3,那么我们可以加上
:- #count{number(N) : final_password(P, N)} <=3.
看来你对CLINGO的基本语法不熟悉,CLINGO的语法可以参考官方文档CLINGO Guide.
创建一个 ASP 模型,在给定以下密码约束的情况下生成所有可能的密码。存在多少个密码?
请不要对答案发表评论,而只是告诉我我的 clingo 解决方案在过程中哪里出错了。
NV = 1.. N. %numerical values
sc = #;*;$;!; %special characters
c = 1..c. %characters
pcn = 1..cn. %password character numbers
2.) 密码必须最少包含 4 个字符,最多包含 6 个字符,并混合使用数字和特殊字符。
:-Pass(P #count (cn : in(p,cn)) < 4.
:-Pass(P #count (cn : in(p,cn)) > 6.
3.) 密码必须至少包含一个数字字符。
1{in(p,sc) : sc(sc))1 :- Pass(p).
4.) 密码必须至少有一个特殊字符。
1{in(p,NV) : NV(N))1 :- Pass(p).
5.) 密码不能有连续的重复字符[invalid password 示例:9988*] [有效密码示例:9897#]
:-in(a,b,p1), in(c,d,P2), consecutive(a,b,c,d), pass(p1), pass(p2), pass(p3), pass(p4), pass(p5), pass(p6), G1==G2,, G3==G4, G5==G6.
#show/6.
编辑添加 我还认为另一种看待问题的方式可能是
char= 1..13.
consecutive(1,1,2,2).consecutive(3,3,4,4).consecutive(5,5,6,6).consecutive(7,7,8,8).consecutive(9,9,10,10).consecutive(11,11,12,12).
:-Pass(P #count (cn : in(p,cn)) < 4.
:-Pass(P #count (cn : in(p,cn)) > 6.
%3.) 密码必须至少有一个小于或等于 9 的数字字符,大于 9 为特殊字符。
1{in(p,char) : Char(c))1 > 9 :- Pass(p).
1{in(p,char) : Char(c))1 < 9 :- Pass(p).
5.) 密码不能有连续的重复字符[无效密码示例:9988*][有效密码示例:9897#]
:-in(X,p1), in(Y,P2), consecutive(X1,X2,Y1,Y2), pass(p1), pass(p2), pass(p3), pass(p4), pass(p5), pass(p6), P1==P2,, P3==P4, P5==P6.
您的代码不符合CLINGO的基本语法要求。例如,在第一部分中,当您声明密码中单个元素的所有可能选择时,您应该将它们定义为谓词,如
number(0..9).
sc("#";"*";"$";"!").
请注意,特殊字符必须在 CLINGO 中作为字符串引用。我不知道 c = 1..c
是什么意思?还有,character number
是指字符的长度还是字符的位置?无论如何,这些在CLINGO中必须被视为事实。
接下来是约束条件。 #count
的用法也是错误的:
:-Pass(P #count (cn : in(p,cn)) < 4.
以这一行为例,Pass(...)
表示Pass
是谓词或函数,但是CLINGO中的谓词都必须小写。 #count
后面应该跟大括号而不是括号。由于你的问题描述不清楚,我只能给你一个简单的例子来说明你的问题的可能用法。
如果我们简化问题:
The password is with a length of 6 and it is constructed only with number 0~9, and the only constraint is Passwords cannot have consecutive repeating characters
一种可能的方法是:(按照您的想法,因为您要求不给出完整的答案)
首先,生成所有可能的长度为6的密码。
number(0..9).
position(1..6).
1{final_password(P, N):number(N)}1 :- position(P). % each position should be assigned with one and only one number
#show final_password/2.
您将获得 1000000(10^6) 个答案集,其中一个可能是
final_password(1,6) final_password(2,4) final_password(3,9) final_password(4,2) final_password(5,2) final_password(6,3)
final_password
的第一个数字表示数字的位置,第二个是数值。因此对应的密码为649223.
这显然不满足连续不重复的约束条件。所以我们添加约束:
:- final_password(P, V), final_password(Q, V), Q = P + 1. %constraint(A)
这次答案集的数量减少到590490个,之前错误的答案集被constraint(A)淘汰了。
您可以通过进行小的更改将特殊字符等其他元素添加到密码中,例如:
number(0..9).
position(1..6).
special_character("*").
num(P) | special_char(P) :- position(P).% each position should be
assigned with one and only one number
1{final_password(P, N):number(N)}1 :- num(P).
1{final_password(P, N):special_character(N)}1 :- special_char(P).
:- final_password(P, V), final_password(Q, V), Q = P + 1.
#show final_password/2.
另外,如果您要求密码中的数字元素个数大于3,那么我们可以加上
:- #count{number(N) : final_password(P, N)} <=3.
看来你对CLINGO的基本语法不熟悉,CLINGO的语法可以参考官方文档CLINGO Guide.