Программирование набора ответов: как назначить номера так, чтобы в одном и том же пароле не было двух последовательных символов или целых - PullRequest
0 голосов
/ 25 марта 2020

Создайте модель ASP, которая создает все возможные пароли с учетом следующих ограничений на пароли. Сколько паролей существует?

Пожалуйста, не комментируйте ответ, а просто скажите, где в этой процедуре ошибочно указано мое решение go.


NV = 1.. N.   %numerical values
sc = #;*;$;!; %special characters
c = 1..c.     %characters 
pcn = 1..cn.  %password character numbers

2.) Пароли должны содержать не менее 4 символов и не более 6 символов с сочетанием цифр c и специальных символов.

:-Pass(P #count (cn : in(p,cn)) < 4.
:-Pass(P #count (cn : in(p,cn)) > 6.

3.) Пароли должны содержать хотя бы одну цифру c символа.

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.) Пароли должны содержать хотя бы одну цифру c от 9 до 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.



1 Ответ

0 голосов
/ 05 апреля 2020

Ваш код не соответствует базовому c грамматическому требованию CLIN GO. Например, в первой части, когда вы объявляете все возможные варианты выбора отдельных элементов в пароле, вы должны определить их как предикаты, например

number(0..9).
sc("#";"*";"$";"!").

Обратите внимание, что специальные символы должны заключаться в кавычки как строки в КЛИНЕ GO. И я понятия не имею, что вообще значит c = 1..c? Кроме того, character number означает длину символа или положение символа? В любом случае, они должны рассматриваться как факты в CLIN GO.

Далее следуют ограничения. Использование #count также неверно:

:-Pass(P #count (cn : in(p,cn)) < 4.

Взять эту строку в качестве примера, Pass(...) означает, что Pass является предикатом или функцией, однако все предикаты в CLIN GO имеют быть строчными. #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) наборов ответов, один из которых может быть

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

Далее, если вам требуется, чтобы число элементов цифр c в пароле было больше 3, мы могли бы добавить

:- #count{number(N) : final_password(P, N)} <=3.

Кажется, вы не знакомы с базовой c грамматикой CLIN GO. С синтаксисом CLIN GO вы можете обратиться к официальной документации CLIN GO Руководство .

...