Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Теория вычислительных процессов. Лабораторный практикум. Учебное пособие
.pdf
51
0
K
},{
2
0
1
00
KKK
},,{
531
1
0
aaaK
},{
42
2
0
aaK
1
K
1
0
K
2
0
K
a1
a3
a5
a2
a4
z1
2
0
K
2
0
K
2
0
K
2
0
K
2
0
K
z2
1
0
K
1
0
K
1
0
K
1
0
K
1
0
K
a1
a2
z1
z2
z1
z2
w2
w1
Поиск разбиения на классы эквивалентных состояний множества состоя-
ний автомата Мура отличается только тем, что на первом шаге формируется разбиение на классы 0-эквивалентных состояний. Например, разбиение
на классы 0-эквивалентных состояний автомата Мура (рис. 9)
представляет собой
, где
и
, т.
к. (a1) = (a3) = (a5) = w1 и (a2) = (a4) = w2.
Для определения разбиения
на классы 1-эквивалентных состояний
строим таблицу переходов из состояний в классы 0-эквивалентных состояний (табл. 10), в клетках которой вместо состояния перехода записывается класс 0-эквивалентных состояний, которому принадлежит состояние
перехода.
Таблица 10
Таблица переходов в классы 0-эквивалентных состояний
Состояния, принадлежащие одному и тому же классу 0-эквивалентных состояний и имеющие в таблице переходов в классы 0- эквивалентных состояний одинаковые столбцы, объединяются в класс 1эквивалентных состояний. По таблице 10 видим, что все 0-эквивалентные состояния являются 1-эквивалентными, поэтому классы 0-эквивалентных состояний совпадают с классами 1-эквивалентных состояний.
Классы 0-эквивалентных состояний представляют собой классы эквивалентных состояний. Затем из каждого класса эквивалентных состояний
оставляем по одному состоянию и выполняем построения, описанные
выше для автоматов Мили. В результате получаем граф автомата Мура
(рис. 17), в котором нет ни одной пары эквивалентных состояний и состояний, недостижимых из начального, поэтому он является минимальным.
Рис. 17. Граф минимального автомата Мура
Контрольные вопросы

52
1. Дайте определение конечного автомата Мили и Мура. Чем они от-
личаются друг от друга?
2. Назначение автоматов Мили и Мура.
3. Дайте определение полностью и частично определенного автомата
Мили и Мура.
4. Что является областью определения функции, которую вычисляет
полностью определенный автомат Мили и Мура?
5. Задайте автомат Мили одной таблицей.
6. Чем различаются графы автоматов Мили и Мура?
7. Как получить значение функции на заданном аргументе, вычисляе-
мой автоматом Мура?
8. Постройте машину Тьюринга, функционально эквивалентную за-
данному автомату Мили.
9. Постройте машину Тьюринга, функционально эквивалентную за-
данному автомату Мура.
10. Установите связь между одноленточными автоматами и автомата-
ми Мура.
11. Определите алгоритмы трансформации автоматов при табличном
способе задания автоматов.
12. Трансформируйте автомат Мили с одним состоянием в автомат
Мура.
13. Дайте определения эквивалентности состояний и автоматов Мили
и Мура.
14. В чем различие деревьев проверки эквивалентности состояний ав-
томатов Мили и Мура.
15. Как найти слово, различающее неэквивалентные автоматы?
16. С помощью дерева проверки эквивалентности состояний опреде-
лите, являются ли заданные состояния k-эквивалентными для заданного k.
17. Определите максимальное количество вершин в дереве проверки
эквивалентности состояний одного автомата.
18. Определите максимальное количество вершин в дереве проверки
эквивалентности автоматов.
19. Определите максимальное количество шагов выполнения алгорит-
ма поиска разбиения множества состояний автомата на классы эквивалентных состояний.
20. Предложите метод экспериментальной проверки эквивалентности
автоматов (Дано: два автомата с одинаковым алфавитом как «черные
ящики» и количество состояний каждого автомата).

53
Л а б о р а т о р н а я р а б о т а № 4
Схемы программ
Цель работы: изучить стандартные и рекурсивные схемы программ, их
основные свойства, научиться транслировать схемы одного
класса в схемы другого класса.
З а д а н и е
1. Изучить основные понятия:
— схемы программ;
— базис, интерпретация, программа, протокол выполнения
программы;
— свойства схем программ: пустота, тотальность, функциональная
эквивалентность, свобода;
— свободные интерпретации, согласованные свободные
интерпретации;
— стандартные и рекурсивные схемы программ;
— изоморфизм и логико-термальная эквивалентность стандартных
схем.
2. Изучить алгоритмы трансляции стандартных и рекурсивных схем
программ.
3. Разработать нерекурсивный алгоритм решения задачи (см.
«Варианты заданий)и программно реализовать его.
Построить стандартную схему программы.
Транслировать стандартную схему программы в рекурсивную.
Реализовать рекурсивную программу.
Провести тестирование программ.
Варианты заданий
1. Найти наибольший общий делитель двух чисел (можно
использовать алгоритм Евклида)
2. Найти n-й член последовательности Фибоначчи (a1 = a2 = 1; an
= a
+ a
n – 2
, n > 2).
n – 1
3. Найти сумму первых n членов последовательности Фибоначчи.
4. Определить, является ли заданное число членом
последовательности Фибоначчи.
5. Найти наибольший простой делитель заданного числа.
6. «Перевернуть» заданное число.
7. Определить, является ли заданное число палиндромом.
8. Найти сумму простых делителей заданного числа.

54
9. Найти сумму первых n простых чисел.
10. Найти максимальную цифру в числе.
Т е о р е т и ч е с к и е с в е д е н и я
Программа является одним из способов задания алгоритмов. Схема
программы — это математическая модель программы, удовлетворяющая
обычным требованиям модели:
— позволяет изучать свойства широких классов программ, а не от-
дельных конкретных программ;
— сохраняет все интересующие свойства и особенности рассматрива-
емого класса программ;
— позволяет игнорировать несущественные свойства, например син-
таксические.
Схема программы, так же как и программа , может быть представлена
в виде текста на некотором формализованном языке. Главное отличие
схем от программ состоит в следующем. Арифметические, логические и
другие выражения программы образуются с помощью символов операций, функций, семантика которых определена языком программирования
(для базовых операций) или выводима по определенным правилам из семантики базовых операций. Поэтому каждый оператор программы единственным образом задает некоторую функцию над данными, а из этих
функций образуется вычислимая функция, задаваемая программой в целом. В схемах же, операции и функции заменены абстрактными, не имеющими смысла, символами. Если вместо каждого символа подставить
конкретную функцию, то схема превращается в программу. Существует
множество различных вариантов подстановки конкретных функций, и
каждый вариант дает новую программу, но все, полученные таким образом программы, обладают общими свойствами, характерными для данной
схемы. Схема, в отличие от программы, не задает алгоритма, и с ее помощью нельзя что-либо вычислить.
Существуют различные классы схем программ: простейшие — стан-
дартные схемы программ, их расширения — обогащенные схемы, которые получаются из стандартных путем добавления определенных элементов (структур данных, процедур и т. д.), структурированные и рекурсивные схемы.
Стандартные схемы программ
Стандартная схема может быть представлена в линейной форме в виде
текста на некотором формализованном языке или в графовой форме. Обозначения (символы), используемые в представлении схемы, образуют

55
базис. Любую стандартную схему можно описать используя обозначения
из полного базиса, который состоит из множества операторов и четырех
непересекающихся множеств символов:
1) X = {x, x1,…, y, y1,…, z, z1,…} — переменные;
2) F = {f0, f1, f2,…, g0, g1, g2,… h0, h1, h2,…} — функциональные симво-
лы, верхний индекс — местность символа, нульместные символы — константы, обозначаются a, b, c,…;
3) P = {p0, p1, p2,…, q0, q1, q2,…} — предикатные символы, нульмест-
ные символы — логические константы 0 и 1;
4) {старт, стоп, (, ), ,, :=} — специальные символы.
Из символов можно строить слова:
1) термы (функциональные выражения) — это слова, образованные по
следующим правилам:
1) переменная или константа — терм;
2) слово вида fn (
,
,…,
), где
,
,…,
1
2
n
1
— термы — терм.
2
n
Например, термами являются слова: x, f0, a, f1 (x), g2 (x, h3 (x, f1 (x), a);
2) тесты (логические выражения) — это слова вида pn (
,
,…,
1
).
2
n
Например, тестами являются слова: p0, p1 (x), p3 (x, f1 (x), a), q1 (f2 (x, y).
Множество операторов состоит из пяти операторов:
1) старт (x1, x2,…, xk), где k ≥ 0, x1, x2,…, xn — попарно различные пе-
ременные из множества X, называются результатами этого оператора;
2) стоп (
,
,…,
2
), где n ≥ 0,
n
1
,
,…,
1
— термы; вхождения пере-
2
n
менных в термы называются аргументами этого оператора;
3) оператор присваивания — слово вида x := , где x — результат
оператора, а переменные, входящие в — аргументы оператора;
4) условный оператор — тест (логическое выражение), переменные,
входящие в тест — аргументы оператора;
5) петля.
Стандартную схему можно представить графом, содержащим пять
типов вершин, соответствующих операторам схемы (рис. 18). Начальная
вершина соответствует оператору старт. Изображается прямоугольником, в который вписывается оператор старт. В нее не входят дуги и выходит только одна дуга. Заключительная вершина соответствует оператору стоп. Изображается прямоугольником, в который вписывается оператор стоп. В нее входят дуги, но не выходят. Входящих дуг может быть
несколько. Вершина преобразователь соответствует оператору присваивания. Изображается прямоугольником, в который вписывается оператор
присваивания. В нее входят дуги (не менее одной), а выходит только одна
дуга. Вершина распознаватель соответствует условному оператору.
Изображается овалом, в который вписывается тест. В нее входят дуги

