✖

Обединение на регулярни езици

Нека имаме два регулярни езика L1, L2. Ще докажем, че тяхното обединение L = L1 ∪ L2 също е регулярен език.

Начин с детерминиран автомат

Идея на метода

Имаме два регулярни езика L1 и L2 и искаме да докажем, че тяхното обединение L1 ∪ L2 е отново регулярен език. Тъй като L1 и L2 са регулярни езици, съществуват крайни автомати A1 и A2, които приемат езиците L1 и L2, т.е. L(A1) = L1 и L(A2) = L2. Ние ще построим краен автомат A, който ще приема езика L1 ∪ L2, с което ще докажем, че езикът L1 ∪ L2 е регулярен.

Как ще го направим? Под ръка имаме крайните автомати A1 и A2, които приемат отделните езици. Можем да кажем, че думата w принадлежи на езика L1 ∪ L2 тогава и само тогава, когато я приеме поне един от автоматите A1 или A2.

Автоматът A би могъл да работи така, че за вход w да симулира изчислението на автомата A1 за вход w. Ако A1 приеме думата w, тогава и A приема думата w. Ако A1 отхвърли думата w, тогава A още ще се опита да симулира изчислението на A2 за вход w. Ако A2 приеме думата w, тогава и A приема думата w. В противен случай я отхвърля.

Остава да формализираме какво означава, че автоматът A „симулира“ изчислението на друг автомат.

Формализация

Имаме два регулярни езика L1 и L2, които се приемат от крайните автомати

A1=⟨Q1,Σ1,δ1,q1,F1⟩A2=⟨Q2,Σ2,δ2,q2,F2⟩.

Построяваме краен автомат A = ⟨Q, Σ, δ, q, F⟩, който ще приема езика L = L1 ∪ L2. Ще използваме идеята за симулиране на два автомата A1, A2. Нека си представим, че на входа имаме думата w = w1w2… wn и сега ще симулираме едновременно хода на автоматите A1 и A2 за думата w. Началната конфигурация на автомата A1 е ⟨q1, w1w2… wn⟩, началната конфигурация на A2 е ⟨q2, w1w2… wn⟩. Във всеки автомат сега извършваме стъпка на изчислението, с което стигаме до конфигурациите ⟨δ1(q1, w1), w2… wn⟩ и ⟨δ2(q2, w1), w2… wn⟩.

Виждаме, че тези конфигурации се различават само в първата компонента, втората — непрочетената част от думата — е винаги една и съща. По време на симулацията следователно не е нужно да поддържаме две конфигурации на два автомата, достатъчна ни е една конфигурация от вида ⟨⟨qi, qj⟩, wl… wn⟩, където qi ∈ Q1 и qj ∈ Q2. С други думи, автоматът A, който построяваме, ще има начална конфигурация ⟨⟨q1, q2⟩, w⟩. Първата част на двойката ⟨q1, q2⟩ представлява състоянието, в което се намира в момента автоматът A1, а втората компонента представлява текущото състояние на автомата A2.

Можем така да запишем, че автоматът A, който построяваме, ще има множество от състояния, равно на Q = Q1 × Q2. Това ще е декартовото произведение на състоянията на предишните два автомата. Следващата идея е такава: автоматът A ще има начално състояние ⟨q1, q2⟩ и ако автоматът A1 за символа w1 премине в състоянието qi, а автоматът A2 за символа w1 премине в състоянието qj, то автоматът A за символа w1 ще премине в състоянието ⟨qi, qj⟩.

Преходната функция δ записваме така (тук вече предполагаме, че в момента сме в състоянията qi и qj):

δ(⟨qi,qj⟩,w)=⟨δ1(qi,w),δ2(qj,w)⟩

Остава да уредим само дреболиите. За азбуката е в сила Σ= Σ1 ∪ Σ2. Началното състояние е равно на q = ⟨q1, q2⟩. А крайни състояния са всички двойки ⟨qi, qj⟩, такива че qi ∈ F1 или qj ∈ F2.

Илюстрация на метода

Нека имаме два автомата. Първият е автоматът A1, който приема всички думи (включително празната дума), в които се редуват нули и единици, т.е. думи от вида 01, 0101, 010101, …

Другият автомат A2 приема думите, които съдържат поне една нула:

Обединението на тези езици са думите, които или съдържат нула, или са от вида 01, 0101, … Сега ще построим краен автомат A = ⟨Q, Σ, δ, q, F⟩, който ще приема точно този обединен език. Първо ще покажем как ще изглеждат състоянията на този нов автомат A. Това ще е декартовото произведение на състоянията на първия и втория автомат:

Q=Q1×Q2={⟨q0,p0⟩,⟨q0,p1⟩,⟨q1,p0⟩,⟨q1,p1⟩,⟨q2,p0⟩,⟨q2,p1⟩}

