ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.06.2019

Просмотров: 147

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторная работа № 2

(№ 9 по списку и инд. вариант t= 9 )

Студента группы ИТ 14-1

Красовский Абхай Владленович

Построение конечного автомата – распознавателя для заданного регулярного множества

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


Теоретические сведения


Конечный автомат (в дальнейшем КА) – абстрактное вычислительное устройство с фиксированным и конечным объемом памяти, которое на входе читает цепочки (последовательности символов некоторого алфавита), а на выходе сообщает об их принадлежности к некоторому множеству, для распознания которого он построен.

Состояния s и t двух различных конечных автоматов эквивалентны тогда и только тогда, когда первый КА, начав работу из состояния s, будет допускать те же цепочки, что и второй КА, начав работу из состояния t. Если эти состояния начальные, то эти автоматы эквивалентны (т.е. будут распознавать одни и те же множества).

Два состояния конечного автомата эквивалентны тогда и только тогда, когда, начав работу из этих состояний, конечный автомат будет допускать одни и те же цепочки.

Недостижимыми называются такие состояния КА, которые не могут быть достигнуты из начального состояния воздействием любых входных символов.

Ход работы


Построить конечный автомат (КА–распознаватель) для распознания регулярного множества цепочек трехсимвольного алфавита в соответствии с вариантом и реализовать его в виде программы на С++ .

t

Описание регулярного множества

9

Содержит не более двух символов «с», начинается на «ас», а символы «а» встречается только по одному



1.Диаграмма переходов









2.Таблица переходов

a

b

c

˧

1

2

E

E

0

2

E

E

3

0

3

4

3

5

1

4

E

3

5

1

5

6

7

E

1

6

6

5

E

1

7

6

5

E

1



3.Полное описание

= {a, b, c, ˧}

S = {1, 2, … 7}

= {3,4,5,6,7}

4.Поиск недостижимых состояний











5.Поиск эквивалентных состояний







a

b

c

˧

1

2

E

E

0

2

E

E

3

0

3

4

3

5

1

4

E

3

5

1

5

6

6

E

1

6

6

5

E

1

















6. Проверка работы КА

Обрабатываемая

цепочка

Обрабатываемый символ

Текущее состояние

Новое

состояние

acbbacb ˧

a

1

2

cbbacb ˧

c

2

3

bbacb ˧

b

3

3

bacb ˧

b

3

3

acb ˧

a

3

4

cb ˧

c

4

5

b ˧

b

5

6

˧

˧

6

да



7 .Блок-схема



8.Код

#include "iostream"

#include "conio.h"

#include "windows.h"


#define N 100


using namespace std;


void main()

{

SetConsoleOutputCP(1251);

SetConsoleCP(1251);

char input[N];

int S = 1, dop = 1;

cout << "Ввсти строку" << endl;


cin.getline(input, N);

for (int i = 0; i < strlen(input); i++)

{

if (input[i] == 'a' && S == 1) S = 2; //По a S1 -> S2

else

if (input[i] == 'c' && S == 2) S = 3; //По c S2 -> S3

else

if (input[i] == 'a' && S == 3) S = 4; //По a S3 -> S4

else

if (input[i] == 'b' && S == 3) S = 3; //По b S3 -> S3

else

if (input[i] == 'c' && S == 3) S = 5; //По c S3 -> S5

else

if (input[i] == 'b' && S == 4) S = 3; //По b S4 -> S3

else

if (input[i] == 'c' && S == 4) S = 5; //По c S4 -> S5

else

if (input[i] == 'a' && S == 5) S = 6; //По a S5 -> S6

else

if (input[i] == 'b' && S == 5) S = 6; //По b S5 -> S6

else

if (input[i] == 'b' && S == 6) S = 5; //По b S6 -> S5

else

if (input[i] == 'b' && S == 6) S = 5; //По b S6 -> S5

else

if (input[i] == 'a' && S == 6) S = 6; //По a S6 -> S6

else

{

dop = 0;

break;

}

}

if (dop == 1) //Если dop = 1 – цепочка допущена

cout << "Цепочка удолетворяет условие" << endl;

else

cout << "Цепочка не удолетворяет условие" << endl;

cout << input;

_getch();

}

9.Результат

10.Вывод: выработал навык построения и минимизации конечных автоматов для распознания регулярного множества цепочек.






Смотрите также файлы