10.1.1. Имеется последовательность символов
.Определить, имеются ли в ней идущие
друг за другом символы abcd. (Другими словами, требуется
выяснить, есть ли в слове
подслово abcd.)
Этот простой алгоритм можно описать в разных терминах.
Используя терминологию так называемых конечных автоматов, можно
сказать, что при чтении слова x слева направо мы в каждый
момент находимся в одном из следующих состояний: <<
начальное>> (0), << сразу после a>> (1), << сразу после
ab>> (2), << сразу после abc>> (3) и << сразу
после abcd>> (4). Читая очередную букву,
1cm
мы переходим в следующее состояние по правилу

Как только мы попадем в состояние 4, работа заканчивается.
Соответствующая программа очевидна (мы указываем новое состояние, даже если оно совпадает со старым; эти строки можно опустить):
i:=1; state:=0;
{i - первая непрочитанная буква, state - состояние}
while (i <> n+1) and (state <> 4) do begin
| if state = 0 then begin
| | if x[i] = a then begin
| | | state:= 1;
| | end else begin
| | | state:= 0;
| | end;
| end else if state = 1 then begin
| | if x[i] = b then begin
| | | state:= 2;
| | end else if x[i] = a then begin
| | | state:= 1;
| | end else begin
| | | state:= 0;
| | end;
| end else if state = 2 then begin
| | if x[i] = c then begin
| | | state:= 3;
| | end else if x[i] = a then begin
| | | state:= 1;
| | end else begin
| | | state:= 0;
| | end;
| end else if state = 3 then begin
| | if x[i] = d then begin
| | | state:= 4;
| | end else if x[i] = a then begin
| | | state:= 1;
| | end else begin
| | | state:= 0;
| | end;
| end;
end;
answer := (state = 4);
Иными словами, мы в каждый момент храним информацию о том,
какое максимальное начало нашего образца abcd является концом
прочитанной части. (Его длина и есть то << состояние>>, о котором
шла речь.)![]()
Терминология, нами используемая, такова. Слово -- это любая последовательность символов из некоторого фиксированного конечного множества. Это множество называется алфавитом, его элементы -- буквами. Если отбросить несколько букв с конца слова, останется другое слово, называемое началом первого. Любое слово также считается своим началом. Конец слова -- то, что останется, если отбросить несколько первых букв. Любое слово считается своим концом. Подслово -- то, что останется, если отбросить буквы и с начала, и с конца. (Другими словами, подслова -- это концы начал, или, что то же, начала концов.)
В терминах индуктивных функций (см. раздел 1.3)
ситуацию можно описать так: рассмотрим функцию на словах,
которая принимает два значения << истина>> и << ложь>> и
истинна на словах, имеющих abcd своим подсловом. Эта функция
не является индуктивной, но имеет индуктивное расширение