Така изглеждат шестте състояния на автомата A, който приема обединения език L(A1) ∪ L(A2). В диаграмата биха изглеждали така:

Не се стряскай, че имаме състояния, които се състоят от двойки състояния — това служи само за по-добра ориентация в това, което всъщност се случва в автомата. Състоянията спокойно биха могли да се казват по обичайния начин q0, …, q5. Крайни са онези състояния, които съдържат или състоянието q0, или p1, а те са крайните състояния на първоначалните автомати. Началното състояние е ⟨q0, p0⟩.

Сега трябва да намерим всички преходи. Съставяме такава таблица:

01⟨q0,p0⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

И постепенно ще попълваме таблицата. Първо откриваме къде ще води преходът от състоянието ⟨q0, p0⟩ при вход 0. Откриваме къде води преходът от състоянието q0 при вход 0 в автомата A1: той води към състоянието q1. В автомата A2 преходът от p0 при нула води към състоянието p1. Така в таблицата записваме ⟨q1, p1⟩:

01⟨q0,p0⟩⟨q1,p1⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

При вход 1 получаваме: за автомата A1 имаме δ1(q0, 1) = q2, а за автомата A2 имаме δ2(p0, 1) = p0. Така получаваме състоянието ⟨q2, p0⟩.

01⟨q0,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

Дописваме останалата част от таблицата:

01⟨q0,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q0,p1⟩⟨q1,p1⟩⟨q2,p1⟩⟨q1,p0⟩⟨q2,p1⟩⟨q0,p0⟩⟨q1,p1⟩⟨q2,p1⟩⟨q0,p1⟩⟨q2,p0⟩⟨q2,p1⟩⟨q2,p0⟩⟨q2,p1⟩⟨q2,p1⟩⟨q2,p1⟩

И по тази таблица вече само дорисуваме останалата част от диаграмата.

Можем да проверим, че автоматът работи както трябва. Ще опитаме да приемем думата 0100. Автоматът последователно минава през състоянията

⟨q0,p0⟩,⟨q1,p1⟩,⟨q0,p1⟩,⟨q1,p1⟩,⟨q2,p1⟩

Тъй като състоянието ⟨q2, p1⟩ е крайно, автоматът A приема думата 0100. Какво би станало, ако опитаме да приемем думата 0100 с автоматите A1 и A2? Автоматът A1 би минал последователно през тези състояния:

q0,q1,q0,q1,q2

Автоматът свършва в състоянието q2, което не е крайно, така че автоматът A1 не би приел тази дума. А автоматът A2?

p0,p1,p1,p1,p1

Състоянието p1 е крайно, така че автоматът A2 би приел думата 0100. Забележи, че автоматите A1 и A2 свършиха в състоянията q2 и p1, което е в съответствие с това, че автоматът A свърши в състоянието ⟨q2, p1⟩.

Начин с недетерминиран автомат

Пример

Че множеството на регулярните езици е затворено относно обединението, можем да докажем и чрез построяване на недетерминиран автомат, който ще е много по-прост.

Имаме два регулярни езика L1, L2 и искаме да докажем, че тяхното обединение L = L1 ∪ L2 също е регулярен език. Тъй като L1, L2 са регулярни езици, трябва да съществуват автомати A1, A2, които приемат тези езици. Т.е. L(A1) = L1 и L(A2) = L2. С помощта на тези автомати ще построим автомата A, който ще приема езика L, т.е. L(A) = L.

Да допуснем, че крайните автомати A1 и A2 изглеждат така:

и

Автомата, който би приемал обединението на двата езика, бихме построили така, че да създадем ново начално състояние и от това състояние да прокараме два ε-прехода към първоначалните начални състояния. Това е всичко. Автоматът би изглеждал така:

Формализация

Имаме два автомата A1 = ⟨Q1, Σ, δ1, q1, F1⟩ и A2 = ⟨Q2, Σ, δ2, q2, F2⟩. Построяваме автомата A = ⟨Q, Σ, δ, q0, F⟩, който ще приема обединението на езиците, приемани от предишните автомати, т.е. L(A) = L(A1) ∪ L(A2). При това е в сила:

  • Q = Q1 ∪ Q2 ∪ {q0}
  • F = F1 ∪ F2

А преходната функция δ определяме така:

δ(q,a)={δ1(q,a)акоq∈Q1δ2(q,a)акоq∈Q2{q1,q2}акоq=q0∧a=ε∅акоq=q0∧a≠ε

Източници

Глави: Затвореност на регулярните езици, Обединение на регулярни езици, Сечение на регулярни езици, Разлика на регулярни езици, Допълнение на регулярен език, Конкатенация на регулярни езици, Затваряне на регулярен език