✖

Преобразуване на автомат в регулярен израз

Ще покажем как да преобразуваме произволен краен автомат в регулярен израз.

Описание на алгоритъма

На входа имаме някакъв НКА A. Първо от него правим ОНКА. Във втората фаза във всяка стъпка премахваме по едно състояние, променяме правилно преходната функция и повтаряме, докато останат само две състояния — началното и крайното. Между тях ще води ребро, което ще има за етикет регулярен израз, който ще е резултатът от целия алгоритъм. Целият метод следователно се състои най-вече в премахване на състояние и последваща поправка на автомата, така че да получим еквивалентен автомат.

Премахване на едно състояние

Как се премахва едно състояние, можем да покажем на прост пример. Да допуснем, че част от нашия автомат изглежда така:

където Ri са някакви регулярни изрази. Как би изглеждал автоматът, ако премахнем състоянието qr? Можем да си го представим така, че сме в състоянието qi и се питаме кои думи можем да породим на този участък. Ако отидем от състоянието qi директно в състоянието qj, това ще са всички думи, които отговарят на регулярния израз R4.

Ако обаче отидем в състоянието qr, можем да породим думи от вида R1. В състоянието qr обаче можем да циклим по регулярния израз R2, така че всъщност можем да породим думи от вида R1∘(R2∗). И тъй като можем още да стигнем от състоянието qr до състоянието qj, добавяме там още регулярния израз R3. Общо по този път можем да получим думи от вида R1∘(R2∗)∘R3.

Сега знаем, че от тази част на автомата могат да възникнат думи от вида R4 или от вида R1∘(R2∗)∘R3. Това, разбира се, можем да запишем във вид на регулярен израз като (R4)|(R1∘(R2∗)∘R3).

Сега вече лесно можем да премахнем състоянието qr и да оставим само двете състояния qi и qj, а на мястото на R4 записваме току-що пресметнатия регулярен израз:

Този метод прилагаме за всяко ребро от всяко състояние qi към някое състояние qj, и то включително за примките, т.е. включително случая, когато qi = qj.

След премахването на едно състояние получаваме еквивалентен автомат — автомат, който разпознава същия език.

Целият алгоритъм

На входа имаме НКА A = ⟨Q, Σ, δ, q0, F⟩.

  1. Преобразуваме НКА A в ОНКА Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. По-нататък с буквата k ще означаваме броя на състоянията в Z.
  2. Ако k = 2, алгоритъмът свършва и на реброто между началното и крайното състояние е полученият регулярен израз.
  3. Ако k>2, избираме произволно състояние qr, което е различно от началното и крайното състояние, т.е. qr ≠ q0′ и qr ≠ qf′. После създаваме нов ОНКА Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩, за който ще е в сила: Q′′=Q′∖{qr} и за всички qi ∈ Q′′ ∖ {qf′} и за всички qj ∈ Q′′ ∖ {q0′} нека δ′′(qi,qj)=(R4)|(R1(R2∗)R3), където R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). После продължи със стъпка 2.

Пример

Нека на входа имаме този краен автомат:

Първо го преобразуваме в ОНКА (излишните ∅-преходи няма да изобразяваме):

Сега прилагаме втората част на алгоритъма и премахваме някой възел. Започваме с възела q2. Премахваме възела q2 и добавяме преход от състоянието q1 към състоянието qf. Този преход означаваме като b(a|b)∗, защото от възела q1 стигаме до състоянието q2 за думи от вида b, после можем да циклим по a|b, така получаваме (a|b)∗ и накрая с помощта на ε-правилото преминаваме в qf. При това b(a|b)∗ϵ = b(a|b)∗. Получаваме автомата:

Остава да премахнем последното състояние, q1. Добавяме ребро от състоянието qs към състоянието qf. Как да го означим? До състоянието q1 стигаме през ε-правилото, което можем веднага да пропуснем. После можем да циклим по a, така че получаваме регулярния израз a∗. И накрая през реброто стигаме до qf, така че конкатенираме израза още с b(a|b)∗. Реброто следователно описваме с регулярния израз a∗ b(a|b)∗.

Автоматът вече има само две състояния, така че алгоритъмът свършва. На реброто е полученият регулярен израз.

Източници

Глави: Регулярни изрази, Преобразуване на регулярен израз в автомат, Обобщен недетерминиран краен автомат, Преобразуване на автомат в регулярен израз