Нормальные алгорифмы Маркова Нормальные алгорифмы Маркова ...............................................................................................1 Определение ...............................................................................................................................1 Эквивалентность алгорифмов ..................................................................................................8 Теорема о переводе ...................................................................................................................9 Теоремы сочетания ..................................................................................................................11 Объединение ........................................................................................................................15 Разветвление ........................................................................................................................16 Повторение ...........................................................................................................................17 Определение Подобно понятию машины Тьюринга понятие нормального алгорифма Маркова (называемого далее нормальным алгорифмом или даже просто алгорифмом) есть одно из математических уточнений интуитивного представления об алгоритме. Нормальный алгорифм в алфавите V задается как упорядоченная тройка A (V , P, PT ) , где V - конечный алфавит, P - упорядоченный набор вывода (формул подстановок), PT - выделенные (кортеж) правил в наборе P заключительные правила вывода (формулы подстановки). Правило вывода, не являющееся заключительным (и называемое простым), задается как слово в алфавите V {}, где символ («стрелка») не есть символ алфавита V , вида u v , в котором u, v - слова в алфавите V . Заключительное правило вывода задается как слово в алфавите V {,}, где символы («стрелка») и · («точка») не V , вида u v , в котором u, v - слова в алфавите V . В правиле вывода u v , где есть либо пустое слово, либо «точка», слово u называется левой частью, а слово v - правой являются символами алфавита частью правила вывода. Термин «правило вывода» часто заменяется его синонимом – термином «формула подстановки», иногда даже просто термином «подстановка» или «формула». Пара S ( P, PT ) называется схемой нормального алгорифма A . Таким образом, схема нормального алгорифма есть кортеж формул подстановки, в котором выделены заключительные формулы. Заметим, что в схеме заключительных формул может и не быть. Как и машина Тьюринга, нормальный алгорифм определяет некоторый процесс преобразования заданного слова в алфавите V . Но если в теории 2 машин Тьюринга этот процесс определялся в терминах конфигураций машины и отношения выводимости на множестве конфигураций, то в теории нормальных алгорифмов отношение выводимости задается на самом множестве слов в рассматриваемом алфавите. Определим отношение непосредственной выводимости по схеме алгорифма A на множестве слов в алфавите V . Говорят, что слово y непосредственно выводится из слова x по схеме S алгорифма A и записывают это как A : x ├ y (или x ├A y ), если слово y может быть получено из слова x в результате выполнения следующих действий: 1) в схеме S отыскивают первую в упорядоченном наборе P формулу подстановки, левая часть которой входит в слово x (такую формулу называют подходящей для слова x ); 2) первое вхождение левой части этой формулы заменяют ее правой частью. Если при этом указанная формула является заключительной, то будем писать A : x ├ y (или x ├ A y ) . Таким образом, в силу определения отношения ├ и ├ функциональны по второй компоненте (т.е. для каждого x существует не более одного слова y , для которого x ├A y или x ├ A y ) и его область определения есть множество всех таких слов в алфавите V , в которые входит левая часть хотя бы одной формулы подстановки заданной схемы. В таком случае говорят, что слово поддается схеме нормального алгорифма A . Итак, имеет место x ├A y тогда и только тогда, когда слово y есть результат замены первого вхождения левой части первой подходящей для слова x формулы в схеме алгорифма A ее правой частью, причем эта формула не является заключительной. Отношение же x ├ A y выполняется при тех же условиях, но для заключительной формулы. При этом, если указанная формула, то говорят, что слово y получено из слова x применением формулы . Дадим теперь определение процесса работы нормального алгорифма A с заданным словом x0 в алфавите V . Так называют последовательность (конечную или бесконечную) слов в алфавите V x0 , x1 ,..., xn ,... такую, что для каждого i0 имеет место xi ├A xi 1, если слово определено, причем последовательность является конечной, и слово xi 1 xn ее 3 последнее слово тогда и только тогда (по определению), когда из xn 1 применением некоторой заключительной xn получено формулы схемы A , или слово x n не поддается схеме алгорифма. Если процесс работы алгорифма A со словом x0 конечен и имеет вид x0 , x1 ,..., xn , то слово xn называется результатом работы алгорифма A со словом x0 и обозначается A( x0 ) . Говорят также, что алгорифм A перерабатывает слово x0 в слово x n , используя при этом запись A : x0 ╞ xn (или x0 ╞A xn ). В частности, если слово xn получено применением некоторой заключительной формулы схемы алгорифма A к предыдущему слову, то говорят, что алгорифм A заключительно перерабатывает слово x0 в слово x n , записывая A : x0 ╞ · x n (или x0 ╞A · xn ). Мы будем писать A : x0 ╞ x n и в том случае, когда существует последовательность слов x0 , x1 ,..., xn такая, что для каждого i 1, n 1 xi ├A xi 1. В этом случае слово xn не будет вообще говоря результатом работы A с x0 . Таким образом, каждый алгорифм A в алфавите V определяет частичную словарную функцию f A в алфавите V . Областью определения этой функции является множество всех таких слов x в алфавите V , что определено слово A(x ) . В этом случае говорят, что алгорифм A применим к слову x и пишут ! A( x) , а множество всех таких слов x , что имеет место ! A( x) , называют областью применимости алгорифма A . Алгорифм A , который каждое слово x из множества M V * такое, что ! A( x) , перерабатывает в слово из множества N V *, N ; если (x M )(! A( x)) , то называют алгорифмом типа M алгорифм A называют алгорифмом типа M N . N) Таким образом, алгорифм типа M N (типа M определяет функцию (частичную функцию) из M в N . Если M N V *, то говорят об алгорифме типа V V (или V V ). алгорифма 4 Алгорифм называют алгорифмом над алфавитом является алгорифмом в некотором расширении V1 V f f в алфавите V. называют вычислимой по Маркову (или нормально вычислимой), если существует такой нормальный алгорифм V V если он алфавита V . Пусть теперь задана частичная словарная функция Функцию V, Af типа над алфавитом V , что ! A f ( x) тогда и только тогда, когда x принадлежит области определения функции f , и для каждого такого слова x имеет место равенство A f ( x) f ( x) . Про алгорифм A f говорят тогда, что он вычисляет функцию f . Замечание. Мы используем термин «существует» для обозначения классического квантора существования. В противоположность этому термин «можно построить» (или «осуществим») мы применяем в определении или формулировки теоремы в том случае, когда это определение или доказательство теоремы дает метод построения объекта, существование которого утверждается. Заметим, что согласно данному определению алгорифм алгорифм типа V V, Af есть в схеме которого вообще говоря могут быть буквы из алфавита, более широкого, чем. Кроме того, для алгорифма типа V V над алфавитом V , каковым и является алгорифм A f вводится понятие области применимости относительно алфавита V : множества всех таких слов в этом алфавите, к которым применим данный алгорифм. A f , вычисляющего функцию f , алфавита V совпадает с областью Тогда можно сказать, что для алгорифма область применимости относительно определения функции f . Примеры. 1) Тождественный алгорифм. Алгорифм схемой Id , задаваемый любое слово в заданном алфавите V перерабатывает в это же слово за один шаг, т.е. (x V * )( Id : x ├· x ) . 2) Алгорифм левого присоединения фиксированного слова. 5 Алгорифм Lc , заданный схемой u , где u - фиксированное слово в алфавите V , вычисляет функцию левого присоединения к любому слову в алфавите V данного слова u , т.е. (x V * )( Lc : x ├· ux) . 3) Алгорифм правого присоединения фиксированного слова. Алгорифм Rc , заданный схемой в # # , V # u # алфавите V1 V {# } , где # V , вычисляет функцию правого присоединения данного фиксированного слова слову в алфавите V , т.е. u в алфавите Vк любому (x V * )( Rc : x ╞· xu) . Действительно, к произвольному слову x V применима только самая нижняя формула в схеме алгорифма Rc . После ее применения оказывается применимой одна из формул верхней строки, если слово x не пусто. Эти формулы применяются до тех пор, пока «решетка» (#) не окажется последней буквой очередного слова, выводимого из исходного слова x . Тогда она посредством применения средней формулы схемы заключительно заменяется на слово u . Для пустого входного слова имеем: Rc : ├ #├ · u . Для непустого слова x x(1) x(2)...x(m), m 0, получим: Rc : x(1) x(2)...x(m) ├ #x(1)x(2)…x(m) ├ x(1)#x(2)…x(m)├…├x#├·xu . * 4) Алгорифм удвоения Рассмотрим алгорифм Double, задаваемый схемой в алфавите V1 = V{, }, причем , V: 6 , V , , V Можно показать, что (x V )( Double : алгорифм удваивает любое входное слово в алфавите V. Например, пусть x = abca. Тогда * x ╞· xx) , т.е. этот Double: abca ├ abca ├ aabca ├ aabbca ├ aabbcca├ aabbccaa ├ ababccaa├ abacbcaa├ abacbaca├ abcabaca ├ abcaabca├ abcaabca ├4 abcaabca ├ · abcaabca = xx . Можно заметить следующее: ко входному слову применима только формула нижней строки рассматриваемой схемы. После ее применения посредством применения формул верхней строки каждая буква входного слова копируется и «копия» слева отмечается буквой (буква играет роль указателя и продолжает «бежать» вправо). После того, как указатель пробежит все слово, начинают работать формулы второй строки, в результате применения которых каждая «копия» «добегает» до конца исходного слова (т.е. так, чтобы после нее не было «оригинальных» букв). Затем все буквы и указатель стираются. Можно заметить также, что если вместо формулы поставить формулу , то копия будет инвертирована, т.е. получится слово xx R . 5) Инвертирующий алгорифм Зададим алгорифм Rv над алфавитом V такой схемой: 7 , , V , V В этой схеме буквы и не принадлежат алфавиту V. Пусть x=x(1)x(2)…x(m), m > 0, есть непустое слово в алфавите V. В схеме алгорифма Rv к слову x применима только самая нижняя формула. После ее применения, при условии, что m > 1, будет применима одна из формул верхней строки. Эти формулы применяются до тех пор, пока слово не окажется в конце слова: x(1)x(2)…x(m) ├ x(1)x(2)…x(m) ├ x(2)x(1) …x(m) ├ … ├x(2) x(3) …x(m)x(1) . Затем буква «превратится» в букву (вторая сверху строка схемы) и получится слово x(2) x(3) …x(m)x(1) . К нему опять-таки применима только самая нижняя формула; после ее применения будем иметь: x(2) x(3) …x(m)x(1) ├ x(2) x(3) …x(m)x(1) ├ ├ x(3) x(2) …x(m)x(1) ├ … ├ x(3)… x(m) x(2) x(1) ├ ├ x(3)… x(m) x(2) x(1) ├ x(3)… x(m) x(2)x(1). Потом буква x(3) (если она есть) будет точно так же перенесена в конец слова и т. д. до тех пор, пока не получится слово x(m) x(m-1)…x(2)x(1). Далее: x(m) x(m-1)…x(2)x(1) ├ x(m) x(m-1)…x(2)x(1) ├ ├ x(m) x(m-1)…x(2)x(1) ├ x(m) x(m-1)…x(2)x(1) ├ x(m) x(m-1)…x(2)x(1) ├ · x(m) x(m-1)…x(2)x(1). Итак, алгорифм Rv перерабатывает слово x, длина которого больше 1, в его инверсию xR. Для пустого и однобуквенного слова соответственно имеем: ├ ├ и 8 a ├ a ├ a ├ a ├ a . Итак, мы можем утверждать, что (x V * )( Rv ( x) x R ) . Эквивалентность алгорифмов Алгорифмы A и B над алфавитом V называют эквивалентными относительно алфавита V , если для всяких слов x, y V * таких, что A( x) y выполняется B( x) y и наоборот (с переменой ролей алгорифмов A и B ). Алгорифмы A и B над алфавитом V называют вполне эквивалентными относительно алфавита V , если для всякого слова x V * имеет место ! A( x) ! B( x) и если выполняется ! A( x) , то A( x) B( x) . Требование полной эквивалентности алгорифмов является более сильным, чем требование простой эквивалентности. В последнем случае из неприменимости одного из алгорифмов с исходному слову в алфавите V вообще говоря не следует неприменимость к нему другого алгорифма. Но тогда, если, скажем, ! A( x) , но ! B( x) , слово B (x ) не есть слово в алфавите V , так как иначе согласно определению оно оказалось бы равно слову A(x ) , которое не определено. Если алгорифмы A и B оба суть алгорифмы типа V V, то эквивалентность их относительно алфавита V влечет их полную эквивалентность относительно этого алфавита. В теории нормальных алгорифмов используется выражение A( x) B( x) , называемое условным равенством, смысл которого состоит в том, что левая часть его определена тогда и только тогда, когда определена правая, и в этом случае они обозначают одно и то же слово. Это не что иное, как записанное для слова x требование полной эквивалентности алгорифмов A и B , т.е. алгорифмы A и B вполне эквивалентны относительно алфавита V тогда и только тогда, когда (x V *)( A( x) B( x)) . Как уже упоминалось, останов нормального алгорифма при работе его с исходным словом, т.е. существование результата работы алгорифма с этим словом, возможен в двух случаях: либо на некотором шаге произойдет применение к очередному слову процесса работы заключительной формулы, либо будет получено слово, не поддающееся схеме алгорифма, произойдет, как говорят в таких случаях, естественный обрыв процесса работы. Можно 9 показать, что для любого алгорифма типа V V может быть построен V алгорифм, останов которого вполне эквивалентный ему относительно происходит только в силу первой причины. Действительно, добавим к схеме исходного алгорифма, в конец ее, формулу . Полученной таким образом схеме поддается любое слово в алфавите V , а новый алгорифм будет вполне эквивалентен исходному относительно V . Этот алгорифм называют замыканием исходного алгорифма. Замыкание алгорифма A обозначают через A . Теорема о переводе Можно доказать, что существует словарная функция в алфавите V , вычислимая по Маркову, но такая, что для нее невозможен вычисляющий ее нормальный алгорифм в алфавите V , а требуется алгорифм над алфавитом т.е. алгорифм в некотором расширении V1 алфавита V . В качестве такой функции можно взять функцию обращения слов, т.е. такую функцию V, Rv : V * V *, что для каждого x V выполняется Rv ( x) x R . В этой связи возникает вопрос, сколь много в общем случае может потребоваться «дополнительных букв» для получения вычисляющего данную функцию в алфавите V нормального алгорифма над этим алфавитом? Ответ на этот вопрос дает так называемая теорема о переводе, принадлежащая А.А. Маркову: оказывается, что всегда можно обойтись всего лишь двумя дополнительными буквами. Пусть V- некоторый Рассмотрим алфавиты Буквы и алфавит, V1 V { , } , , 1 ,..., n V . V2 V { 1 ,..., n }. буквы 1 ,..., n попарно буквы и отличны друг от друга, а все и могут совпадать с некоторыми из букв 1 ,..., n ). Каждой букве i , i 1, n , сопоставим слово вида i , которое назовем переводом буквы i . Перевод любой буквы алфавита различны (хотя буквы V совпадает, по определению, с ней самой. Перевод непустого слова x x(1)...x(m) V2 * есть по определению слово, обозначаемое [ x и равное [ x (1) ...[ x ( m) , где [ обозначает перевод буквы V ; переводом пустого слова считается пустое слово. 10 Таким образом, с точки зрения теории формальных языков, перевод V2 * есть морфизм из подстановок: в V1 * , задаваемый такой системой конечных 1 ............... n , V n . Пусть теперь дан нормальный алгорифм A в алфавите V 2 . Если в его схеме левую и правую части каждой формулы заменить ее переводом, получится схема нормального алгорифма в алфавите V1 , который называется переводом алгорифма A . Имеет место такая теорема: Теорема (о переводе, А.А. Марков). Если V2 , а A - его перевод, то для любого слова A - алгорифм в алфавите * x V2 имеет место условное равенство A([ x ) [ A( x ) . Доказательство этой теоремы мы не приводим. Содержательный смысл сформулированного результата состоит в том, что перевод алгорифма работает с переводами слов «точно так же», как сам алгорифм со своими исходными словами. A - алгорифм в алфавите V 2 * то (x V )( A( x ) A( x )). Следствие. Если типа * , V* V Это как раз и означает, что всякий алгорифм над алфавитом V , который перерабатывает слово в алфавите V в слово в том же алфавите (при * V* V может быть заменен вполне эквивалентным ему относительно алфавита V алгорифмом в некотором двухбуквенном расширении алфавита V . условии останова), т.е. всякий алгорифм типа С переходом к более широкому алфавиту для алгорифмов в заданном V связаны понятия естественного и формального алфавите распространения алгорифма на более широкий алфавит. Для алгорифма A в алфавите V можно той же самой схемой задать алгорифм A' в более широком алфавите (т.е. подавать на его вход слова в некотором расширении алфавита V ). Тогда очевидно, что для любого слова 11 x в алфавите V имеет место A( x) A' ( x). Таким образом, алгорифмы A и A' вполне эквивалентны относительно алфавита V . Алгорифм A' называют при этом естественным алгорифма на более широкий алфавит. распространением исходного f Формальное распространение A алгорифма A на более широкий алфавит V ' V определяется тем, что к схеме алгорифма A , в начале ее («сверху»), приписываются формулы для всех букв из V '\V . Тогда, как нетрудно видеть, от естественного (x V * )( A f ( x) A( x)) , но, в отличие распространения, имеет место (y V '\V )(! A f ( x)) , т.е алгорифм A f не применим ни к одному из слов, не являющимся словом в алфавите V . Теоремы сочетания Алгоритм (в интуитивном смысле) может быть «запрограммирован» не только в виде нормального алгорифма – выписыванием его схемы, но через определенные правила комбинации (сочетания) уже построенных нормальных алгорифмов. Например, следующее предписание определяет точный алгоритм переработки слов в заданном алфавите: 1) применить к исходному слову x нормальный алгорифм A ; 2) если слово A(x ) определено, то к нему применить нормальный алгорифм B ; 3) результатом считать слово B( A( x)) , если оно определено. Это предписание не является априори нормальным алгорифмом, поскольку оно не задано единой схемой такого алгорифма, а оперирует нормальными алгорифмами, словно некоторыми «блоками». Оно определяет один из способов сочетания нормальных алгорифмов, называемый композицией (иногда последовательной композицией). Оказывается, что и композицию и другие сочетания нормальных алгорифмов, которые будут рассмотрены ниже, можно «запрограммировать» в виде схем нормальных алгорифмов. Теоремы о возможности построения таких схем называются теоремами сочетания. Рассмотрим более подробно теорему композиции: Теорема (о композиции нормальных алгорифмов). Каковы бы ни были нормальные алгорифмы A в алфавите V1 и B в алфавите V 2 , может быть 12 построен такой нормальный алгорифм C над алфавитом V V1 V2 , что x V * имеет место условное равенство C ( x) B( A( x)) (при этом предполагается, что если слово x не есть слово в алфавите V1 , то выражение A(x ) не определено). для любого слова Доказательство. Вполне строгое доказательство теоремы композиции мы не приводим (техника строгих доказательств в теории нормальных алгорифмов вообще выходит за пределы нашего курса). Обсудим построение схемы алгорифма C «на уровне идеи» Эта схема приведена ниже (см. сл. стр.). Она, по построению, является схемой нормального алгорифма в V V { , }, где V - алфавит, составленный из «буквдвойников» букв алфавита V , т.е. каждой букве V сопоставляется буква V - «двойник» буквы так, что соответствие является взаимно однозначным и пересечение V V пусто. Буквы и считаются не принадлежащими алфавиту V V . Через A обозначен набор формул подстановок, образованный из схемы замыкания A алгорифма A заменой всех «точек» (обозначающих алфавите : тем самым каждая заключительная схеме A заменяется простой формулой заключительную формулу) буквой формула вида u v . Через B u v в обозначен набор формул подстановок, полученный из схемы замыкания B алгорифма B путем замены в ней каждой буквы алфавита V ее «двойником», всех «точек» буквами и после этого замены каждой формулы вида v (т.е. формулы с пустой левой частью) формулой v . Работа алгорифма следующим образом. C с исходным словом может быть описана Поскольку в исходном слове x V нет вхождений букв и , а также вхождений букв-«двойников», то ни одна из формул строк (1) – (8) не применима к x . * 13 B A ( V ) ( V ) (1) (2) ( , V ) ( V ) ( V ) (3) (4) (5) ( , V ) Таким образом, к слову (6) (7) (8) (9) x будет применима первая формула набора A , т.е. первая формула схемы алгорифма A , если она простая, и формула вида u v , если соответствующая формула в схеме алгорифма A является заключительной. Можно тогда показать, что если A : x ╞n y , то и C : x ╞n y , откуда следует, что неприменимость A к x влечет неприменимость C к x . Пусть алгорифм A применим к слову x . Тогда, поскольку сам алгорифм A заменен его замыканием, а набор формул A построен по схеме замыкания алгорифма A , то на последнем шаге работы алгорифма A со словом x будет применена заключительная формула; но тогда на соответствующем шаге работы алгорифма C со словом x будет применена формула вида u v , и, таким образом, если A : x ╞ · y , то C : x ╞ y1y 2 , где y1 y 2 y . Итак, посредством применения формул (9) к исходному слову x алгорифм C «эмулирует» работу алгорифма A , причем если определено слово y A(x) и только в этом случае, то на некотором шаге работы C с x будет получено слово y1y 2 , где y1 y 2 y . Появление в слове, выводимом из x по схеме алгорифма C , буквы «переключает» схему C на применение формул строки (1), которые «передвигают» букву в начало слова, т.е. имеет место выводимость 14 C : x ╞ y1y 2 ╞ y . Как только оказывается первой буквой слова, формулы (1) становятся неприменимыми, и начинают «работать» формулы строк (2) и (3), в результате чего слово y A(x) будет преобразовано в слово y «двойник» y в алфавите V 1. После этого могут быть применены только формулы набора B , B со посредством применения которых «эмулируется» работа алгорифма словом y A(x) , а именно, если B : y ╞m z , то C : y ╞m z , откуда ! B( y) влечет !C (y ) и, соответственно, !C ( x) . Если же ! B ( y ) , то (ввиду перехода к замыканию B ) на последнем шаге будет применена заключительная формула схемы B , что означает в процессе работы C с y применение на соответствующем шаге формулы вида u v , где u, v - слова в алфавите V { } . Это значит, что если B : y ╞ z , то C : y ╞ z1 z 2 , где z z1 z 2 . Появление буквы на очередном шаге работы алгорифма C следует, что означает «переключение» его схемы на применение формул строки (4), которые «перегоняют» влево до тех пор, пока оно не окажется перед первой буквой слова z и после буквы , неизменно стоящей на первом месте во всех словах выводимых из y по схеме алгорифма C . Таким образом, имеет место выводимость C : y ╞ z1 z 2 ╞ z . После этого посредством применения формул строк (5) и (6) происходит «превращение» букв-«двойников» в сами буквы алфавита V , т.е. из слова z выводится слово z . В результате формулы строк (1) – (6) становятся неприменимыми, и применяется заключительная формула (7), т.е. в итоге получаем: C : y ╞ z1 z 2 ╞ z z ╞ z B( A( x)) . A(x) или B( A( x)) не определено, т.е. ! A( x) или ! B( A( x)) , то !C ( x) , а если ! A( x) и Следовательно, если хотя бы одно из слов 1 Т.е. при y y (1)...y (m) выполняется y y (1)...y (m) . Пустое слово, разумеется, совпадает со своим двойником. 15 ! B( A( x)) , то C ( x) B( A( x)) , и C ( x) B( A( x)) доказано. Нормальный алгорифм C над алфавитом V условное равенство с представленной выше схемой, называется (последовательной) композицией алгорифмов A и B и обозначается B A . Помимо композиции определяют также следующие комбинации (сочетания) нормальных алгорифмов. Объединение Это сочетание определяется таким предписанием: 1) к исходному слову x применить алгорифмы A и B (независимо друг от друга); 2) если оба слова A(x ) и B (x ) определены, то результатом считается слово A( x) B( x) . Объединение нормальных алгорифмов также может быть задано схемой некоторого нормального алгорифма, т.е. доказывается следующая теорема: Теорема (об объединении нормальных алгорифмов). Каковы бы ни A в алфавите V1 и B в алфавите V 2 , может быть построен нормальный алгорифм C над алфавитом V V1 V2 * такой, что для любого слова x V выполняется условное равенство C ( x) A( x) B( x) . были нормальные алгорифмы Теорема об объединении доказывается уже с учетом доказанной теоремы о композиции, т.е. доказательство состоит в том, что объединение сводят к композиции. Это доказательство мы не приводим (даже «на уровне идеи»). Замечание. Объединение алгорфмов иногда называют параллельной композицией. Существуют также разные варианты определения этой комбинации нормальных алгорифмов. Один из них таков: алгорифмы A и B (независимо друг от друга) применяются к словам x и y соответственно, а для алгорифма C выполняется условное равенство (для любых слов x V1* , y V2* ) C ( x y) A( x) B( y) , где «звездочка» (*) – буква, не принадлежащая объединению алфавитов V1 и V 2 . 16 Нормальный алгорифм C , построенный согласно теореме об объединении, обозначают A B . Разветвление Этот способ сочетания нормальных алгорифмов задан так: 1) к исходному слову x применить алгорифм C ; 2) если слово C (x) существует и равно пустому слову, то к слову x применить алгорифм A ; 3) если слово C (x) существует и не равно пустому слову, то к слову применить алгорифм B и считать слово B (x ) общим результатом; 4) если слово C (x) не определено, то не определен и общий результат. x Теорема о «программировании» разветвления нормальных алгорифмов в виде схемы некоторого нормального алгорифма называется теоремой о разветвлении и формулируется следующим образом. Теорема (о разветвлении нормальных алгорифмов). Каковы бы ни были нормальные алгорифмы A, B и C в алфавитах соответственно, может быть построен алгорифм D V1 ,V2 ,V3 над объединением x V * выполняется следуюшее: 1) если !C ( x) то ! D ( x) ; 2) если !C ( x ) , то D( x) A( x) при C (x) и D( x) B( x) при C (x) . алфавитов V V1 V2 V3 такой, что для любого слова Доказательство теоремы о разветвлении основано на предыдущих теоремах: композиции и объединения. Нормальный алгорифм D , который может быть построен согласно теореме о разветвлении, будем обозначать C ( A B) и называть C разветвлением алгорифмов A и B . Коротко этот алгорифм можно задать такой записью: A( x), при C ( x) . ( A B )( x ) C B( x), при C ( x) В программистских терминах C -разветвеление можно описать так: if C (x) then y : A( x) else y : B ( x) . 17 Повторение Зададим такой алгоритм с использованием нормальных алгорифмов и B: while B( x) do A x : A( x) end, B (x) определено и пусто, то к слову x надлежит применить алгорифм A , если же слово B (x ) не есть пустое, то результатом всего рассматриваемого алгоритма считается само слово x . Далее, если слово A(x) определено, и B( A( x)) , то к слову A(x) надлежит применить снова алгорифм A ; если же B( A( x)) , то общим результатом является слово A(x ) и т. д. т.е. если слово Заданный таком образом алгоритм называют повторением нормального алгорифма A , управляемым нормальным алгорифмом B , или, короче, B -повторением нормального алгорифма A . Можно доказать, что и повторение нормального алгорифма программируется в виде нормального алгорифма. Теорема (о повторении нормального алгорифма). Каковы бы ни были V 2 , может быть построен нормальный алгорифм C над алфавитом V V1 V2 такой, что * для любого слова x V , что имеет место равенство y C (x) тогда и нормальные алгорифмы только тогда, A когда в алфавите V1 и B существует x x0 , x1 ,..., xm y такая, что m 0 , в алфавите последовательность слов y x и B( x) , или m 0 и (i 1, m)(( xi A( xi1 )) ((j 0, m 1)( B( x j ) )) ( B( xm ) ) Нормальный алгорифм C будем обозначать B A}. Условие повторения цикла можно изменить на противоположное. Такое повторение будем обозначать B A . Рассмотрим решение задач на построение некоторых алгорифмов с использованием теорем сочетания. Проекцирующие алгорифмы. Построим семейство алгорифмов i , i 1,..., n , над алфавитом V {$} так, что для любых слов x1 , x 2 ,..., x n в алфавите V выполняется i ( x1 $ x2 $...$ xn ) xi , i 1,..., n. Построим алгорифм P1 со схемой 18 $ $, V {$} $ Нетрудно видеть, что P1 ( x1 $ x2 $...$ xn ) x1 . Теперь построим алгорифм P2 со схемой # #, V # $# Понятно, что P2 ( x1 $ x 2 $...$ x n ) x 2 $...$ x n . P2 ... P2 ) . Обозначая k кратную композицию Тогда i P1 ( i 1 алгорифма A с самим собой через A k и полагая при этом, что A 0 Id , получим i P1 P2i 1 . В частности 1 P1. Алгорифм распознавания равенства слов. Построим алгорифм EQ {*} такой, что для любых двух слов x, y V * имеет место EQ( x * y ) x y. Обозначая Rv инвертирующий алгорифм (см. пример № 5), искомый над алфавитом V алгорифм получим в виде: Comp( Id ( x) * Rv( y)) , где Comp - алгорифм, задаваемый схемой: * *, V . * x, y V * выполняется !Comp( x * y) Comp( x * y) x y. Очевидно, что для любых двух слов Алгорифм определения «центра» слова. Построим алгорифм C , который любое слово x в алфавите V переводит в слово x1 $ x2 , где | x1 || x2 | при четной длине слова x , и | x2 || x1 | 1 в противном случае; $ V . Это можно реализовать, определив алгорифм C следующим образом: 19 CB A L R , где схемы входящих в указанное сочетание алгорифмов, выглядят так: ( V , , V ) R: L : ( V , V ) ( V , , V ) A : $ B: $ Алгорифм R вводит правый «челнок» , который при каждом повторении сдвигается влево на букву (при первом повторении это делает «челнок» , тут же превращающийся в ). Алгорифм L вводит левый «челнок» , при каждом повторении сдвигающийся на букву вправо. Верхняя формула служит для «блокировки» работы этой схемы в том случае, когда вхождение уже возникло. Как только «челноки» и встречаются, цикл прекращается (условие выхода из цикла проверяет алгорифм A ). Алгорифм B заменяет вхождение на «доллар». Поскольку правый «челнок» опережает левый на шаг, то при нечетной длине входного слова правая часть разделенного «долларом» слова будет длиннее левой на одну букву. Заметим, что если входное слово x пустое, то A( x) , и управление сразу передается алгорифму B , печатающему лишь один «доллар».