- •Введение
- •1. Грамматики, автоматы и контекстно-свободные языки
- •If выражение then if выражение then другой_оператор else другой_оператор
- •2. Грамматики, машины тьюринга и перечислимые языки
- •3. Теория алгоритмов и рекурсивных функций
- •4. Теория сложности
- •Мы определяем ее через
- •5. Упражнения
- •Рекомендуемая литература
- •Содержание
5. Упражнения
-
Постройте для входного алфавита = {0,1} конечный автомат A, который принимает язык L = || A || = {w w {01}*, w – двоичное представление натурального числа, делящегося на 3}. Для простоты можно положить, что представляет 0 и что разрешены ведущие нули.
Решение. 3 состояния Q = {0,1,2} представляют классы вычетов по модулю 3. Чтение цифры 0 означает умножение на 2 по модулю 3, чтение цифры 1 означает умножение на 2 и сложение с 1 по модулю 3. Это приводит к следующему автомату:
-
(a) Постройте наименьший недетерминированный конечный автомат A с входным алфавитом = {a,b,c}, такой, что || A || = {a,b,c}*abc{a,b,c}*.
Решение.
Поскольку автомат с не более чем тремя состояниями, принимающий слово abc, при принятии этого слова должен делать «петлю» (т.е. по крайней мере одно состояние в последовательности при принятии abc будет встречаться дважды), то должно быть принято по крайней мере одно слово длины меньше 3. Отсюда следует, что указанный автомат является наименьшим из возможных.
(b) Детерминируйте этот автомат.
Решение. Рассмотрите функцию перехода Q P (Q) и продолжите её до функции : P (Q) P (Q):
|
a |
b |
c |
q0 q1 q2 q3 |
q0q1 ø ø q3 |
q0 q2 ø q3 |
q0 ø q3 q3 |
q4: q0q1 q5: q0q2 q6: q0q3 q7: q0q1q3 q8: q0q2q3 |
q0q1 q0q1 q0q1q3 q0q1q3 q0q1q3 |
q0q2 q0 q0q3 q0q2q3 q0q3 |
q0 q0q3 q0q3 q0q3 q0q3 |
Это дает автомат:
Рассматривая состояния q6, q7 и q8, можно видеть, что все эти состояния являются конечными и при чтении любого из символов a, b или c автомат остается в пределах этих состояний, поэтому эти три состояния могут быть объединены в состояние q:
-
Постройте детерминированный конечный автомат A, который принимает только те слова над алфавитом = {0,1}, которые содержат нечетное число символов 0 и заканчиваются на 11.
Решение. Недетерминированный автомат строится непосредственно:
Детерминация этого автомата путем продолжения функции перехода дает:
-
0
1
q0
q1
q0
q1
q0
q1q2
q2
ø
q3
q3
ø
ø
q4: q1q2
q0
q1q2q3
q5: q1q2q3
q0
q1q2q3
и отсюда:
-
Укажите конечный автомат A с входным алфавитом = {a, b}, такой, что ||A|| = {w {a, b}* w содержит подслово aa, но не содержит подслово bb}.
Решение. Следующая структура автомата
может быть просто продолжена до:
-
Докажите, что не существует конечный автомат A, такой, что ||A|| = L = {aibi i}. (Отсюда следует, что L не является регулярным.)
Доказательство. Предположим, что существует конечный автомат A = (Q,,,q0,F) c n состояниями, такой, что L = ||A||. Для каждого принимаемого слова wi = aibi рассмотрим последовательность состояний при принятии слова wi: при этом через qi обозначим состояние, которое будет достигнуто после обработки ai. Так как A имеет только n состояний, то отсюда следует, что по крайней мере два состояния из {qi | 1 I n} должны быть одинаковыми, например, должно выполняться: 0 qk ql n. Однако тогда A будет принимать слово albk c k l, что является противоречием к тому, что L = || A ||.
-
Докажите, что не существует конечный автомат A с входным алфавитом Σ = {a}, такой, что ||A|| = L = {ai² i}.
Доказательство. Предположим, что существует конечный автомат A = (Q,,,q0,F) c n состояниями, такой, что L = ||A||. Для каждого принимаемого слова wi = ai² рассмотрим последовательность состояний, достигаемых при принятии слова wi: при этом через qi обозначим состояние, которое будет достигнуто после обработки ai. Так как A обладает только n состояниями, отсюда следует, что по крайней мере два состояния из {qi | 1 i n + 1} должны быть одинаковыми, например: 1 qk ql n+1. Однако тогда будет приниматься слово w = al² – (l – k) c k < l из A. Справедливо также:
(l – 1)2 = l2 – (l – 1) – l l2 – (l – k) – l < l2 – (l – k) < l2,
а это означает, что w не является квадратом ни одного натурального числа и поэтому w не содержится в языке L. Это противоречие показывает, что L не может быть языком, принимаемым конечным автоматом A.
-
Укажите контекстно-свободную грамматику G с алфавитом терминальных символов Σ = {a, b}, такую, что L(G) = {anb2n| n > 3}.
Решение. G = ({S, T}, {a, b}, P, S), причем продукции P заданы следующим образом:
S → aaaaTbbbbbbbb,
T → aTbb,
T → ε.
-
Укажите контекстно-свободную грамматику G над Σ = {a, b, c}, которая порождает язык L = {aibjck| k i + j, i, j, k }.
Ответ. Из того соображения, что для каждого «впереди» читаемого символа a, соответственно b, «позади» может быть выведен символ c либо ε, получается грамматика G = ({S,T,C},{a,b,c},P, S), где продукции P заданы следующим образом:
S → aSC | T,
T → bTC | ε,
C → c | ε.
-
Укажите контекстно-свободную грамматику G над Σ = {a, b, c}, которая порождает язык L = {aibjck| i, j, k 0, j = 2i или i > k}.
Ответ. Рассматривая случаи j = 2i для i 1, i = j = 0 и i > k раздельно, получим, например, грамматику G = ({S, S1, S2, S3, T, U, B, C}, {a, b, c}, P, S), причем продукции P заданы следующим образом:
-
S → S1 | S2 | S3
S1 → aTbbS2
S2 → cS2 | ε
S3 → aU
T → aTbb | ε
U → aUC | B
B → bB | ε
C → c | ε
-
Укажите контекстно-свободную грамматику G над Σ = {a, b, c}, которая порождает язык L = {aibjck| i j или j k}.
Ответ. Рассмотривая случаи i > j, j > i, j > k и k > j раздельно, получим, например, грамматику G = ({S,T,U,A,B,C}, {a,b,c}, P, S), причем продукции P заданы следующим образом:
-
S → aATC | TbBC | AbBU | AUcC
T → aTb | ε
U → bUc | ε
A → aA | ε
B → bB | ε
C → cC | ε
Замечание. Так как можно показать, что язык = { aibjck | i }={a, b,c}*\L не является контекстно-свободным, здесь приведен пример, что дополнение контекстно-свободного языка не обязано быть контекстно-свободным.
-
Укажите линейно-контекстно-свободную грамматику G с алфавитом
Σ = {a, b}, которая порождает язык L = {a,b}*\{vm, v = anb | n1, m2}.
(Грамматика называется линейно-контекстно-свободной в том случае, если она содержит только продукции вида A → a1Ba2 и А → a, где A, B Ф и a,a1,a2 Σ ∪ { ε }.)
Решение. Можно заметить, что для каждого слова w L выполняется по крайней мере одно из следующих условий:
(а) w содержит подслово baibajb где i j;
(b) w начинается с aibajb, причем i j;
(с) w начинается с b;
(d) w заканчивается на a;
(е) w содержит подслово bb;
(f) w содержит только одно b;
(g) w является пустым словом.
Для каждого из этих случаев можно создать линейную контекстно-свободную грамматику Gi и в результате получить грамматику
G = ({S,S1,T1,U1,V1,W1,X1,S2,T2,U2,V2,W2,S3,T3,S4,T4,S5,T5,U5,V5,S6,T6,U6},{a,b},P,S),
где продукции P заданы следующим образом:
-
S → S1 | S2 | S3 | S4 | S5 | S6 | ε
S1 → S1a | S1b | X1
X1 → aX1 | bX1 | T1
T1 → bU1b | bW1b
U1 → aU1 | aV1
V1 → aV1a | b
W1 → W1a | V1a
S2 → S2a | S2b | T2
T2 → U2b | W2b
U2 → aU2 | aV2
V2 → aV2a | b
W2 → W2a | V2a
S3 → bT3
T3 → aT3 | bT3 | ε
S4 → T4a
T4 → T4a | T4b | ε
S5 → aS5 | bS5 | T5
T5 → T5a | T5b | U5
U5 → bV5b
V5 → ε
S6 → aS6 | T6
T6 → T6a | U6
U6 → b
12. Покажите: если L * контекстно-свободный и a , то и : = LLRa также контекстно-свободный (LR = {wR | w L}, wR – зеркальное отражение w).
Решение. Пусть язык L порождает контекстно-свободную грамматику G = (, , P, S). Легко видеть, что контекстно-свободная грамматика GR: = (, , PR, S), где продукции P заданы следующим образом:
T → 1…n P, i и T T → n…1 PR,
порождает язык LR. Обозначим теперь через и две независимых копии , таким образом, A A A для всех A . Тогда контекстно-свободная грамматика = ({ S }, , {S → S S a P P }, S) порождает язык , причем продукции P и P определены следующим образом:
P есть копия P, где в продукциях из P каждая встречающаяся переменная A замещается соответствующей переменной A ;
P есть копия PR, где в продукциях из PR каждая встречающаяся переменная A замещается соответствующей переменной A .
-
(a) Постройте для языка L={anbn│n } контекстно-свободную грамматику в нормальной форме Грайбах.
Решение. G = ({S, B}, {a, b}, P, S), где продукции P заданы посредством:
S → aSB │ε
B → b
(b) Укажите магазинный автомат P, который принимает язык L через конечное состояние и пустую магазинную ленту.
Решение. P= ({q}, {a, b}, {S, B}, δ, q, S, {q}), где функция перехода δ задана следующим образом:
-
δ(q, a, S) = {(q, SB)}
δ (q, ε, S) = {(q, ε)}
δ(q,b, B) = {(q, ε)}
Автомат представлен следующей схемой:
ε
(c) Укажите детерминированный магазинный автомат P’, который принимает язык L’= {anbn │n ≥ 1} через конечное состояние и пустую магазинную ленту.
Решение. Следует рассмотреть, к примеру, контекстно-свободную грамматику G’ = ({S, B}, {a, b}, P, S) с продукциями P:
-
S → aB
B → aBb│b
Эта грамматика порождает L’ и приводит к детерминированному магазинному автомату P’ = ({q}, {a, b}, {S, B, b}, δ, q, S, {q}), где функция перехода задана следующим образом:
δ(q, a, S) = {(q, B)}
δ(q, a, B) = {(q, Bb)}
δ(q, b, B) = {(q, ε)}
δ(q, b, b) = {(q, ε)}
Автомат представлен следующей схемой:
(d) Укажите детерминированный магазинный автомат P’’, который принимает язык L’’= L через конечное состояние.
Решение. Исходя из автомата, полученного в пункте (с), можно построить следующий детерминированный автомат, который принимает L через конечное состояние:
(bbX,
q1) (bbbX,
q1)
-
(a) Постройте для языка L = {wawR│w{a, b}*} контекстно-свободную грамматику в нормальной форме Грайбах. (w = a1a2...an, ai wR = anan-1...a1)
Решение. G = ({S, A, B}, {a, b}, P, S), где продукции P заданы следующим образом:
S → a│aSA│bSB A → a
B → b
(b) Укажите магазинный автомат P, который принимает язык L через конечное состояние и пустую магазинную ленту.
Решение. P = ({q}, {a, b}, {S, A, B}, δ, q, S, {q}), где функция перехода δ задана следующим образом:
δ(q, a, S) = {(q, ε), (q, SA)}
δ(q, b, S) = {(q, SB)}
δ(q, a, A) = {(q, ε)}
δ(q, b, B) = {(q, ε)}
-
(a) Постройте для L = {ww’ {a, b}*│w ≠w’R и w = w’} контекстно-свободную грамматику в нормальной форме Грайбах.
Решение. G = ({S, T, A, B}, {a, b}, P, S), где продукции P заданы следующим образом:
S → aSA │ bSB │ aTB │ bTA
T → aTA │ bTB │ aTB │bTA│ε
A → a
B → b
(b) Укажите магазинный автомат P, который принимает язык L через конечное состояние и пустую магазинную ленту.
Решение. P=({q}, {a, b}, {S, T, A, B}, δ, q, S, {q}), где функция перехода δ задана следующим образом:
-
δ(q, a, S) = {(q, SA), (q, TB)}
δ(q, a, A) = {(q, ε)}
δ(q, b, S) = {(q, SB), (q, TA)}
δ(q, a, B) = {(q, ε)}
δ(q, a, T) = {(q, TA), (q, TB)}
δ(q, ε, T) = {(q, ε)}
δ(q, b, T) = {(q, TA), (q, TB)}
-
Постройте для языка L = {aibjak│i, j, k 0, i + k = j} магазинный автомат, такой, что P = L.
Решение. Следует рассмотреть контекстно-свободную грамматику G = = ({S,T, A, B}, {a, b}, P, S), где продукции P заданы следующим образом:
S → aBT
B → aBb │b
T → bA
A → bAa │ a
Исходя из этого строят магазинный автомат P = ({q}, {a, b}, {S, T, A, B, a, b}, δ, q, S, {q}), где функция перехода δ задана следующим образом:
-
δ(q, a, S) = {(q, BT)}
δ(q, b, A) = {(q, Aa)}
δ(q, a, B) = {(q, Bb)}
δ(q, a, A) = {(q, ε)}
δ(q, b, B) = {(q, ε)}
δ(q, a, a) = {(q, ε)}
δ(q, b, T) = {(q, A)}
δ(q, b, b) = {(q, ε)}
Автомат представлен следующей схемой:
-
Постройте для входного алфавита = {a, b} магазинный автомат P, такой, что P = L = {w*│w содержит одинаковое число символов a и b}.
Решение. Вариант 1. Исходя из грамматики G = ({S}, {a, b}, P, S) с продукциями P
-
S → aSbS │bSaS │ε
строят магазинный автомат P = ({q}, {a, b},{S, a, b}, δ, S, {q}), где функция перехода δ задана следующим образом:
-
δ(q, a, S) = {(q, SbS)}
δ(q, a, a) = {(q, ε)}
δ(q, b, S) = {(q, SaS)}
δ(q, b, b) = {(q, ε)}
δ(q, ε, S) = {(q, ε)}
Вариант 2. Можно непосредственно построить магазинный автомат, если заметить, что требуется только отметить «перевес» символов a или b на магазинной ленте. Это приводит к автомату P = ({q}, {a, b}, { p0, p1, p2}, δ, p0, {q}), где:
-
δ(q, a, p0) = {(q, p1p0)}
δ(q, b, p0) = {(q, p2p0)}
δ(q, a, p1) = {(q, p1p1)}
δ(q, b, p1) = {(q, ε)}
δ(q, a, p2) = {(q, ε)}
δ(q, b, p2) = {(q, p2p2)}
δ(q, ε, p0) = {(q, ε)}
Этот автомат изображен на следующей схеме:
-
Постройте грамматику Ван-Вайнгаардена G, которая «вычисляет» функцию сложения, то есть должно выполняться L(G) = {1m1n1m+n │m, n ≥ 0}.
Решение. На основе соглашений об обозначениях в данном пособии (все встречающиеся большие буквы есть метапонятия в Vm, все встречающиеся маленькие буквы и специальные знаки есть синтаксические знаки в Vz или терминальные символы в , S обозначается через start) достаточно для грамматики Ван-Вайнгаардена G = {Vz, Vm, , R, P, S} указать только множество метапродукций R и множество схем продукций P.
Грамматика Ван-Вайнгаардена, которая вычисляет функцию сложения, определена заданием R и P в нормальной форме Бэкуса.
R: |
|
|
P: |
|
A:: = 1A│ε |
|
start:: = A1 A2 A1 plus A2 |
|
A1:: = 1 A1│ε |
|
A1 plus A2:: = A1 A2 |
|
A2:: = 1 A2│ε |
|
1A:: = 1A |
|
|
|
ε:: = ε |
В качестве примера рассмотрим следующий вывод:
start 131213 plus 12 *131213 12 *131215
-
Постройте грамматику Ван-Вайнгаардена G, которая «вычисляет» функцию умножения, то есть должно выполняться L(G)={1m1n1m*n │m, n ≥ 0}.
Решение. Грамматика Ван-Вайнгаардена, которая вычисляет функцию умножения, определена заданием R и P в нормальной форме Бэкуса.
R: |
|
|
P: |
|
A:: = 1A│ε |
|
start:: = A1 A2 A1 mal A2 |
|
A1:: = 1 A1│ε |
|
mal A2:: = ε |
|
A2:: = 1 A2│ε |
|
1 A1 mal A2:: = A1 mal A2 A2 |
|
|
|
1A:: = 1A |
|
|
|
ε:: = ε |
Для примера рассмотрим следующий вывод:
start 121312 mal 13 *121312mal 13 12131 mal 1313 1213mal 13 13 13 121313 13*131216.
-
Постройте грамматику Ван-Вайнгаардена G, которая вычисляет функцию f(n): = n2, n, то есть должно выполняться: L(G) = {1n1n²│n ≥ 0}. Решение. Грамматика Ван-Вайнгаардена, которая вычисляет функцию f, определена заданием R и P в нормальной форме Бэкуса:
-
R:
P:
A:: = 1A│ε
start:: = A A quadrat
quadrat:: = ε
1A quadrat:: = A quadrat 1AA
1A:: = 1A
ε:: = ε
Для примера пусть задан следующий вывод:
start 1313 quadrat * 1313 quadrat 1312 quadrat 11212
131quadrat 111 11212 13quadrat 1 111 11212 131 13 15 *1319.
-
Постройте грамматику Ван-Вайнгаардена G, которая порождает язык L={anbncn│n }.
Решение. Грамматика Ван-Вайнгаардена G, которая порождает язык L, определена заданием R и P в нормальной форме Бэкуса:
-
R:
P:
A:: = 1A│ε
start:: = aAbAcA
a1A:: = aaA
a:: = ε
b1A:: = bbA
b:: = ε
c1A:: = ccA
c:: = ε
Для примера пусть задан следующий вывод:
start a11 b11 c11 a a1 b11 c11 aa1bb1 c11
aa1bb1cc1*aaabbbccc*aabbcc.
Замечание. Изменение правила для переменной start:
start:: = a b c
даёт L = { │ n } для фиксированных ki, mi.
-
Постройте грамматику Ван-Вайнгаардена G, которая порождает язык L = {aibi│i, j \0, НОД(i, j) = 1}.
Решение. Воспользуемся тем, что НОД(i, j) = НОД(i, j-i) для j i ≥ 1, соотв. НОД(i, j) = НОД(i-j, j) для j i ≥ 1 и НОД(1, k) = НОД(k, 1) = 1 для k≥1.
Грамматика Ван-Вайнгаардена, которая порождает язык L, определяется ниже заданием R и P в нормальной форме Бэкуса:
-
R:
P:
A:: = 1A│1
start:: = A bA A НОД B
B:: = 1B│1
A НОД B1A:: = A НОД B1
A1:: = 1A1│1
A1B НОД B :: = A1 НОД B
B1:: = 1B1│1
1 НОД B:: = ε
C:: = 1C│ε
A НОД 1 :: = ε
D:: = 1D│ε
a1C:: = a aC
a:: = ε
b1D:: = b bD
b:: = ε
В качестве примера пусть задан следующий вывод:
start a111 b11 111 НОД 11 *aaab11 111 НОД 11
* aaabb 111 НОД 11 aaabb 1 НОД 11 aaabb.
Предварительные замечания к машинам Тьюринга. Для решения следующих примеров мы применим модель машины Тьюринга, которая по сравнению с моделью, обсуждаемой в главе 2, является несколько ограниченной, – так называемую машину Тьюринга, связанную направлением. Пусть T = (Q, , , , q0, F) произвольная машина Тьюринга. Если существует переход (.,.) = (q,., L) (соответственно (.,.) = (q, …, R)), то будем говорить, что q достигается путем перехода влево (соответственно вправо). Отсюда возможно тогда, что состояние q достигается при переходе влево или при некотором другом переходе вправо. Машина Тьюринга, связанная направлением, есть такая машина, для которой подобное невозможно: каждое состояние q достигается всегда либо только переходом влево, либо вправо. (Нетрудно показать, что для каждой машины Тьюринга можно построить эквивалентную машину Тьюринга, связанную направлением (т.е. вычисляющую тот же набор функций, соответственно принимающую тот же самый язык.)
Преимущество машин Тьюринга, связанных направлением, состоит в том, что они (подобно конечным автоматам) позволяют графическое представление, которое обычно наглядней, чем простое табулирование функции перехода . При этом поступают следующим образом: каждому состоянию q соответствует узел, в который вписывается «L» или «R» в зависимости от того, достигается q всегда только переходом влево и соответственно только переходом вправо. Для каждого перехода (q, A) = (p, B, D), D{L, R} строят направленное ребро от узла q к узлу р, обозначаемое (А, В). Начальное состояние и конечные состояния (если такие имеются) обозначаются подходящим образом (как в конечных автоматах).
23. Постройте машину Тьюринга, которая для входного слова an, n 0 вычисляет двоичное представление числа n как слово над {0, 1}.
Решение. T = (Q, , , , q0, F), где Q = {q0, q1, q2, q3}, = {a},
Г = {a, 0, 1, e}, F = .
Функция перехода определена следующим образом:
-
(q0, e) = (q2, 0, L)
При вводе = а0 возвращается 0.
(q0, a) = (q1, a, R)
(q1, a) = (q1, a, R)
(q1, 0) = (q1, 0, R)
(q1, 1) = (q1, 1, R)
(q1, e) = (q2, e, L)
Головка передвигается на крайний справа, отличный от е символ. Если этот символ 0 или 1, то вычисление закончено.
(q2, a) = (q3, e, L)
(q3, a) = (q3, a, L)
Если это символ а, то он замещается на е, и головка передвигается влево до двоичного числа, стоящего перед группой символов а.
(q3, 0) = (q1, 1, R)
(q3, 1) = (q3, 0, L)
(q3, e) = (q1, 1, R)
К этому двоичному числу добавляется 1.
Графическое представление этой машины Тьюринга, связанной направлением, выглядит следующим образом:
(Так как начальное состояние q0 не достигается ни при каком переходе, для него не нужно вписывать никакого направления («L» или «R») или можно было бы взять на выбор «R» или «L».)
24. Постройте машину Тьюринга, которая вычисляет следующую функцию:
f: ({a}*)2 {a}*, f(an, am) = an+m, n, m .
Решение. Простейшая машина Тьюринга, которая вычисляет f, есть Т = ({q}, {a}, {a, e}, , q, ), графическое представление которой задано в виде:
Поскольку нигде не определена, то qaneam для всех n, m есть конечная конфигурация. Так как qaneam * qaneam (0 шагов), то Т останавливается при любых входных словах (an, am) {a}* {a}* в конечной конфигурации qaneam. Поэтому для всех входных слов (an, am) {a}* {a}*:
fT, 2(an, am) = h(aneam) = anam = an+m = f(an, am).
Дополнительные замечания. Т вычисляет все функции f: ({a}*)k {a}*, f(, …, ) = , fT, k(, …, ) = h(e, …, e) = … = .
Если терминальный алфавит {a} машины Т заменить произвольным алфавитом , то можно показать, что полученная таким путем машина Тьюринга вычисляет все k-местные «функции сцепления» f: (*)k *, f(w1, …, wk) = w1…wk.
25. Постройте машину Тьюринга, которая вычисляет следующую функцию:
f: ({a}*)2 {a}*, f(an, am) = an m, n, m .
Решение. Следующая идея является отправным пунктом для построения.
При вводе (an, am) начальное содержимое ленты есть aneam. Машина стирает первую а в первой а-группе и записывает после аm слово Аm (А – символ ленты). Таким путем образуется an-1eamAm. Теперь снова самое первое а стирается и в конце слова дописывается Аm. Так образуется an‑2eamA2m. Этот процесс продолжается до тех пор, пока «не израсходуется» первая а-группа. Тем самым образуется amAnm. Напоследок все а стираются и все А заменяются на а, тем самым образуется anm = f(an, am). Машина Тьюринга, которая это реализует, есть T = ({0, 1, 2, 3, 4, 5, 6, 7}, {a}, {a, A, B, e}, , 0, ), где задана следующим графом:
Наглядное значение состояний 0,…, 7 следующее:
-
0
…
Стереть первое а первой а-группы.
1
…
Идти вправо до второй а-группы.
2
…
Первый символ а, для которого не происходит еще дописывание символов А, маркировать через В.
3, 4
…
В самом конце дописывать символ А, идти влево до маркировки В; удалить ее (т. е. В заменить снова на а); идти вправо в состояние 2.
5, 6
…
Если для всех а второй группы был дописан сзади А, то опять искать начало первой а‑группы и перейти в начальное состояние.
7
…
Заменить а не е, А на а.
26. Постройте машину Тьюринга, которая вычисляет следующую функцию:
f: {a, b}* {a, b}*, f(w) = wR, w {a, b}*
(wR обозначает зеркальное отражение w).
Решение. Следующая идея является отправным пунктом для построения.
Каждая буква входного слова w = c1 … cn, (ci {a, b}), за исключением последней, сдвигается на одну позицию вправо, последняя буква записывается перед с1 (т. е. на первоначальную позицию буквы с1). Таким путем образуется cnc1 … cn-1. Далее то же самое делается с c1 … cn-1 (при этом cn остается на ленте без изменений). Таким образом, образуется cn сn-1c1 … cn-2. Этот процесс повторяется до тех пор, пока «не израсходуется» входное слово. Так образуется cncn-1 … c1 = wR. Приводимая ниже машина Тьюринга Т вычисляет wR описанным способом: T = ({0, 1, 2, 3, 4}, {a, b}, {a, b, e}, , 0, ), где задана следующим графом:
Наглядное значение состояний 0,…, 4 следующее:
-
0
…
Сдвинуть слово от позиции головки вправо: стереть первый символ и сделать отметки в состоянии (1 «пометить а», 2 «пометить b»).
1, 2
…
Каждый следующий знак заменить на помеченный и одновременно пометить; последний знак не писать, а сделать отметку в состоянии (3 для а, 4 для b).
3, 4
…
Идти влево к началу сдвинутого слова и вписать туда последний символ; после этого – шаг вправо в начальное состояние. Процесс повторяется циклически.
27. Постройте машину Тьюринга, которая принимает следующий язык L:
L = {anb2nc3n | n } (L {a, b, c}*).
Решение. Исходным пунктом для построения является следующая идея.
Записанное на ленте слово попеременно пробегается слева направо, при этом (в указанной последовательности) символ а заменяется на А, два b – на В, три с – на С. (Если после замещения а на А выясняется, что больше не имеется в наличии двух b, соответственно трех с, машина останавливается, не принимая слово.) Как только не остается ни одного символа а, то процесс прерывается и проверяется, содержит ли оставшееся слово еще хоть один b или с. Лишь в том случае, если не содержит, машина останавливается в конечном состоянии.
T = ({0, 1, 2, 3, 4, 5, 6, 7, 8}, {a, b, c}, {a, b, c, A, B, C, e}, , 0, {8}),
где задана следующим графом:
Наглядное значение состояний 0,…, 8 следующее:
-
0, 7, 8
…
Если входное слово, то оно сразу принимается, т. е. переходят в конечное состояние 8 ( = а0b20c30). Если существует еще один символ а, то он заменяется на А и тем самым начинается выше описанный «пробег». Если больше не имеется ни одного а, то в состоянии 7 проверяется, имеются ли еще символы b или с, и если нет, то слово акцептируется.
1, 2
…
Заменить первые два b на В.
3, 4, 5
…
Заменить первые три с на С.
6
…
Идти налево к позиции после символа А, записанного последним.
28. Постройте машину Тьюринга, которая принимает следующий язык L:
L = {an | n } (L {a, b}*).
Решение. Отправным пунктом для построения является следующая идея.
Для принимаемого языка L справедливо, что L и что для всех n, m , an+1bm L выполняется тогда и только тогда, когда anbm-2n-1 L (m = (n + 1)2 m – 2n – 1 = n2). Чтобы проверить, лежит ли входное слово в L, поступают следующим образом: принимается сразу. Из входного слова вида an+1bm путем стирания первого символа а и последних 2n+1 символов b производится слово anbm-2n-1. Это слово рассматривается как новое входное слово, и описанный процесс повторяется. Если таким способом первоначальное входное слово сокращается до , то оно принимается. Если символы b остаются лишними, или для процесса стирания символов b не достает, машина останавливается, не принимая слово.
T = ({0, 1, 2, 3, 4, 5, 6, 7, 8}, {a, b}, {a, b, A, e}, , 0, {8}),
где задана следующим графом:
Содержательное значение состояний 0,…, 8 следующее:
-
0
…
Если входное слово, то оно сразу принимается. Если же входное слово начинается с а, то этот а стирается.
1, 2
…
Последний символ b стирается.
3 – 7
…
Для каждого а в начале слова стираются два b в конце. (Для этого, при необходимости, один символ а маркируется (а А), ищется конец слова (4, 5), стираются два b (5, 6, 7), ищется маркировка А (7), маркировка опять удаляется (а А) и производится шаг влево в состоянии 3, для того чтобы повторить процесс для следующего а.) После этого производится переход в начальное состояние и оставшееся слово рассматривается как новое входное слово.
29. Постройте машину Тьюринга, которая принимает следующий язык L:
L = {ww | w {a, b}*}.
Решение. Отправным пунктом для построения является следующая идея.
Сначала устанавливается, является ли длина входного слова – четной и одновременно буквы первой половины слова маркируются «однократно» (а а', b b'), а второй половины слова «двукратно» (а а'', b b''). Если при этом выясняется, что длина входного слова нечетная, то машина останавливается, не принимая слово. В противном случае, при необходимости, первый однократно маркированный символ сравнивается с первым двукратно маркированным символом. Если эти символы совпадают (без учета маркировки), то первый заменяется на е, а последний – на Х. В противном случае машина останавливается, не акцептируя слово. Если таким способом удается получить слово, состоящее из одних символов Х, то переходят в конечное состояние.
T = ({0, 1, 2, 3, 4, 5, 6, 7, 8}, {a, b}, {a, b, a', b', a'', b'', X, e}, , 0, {8}),
где задана следующим графом:
Наглядное значение состояний 0,…, 8 следующее:
-
0, 1, 2, 3
…
принимается сразу же. При вводе непустого слова первая (вторая) половина этого слова маркируется однократно (двукратно).
4
…
Идти влево к первому е.
5, 6, 7
…
Стереть первый однократно маркированный символ и сделать отметку в состоянии (a' 6, b' 7). Идти вправо к первому двукратно маркированному символу, при совпадении заменить на Х и снова перейти в 4. Если на ленте стоят одни только символы Х, то слово принимается.