Программирование набора ответов: как назначать числа так, чтобы в одном пароле не было двух последовательных символов или целых чисел.

Создайте модель 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.) Пароли не могут содержать последовательные повторяющиеся символы [пример неверного пароля: 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.


edit add on Я также подумал, что другой способ взглянуть на проблему может быть

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.




person fahren height    schedule 25.03.2020    source источник


Ответы (1)


Ваш код не соответствует базовым грамматическим требованиям 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 следует ставить фигурные скобки, а не круглые скобки. Поскольку описание вашей проблемы неясно, я могу дать вам только упрощенный очень простой пример, чтобы показать возможное использование вашей проблемы.

Если упростить задачу:

Пароль имеет длину 6 и составляется только из цифр 0–9, и единственным ограничением является пароли не могут содержать последовательные повторяющиеся символы. >

Одним из возможных способов сделать это может быть: (следуя вашей идее, поскольку вы просили не давать полный ответ)

Сначала сгенерируйте все возможные пароли длиной 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) наборов ответов, один из них может быть

окончательный_пароль(1,6) окончательный_пароль(2,4) окончательный_пароль(3,9) окончательный_пароль(4,2) окончательный_пароль(5,2) окончательный_пароль(6,3)

Первое число final_password означает позицию числа, а второе — значение. Поэтому соответствующий пароль — 649223.

Это явно не соответствует ограничению неповторяемости последовательно. Итак, мы добавляем ограничения:

:- final_password(P, V), final_password(Q, V), Q = P + 1. %constraint(A)

На этот раз количество наборов ответов уменьшено до 590490, а предыдущий набор неправильных ответов устранен ограничением (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.

person BobHU    schedule 05.04.2020