56
0
1
. . .
pn (
1
,
2
,…,
n
)
стоп (
1
,
2
,…,
n
)
. . .
старт (x1, x2,…, xk)
x :=
. . .
петля
. . .
(не менее одной), а выходят две дуги, одна из них отмечается нулем, другая — единицей. Вершина петля соответствует оператору петля. Изображается прямоугольником, в который вписывается оператор петля. В нее
входят дуги, но не выходят.
Рис. 18. Типы вершин графа стандартной схемы
Вершины в графе стандартной схемы нумеруются. Пример стандартной схемы в графовой форме представлен на рис. 19. Линейную форму
стандартной схемы легко получить из графовой. Множество специальных
символов расширяется дополнительными символами {:, на, если, то, ина-
че}. Линейная форма представляет собой последовательность инструкций, которая строится следующим образом:
1) если выходящая дуга из начальной вершины с оператором старт
(x1, x2,…, xk) ведет к вершине с меткой l, то начальной вершине соответствует инструкция
0: старт (x1, x2,…, xk) на l;

57
0
старт (x)
y := a
стоп (y)
p (x)
y := g(x, y)
x := h(x)
1
1
2
3
4
5
2) если вершина схемы с меткой l — преобразователь с оператором x
:= , выходящая дуга которой ведет к вершине с меткой l1, то этому пре-
образователю соответствует инструкция
l: x := на l1;
3) если вершина схемы с меткой l — заключительная с оператором
стоп (
,
,…,
1
), то этой вершине соответствует инструкция
2
n
l: стоп (
,
,…,
1
2
n
);
4) если вершина схемы с меткой l — распознаватель с условием p
(
,
,…,
1
), причем дуга, отмеченная единицей ведет к вершине с мет-
2
n
кой l1, а дуга, отмеченная нулем ведет к вершине с меткой l0, то этому
распознавателю соответствует инструкция
l: если pn (
,
,…,
1
) то l1 иначе l0;
2
n
5) если вершина схемы с меткой l — петля, то ей соответствует ин-
струкция
l: петля.
Рис. 19. Стандартная схема программы в графовой форме
n
Если в графовой форме стандартной схемы n вершин, то в линейной
форме ей соответствует последовательность из n инструкций. Ниже пред-

