Wiem, że języki, które można zdefiniować za pomocą wyrażeń regularnych i te rozpoznawane przez DFA / NFA (automaty skończone) są równoważne. Nie istnieje również DFA dla języka . Ale nadal może być napisane przy użyciu wyrażeń regularnych (zresztą każdy non-język regularny może być) jako . Wiemy jednak, że każdy język, który ma wyrażenie regularne, ma rozpoznawany przez niego DFA (sprzeczność z moim wcześniejszym stwierdzeniem). Wiem, że jest to trywialna sprawa, ale czy definicja wyrażenia regularnego obejmuje warunek, że powinien on być skończony?
10
Odpowiedzi:
Gdyby wyrażenia regularne były nieskończone, każdy język byłby regularny.
Biorąc pod uwagę język , zawsze możemy zdefiniować wyrażenie regularne , który dokładnie określa . (Przykład: wyrażenie regularne definiuje .)L={w1,w2,…} R=w1+w2+⋯ L
R1=ϵ+0+1+00+01+10+11+⋯ L1={0,1}∗
Wiemy, że niektóre języki nie są regularne, więc pokazuje to, że nieskończone wyrażenia regularne opisują większą klasę języków niż skończone wyrażenia regularne.
źródło
Tak, musi być skończony. Wyobraź sobie, że masz nieskończony zestaw możliwych dopasowań, a twój wkład to
011
. Czy kiedykolwiek byłbyś w stanie to odrzucić? Czy kiedykolwiek zabraknie ci meczów do sprawdzenia?Czy jest jakiś język, który z tej definicji nie byłby regularny ? Co z zestawem wszystkich par programów i wejść, tak że dany program zatrzymuje się na danym wejściu?
Jeśli masz program, który wylicza ciągi znaków w języku w porządku leksykograficznym -
Aktualizacja
Aby wyjaśnić nieco w oparciu o informacje zwrotne w komentarzach, powodem, dla którego nie każdy język tego formularza jest regularny, jest z definicji. Jeśli, na przykład, przejrzysz dowód twierdzenia Kleene'a, zależy to od faktu, że wyrażenie regularne musi być skończone, aby udowodnić, że generuje skończoną maszynę stanu.
Dlaczego definiujemy w ten sposób „zwykły” język? Ponieważ każdy język formalny jest podzbiorem ciągów alfabetu, a każdy zestaw ciągów może być wyrażony jako połączenie singletonów, więc jeśli nazwalibyśmy dowolny zestaw ciągów „językiem zwykłym”, zwykły język byłby po prostu synonimem język . To nie jest bardzo przydatna definicja, zwłaszcza że nie możemy jej wdrożyć w sprzęcie lub oprogramowaniu. Nie możemy nigdzie przechowywać dowolnej listy nieskończonej ani budować maszyny o nieskończonym stanie.
Jak już wspomniałem, jeśli masz sposób na wyliczenie wszystkich ciągów w języku w porządku, możesz zbudować z niego decydujący element (zaakceptuj, gdy zobaczysz dokładnie ten ciąg, odrzuć, gdy napotkasz ciąg następujący po szukają) i na odwrót (dla każdego ciągu w kolejności, uruchom go przez decider i wyślij go, jeśli tylko zostanie zaakceptowany). Tak więc, jeśli weźmiemy pod uwagę każdy wyliczalny język za regularny , każdy rozstrzygalny język byłby „regularny” i potrzebowalibyśmy nowego terminu dla języków rozpoznawanych przez maszyny skończone i ich równoważne kodowanie jako wyrażenia skończone.
źródło
Załóżmy, że wyrażenia regularne mogą być nieskończone.
Zatem język zdefiniowany przez {ϵ} ∪ {01} ∪ {0011} ... będzie regularny. Dla każdego zwykłego języka istnieje NFA. Jednym ze sposobów uzyskania tego NFA byłoby posiadanie osobnych NFA dla każdego z {ϵ}, {01}, {0011} ... i łączenie ich za pomocą ϵ przejść. Ponieważ istnieją nieskończone różne wyrażenia regularne, będziemy potrzebować nieskończonych sub-NFA do połączenia. Jednak NFA może mieć tylko skończoną liczbę stanów (definicja NFA).
Zatem nie ma NFA, który mógłby zdefiniować język zdefiniowany przez połączenie nieskończonych wyrażeń regularnych, co oznacza, że język nie jest regularny.
Zatem nie ma wyrażenia regularnego, które mogłoby zdefiniować ten sam język, co język zdefiniowany przez połączenie nieskończonych wyrażeń regularnych.
Zatem wyrażenia regularne mogą mieć tylko wyrażenia skończone.
źródło