To jest normalne. Pierwsze prace Spójrzmy prawdzie w systemie binarnym, który będzie uogólnić do jakiejkolwiek podstawy> 1. Niech być dany język. Dla a = 1, b = 0 otrzymujemyM.a , b
M.1,0={1,10,11,100,101,...}
który zawiera wszystkie łańcuchy powyżej bez wiodących zer, który jest regularny (konstruuj dla niego wyrażenie regularne).{0,1}
Teraz dla każdego , b z jeszcze 0 otrzymujemy M a , 0 z M 1 , 0 , mnożąc przez numerycznie, czyli wykonując transformację ˉ x → ¯ x na każdy ciąg M a , 0 . Można to zrobić bitowo przez sekwencję przesunięć i dodatków x, które zależą od bitów ustalonego ciągu ˉ a . Dwie potrzebne nam transformacje to:aMa,0M1,0x¯→ax¯¯¯¯¯¯Ma,0xa¯
który ˉ x → ˉ x 0x¯→2x¯¯¯¯¯x¯→x¯0
i
x¯→2x+x¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Łączenie 0 po prawej stronie wyraźnie zachowuje regularność. Musimy zatem tylko udowodnić, że druga operacja zachowuje prawidłowość. Sposobem na to jest o skończonej stan pracy przetwornika na od prawej do lewej. To najtrudniejszy krok. Sugeruję robienie tego za pomocą programu pseudokodowego i pewnej skończonej pamięci pomocniczej (jak niektóre zmienne bitowe) zamiast używania stanów. Tak długo, jak pamięć ma stały rozmiar na wszystkich wejściach i skanujesz ściśle od prawej do lewej, jest to transdukcja stanu skończonego i zachowuje regularność.x¯
Na koniec, aby dostać od M a , 0 musimy numerycznie dodać B do każdej struny, ale to się robi z podobnym przetwornik T b , która zależy od ustalonej liczby b.Ma,bMa,0bTb
Aby zrobić to samo w dowolnej bazie, pokaż dodatkowo, jak wykonać mnożenie przez pojedynczą cyfrę w tej bazie, używając przetwornika S d, który zależy od d. Dzięki temu możemy pomnożyć liczby wielocyfrowe i nadal pozostać w zwykłych językach. Lub możemy to wyrafinować, mówiąc, że mnożenie przez d jest po prostu powtarzanym dodawaniem.dSdd
Chciałeś tylko podpowiedzi. Każdy z tych kroków zależy od dość złożonego twierdzenia / techniki, więc udowodnienie, że uzyskanie pełnego dowodu będzie dodatkową pracą.