58
ставлена линейная форма схемы, соответствующая графовой форме на
рис.19:
0: старт (x),
1: y := a,
2: если p (x) то 5 иначе 3,
3: y := g(x, y) на 4,
4: x := h(x) на 2,
5: стоп (y).
Обозначения, используемые в представлении схемы S, образуют базис
схемы S, который является подмножеством полного базиса стандартных
схем.
Конечное множество переменных, используемых в схеме S, составляет
ее память XS. Обозначим арг(v) — множество переменных-аргументов
оператора v, рез(v) — множество переменных-результатов оператора v.
Переменная x задана на дуге e, если любой путь от начальной вершины до
вершины в конце дуги е с оператором кон(e), содержит хотя бы один
оператор с результатом x. Схема S правильная, если на каждой ее дуге
заданы все переменные из множества арг(кон(e)). Это соответствует тому,
что любая переменная должна быть инициализирована до ее использования.
Интерпретация
Пусть задан базис B, в котором определен класс стандартных схем.
Интерпретацией базиса B в области интерпретации D называется функ-
ция I, которая сопоставляет:
1) каждой переменной x B элемент d D (d = I(x));
2) каждой константе a B элемент d D (d = I(a));
3) каждому функциональному символу fn (n ≥ 1) — функцию
Fn = I(fn) : Dn D;
4) каждой логической константе p0 — элемент множества {0, 1);
5) каждому предикатному символу pn (n ≥ 1) — предикат
Pn = I(pn) : Dn {0, 1}.
Пара (S, I), где S — схема, а I — интерпретация ее базиса, называется
интерпретированной стандартной схемой, или программой.
Состоянием памяти программы (S, I) называется функция
W: XS D, которая каждой переменной x из памяти схемы сопоставляет
элемент из области интерпретации. W(x) — это значение переменной x в
состоянии памяти W. Начальное состояние памяти XS при интерпретации
I — W0, такое, что W0 (x) = I(x) для любой x XS.

59
Значение терма при интерпретации I и состоянии памяти W опреде-
ляется следующим образом:
W(x), если = x;
(W) = I(a), если = a;
I
I(fn) (
(W),
Значение теста = pn (
1 I
1
(W),…,
2 I
,
,…,
2
(W)), в остальных случаях.
n I
), n ≥ 1, при интерпретации I и состо-
n
янии памяти W определяется следующим образом:
I(W) = I(pn) (
1 I
(W),
(W),…,
2 I
n I
(W)).
Выполнение программы
Конфигурацией программы называют пару u = (l, W), где l — метка
вершины схемы, W — состояние памяти. Если l — метка вершиныраспознавателя и значение предиката в этой вершине в состоянии памяти
W равно 1, то конфигурацию будем записывать как (l1, W), а если
значение предиката равно 0, то — (l0, W). Выполнение программы
описывается конечной или бесконечной последовательностей
конфигураций, которую называют протоколом выполнения программы.
Протокол (u0, u1,..., ui, u
,...) выполнения программы (S, I)
i + 1
определяется следующим образом (ниже ki означает метку вершины, а Wi
— состояние памяти в i-й конфигурации протокола, ui = (ki,Wi)):
u0 = (0, W0), W0 — начальное состояние памяти схемы S при
интерпретации I.
Пусть ui = (ki, Wi) — i-я конфигурация протокола выполнения
программы, а О — оператор схемы S в вершине с меткой ki. Если О —
заключительный оператор стоп (
,
,…,
1
2
), то ui — последняя
n
конфигурация протокола (протокол конечен). В этом случае считают,
что, программа (S, I) останавливается, а последовательность значений
),
),…,
1 I(Wi
2 I(Wi
) является результатом val(S, I) выполнения
n I(Wi
программы (S, I). В противном случае, т. е. когда О — не заключительный
оператор, в протоколе имеется следующая, (i + 1)-я конфигурация u
(k
, W
i + 1
), причем
i + 1
i + 1
=
а) если О — начальный оператор, а выходящая из него дуга ведет к
вершине с меткой l, то k
i + 1
= l и W
i + 1
= W i;
б) если О — оператор присваивания х := τ, а выходящая из него дуга
ведет к вершине с меткой l, то k
в) если О — условный оператор и
i + 1
= l и W
i + 1
= Wi, W
I(Wi
(x) =
i + 1
I(Wi
) = Δ, где Δ 0,1, а
);
выходящая из него дуга, отмеченная символом Δ ведет к вершине с
меткой l, то k
г) если О — оператор петли, то k
i + 1
= lΔ и W
i + 1
= W i;
i + 1
= k i и W
= W i, в этом случае
i + 1
протокол бесконечен.

60
Номер
конфигурации
Метка
Состояние памяти
x y 0 0 4 0 1 1 4 1 2
20 4 1
3 3 4
4
4 4 3 4 5
20 3 4 6 3 3 12 7 4 2 12
8
20 2 12
9 3 2
24
10 4 1
24
11
20 1 24
12 3 1
24
13 4 0
24
14
21 0 24
15 5 0
24
I1(p)(x) =
I2(h)( ) =
Таким образом, программа останавливается тогда и только тогда,
когда протокол ее выполнения конечен. В противном случае программа
зацикливается и результат ее выполнения не определен.
Ниже приведены примеры различных интерпретаций I1 и I2 базиса одной и той же стандартной схемы S (рис. 19) и протоколы программ (S, I1)
(табл. 11) и (S, I2) (табл. 12).
Интерпретация I1:
D1 — множество всех целых неотрицательных чисел;
I1(x) = 4; I1(y) = 0; I1(a) = 1;
I1(g)(x, y) = x * y;
I1(h)(x) = x – 1;
1, если x = 0
0, если x 0
Таблица 11
Протокол выполнения программы (S, I1)
второго слова;
Интерпретация I2:
D2 — множество всех слов в алфавите {a, b, c};
I2(x) = abc; I2(y) = — пустое слово; I2(a) = ;
I2(g)(x, ) = x — приписывает первую букву первого слова к началу
I2(h)(x) = — стирает первую букву слова;
1, если =
0, если
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
