• Nie Znaleziono Wyników

3 Podstawy matematyczne i informatyczne

3.5 Języki formalne

Język formalny jest pojęciem, które wiąże się bezpośrednio z informatyką i logiką matematyczną.

Oznacza podzbiór wszystkich słów opartych na skończonym alfabecie. Teoria związana z językami for-malnymi jest szeroko wykorzystywana w informatyce. Podstawowe zastosowania języków formalnych dotyczą choćby protokołów komunikacji, gdzie ustalone słowa reprezentują znaczenia, które przesy-łane są pomiędzy punktami końcowymi. Języki formalne pozwalają również na definiowanie zasad in-terpretacji tekstu wczytywanego do oprogramowania, a także analizy tekstu z wykorzystaniem wyra-żeń regularnych. Kolejnym bardzo ważnym obszarem zastosowań języków formalnych jest programo-wanie, które opiera się na interpretacji kodu źródłowego zapisanego w języku programowania, którego zasady zdefiniowane są w oparciu o teorię języków formalnych.

W podrozdziale tym przedstawione są podstawowe informacje dotyczące języków formalnych, wliczając w to definicję formalną, przykłady gramatyk, a także maszynę Turinga i jej powiązanie z te-matem języków formalnych.

3.5.1 Definicja

Podstawą definicji języka formalnego jest zdefiniowanie alfabetu, który musi być niepustym zbiorem skończonym. Każdy z elementów alfabetu nazywany jest symbolem. Następnie definiowane są słowa, które są ciągami symboli wskazanego alfabetu o skończonej długości. Język formalny jest dowolnym zbiorem tak zdefiniowanych słów.

Przykładem definicji formalnej niech będzie język L. W pierwszym kroku definiujemy dla niego alfabet. Poniżej przedstawiony jest przykładowy alfabet Σ dla języka formalnego.

Σ = { A, B, C, D}

Na tak zdefiniowanym alfabecie możemy zdefiniować zbiór słów, który wchodzi w skład języka formalnego. Poniższy przykład przedstawia omawiany sposób definicji języka formalnego L.

L = { ”AA”, ”AB”, ”ABC”, ”DABCAB”}

Możliwe jest zdefiniowanie języka formalnego jako nieskończonego, co jest bardzo częstym mechanizmem. Na wskazanym wyżej alfabecie składającym się z czterech znaków, możliwe jest zdefi-niowanie dowolnej liczby słów. Jeżeli język formalny ma być zdefiniowany jako zbiór wszystkich słów na wskazanym alfabecie, można zapisać język jako L = Σ*.

Z wykorzystaniem tak zwanych gramatyk możliwe jest definiowanie zakresów słownictwa, tak, aby nie trzeba było wskazywać ręcznie wszystkich potencjalni możliwych kombinacji wyrazów, a jed-nocześnie poprzez tak zdefiniowane reguły nie jest dopuszczona każda dowolna kombinacja wyrazów.

Innym ze sposobów definicji języka formalnego jest wykorzystanie maszyny Turinga. Pozwala ona na zdefiniowanie mechanizmu weryfikacji poprawności języka. Podsekcja 3.5.3 opisuje zastosowanie ma-szyny Turinga w kontekście języków formalnych.

3.5.2 Gramatyki formalne

Kluczowym elementem funkcjonowania języków formalnych jest interpretacja zapisanych za ich pomocą treści. Aby było to możliwe zdefiniowana jest część semantyczna i gramatyczna. Istnieje wiele typów gramatyk, które różnią się w sposobie interpretacji zapisów. W sekcji tej opisane są trzy najważniejsze typy gramatyk, czyli gramatyki regularne, gramatyki kontekstowe i gramatyki bezkon-tekstowe.

Przy definiowaniu gramatyki istnieją ograniczenia co do postaci reguł, które dotyczą symboli terminalnych i nieterminalnych. Symbol terminalny jest symbolem elementarnym, który może pojawić się na wejściu i tworzy wyrazy języka formalnego. Symbol nieterminalny to symbol, który może zostać zdefiniowany jako ciąg zawierający kombinacje symboli terminalnych i nieterminalnych.

Ważnym elementem gramatyk są produkcje, czyli reguły, które określają jaką postać mogą przyjmować konstrukcje składniowe. Produkcje mają następującą postać:

Definiowana konstrukcja ⟶ wyrażenie opisujące Zapis powyższy jest przykładem notacji Backusa-Naura.

3.5.2.1 Gramatyki regularne

Gramatyka regularna, w najprostszym ujęciu jest gramatyką, za której pomocą można opisać język regularny, czyli język formalny, dla którego można skonstruować automat o skończonej liczbie stanów, który będzie w stanie zadecydować, czy słowo należy do języka. Istnieją dwa typy gramatyk regularnych: lewostronne i prawostronne.

W gramatyce regularnej po lewej stronie występuje zawsze dokładnie jeden symbol nietermi-nalny, natomiast po prawej stronie nie więcej niż jeden nieterminalny i dowolny łańcuch symboli ter-minalnych. W przypadku gramatyk prawostronnie regularnych symbol terminalny występuje przed nieterminalnym, natomiast w przypadku gramatyk lewostronnie regularnych symbol nieterminalny występuje przed terminalnym.

3.5.2.2 Gramatyki bezkontekstowe

Gramatyka bezkontekstowa, to gramatyka, której wszystkie reguły można sprowadzić do po-staci, która zapisana jest poniżej.

A ⟶ β

Powyższy zapis jest przykładem produkcji. A oznacza w nim dowolny symbol nieterminalny, natomiast β to dowolny ciąg symboli terminalnych i nieterminalnych.

3.5.2.3 Gramatyki kontekstowe

Gramatyki kontekstowe różnią się od gramatyk bezkontekstowych tym, że może istnieć kon-tekst poszczególnych wyrażeń. Poniżej zapisana jest przykładowa produkcja gramatyki konkon-tekstowej.

αAµ ⟶ αβµ

Powyższy zapis pokazuje, że gramatyka kontekstowa zawiera elementy gramatyki bezkontekstowej:

definiowany symbol nieterminalny A i dowolny ciąg symboli terminalnych i nieterminalnych β. Ponadto jednak po lewej stronie produkcji występują symbole α i µ, które definiują kontekst wyrażenia.

3.5.3 Maszyna Turinga

Maszyna Turinga jest modelem obliczeniowym, który opisuje maszynę abstrakcyjną. Maszyna ta składa się z nieskończenie długiej taśmy podzielonej na pola, w których zapisywane są dane. Ma-szyna zawsze ustawiona jest na jednym z pól. Każde pole znajdować się może w jednym z N stanów, natomiast maszyna znajduje się zawsze w jednym z M stanów.

3.5.3.1 Formalna definicja

Maszynę Turinga w zapisie formalnym opisuje poniższa krotka (Hopcroft et al. 2006):

MT = < Q, Σ, Γ, δ, q0, B, F >

W powyższym zapisie, na definicję maszyny Turinga składa się siedmiu elementów. Pierwszym elementem jest Q, czyli skończony zbiór stanów. Następny element to Σ, czyli skończony zbiór symboli wejściowych. Γ oznacza skończony zbiór dopuszczalnych symboli, gdzie Σ ⊆ Γ\{B}. Kolejnym elemen-tem definicji jest funkcja δ, która odpowiada za odnalezienie kolejnego stanu maszyny. q0 reprezentuje stan początkowy maszyny. B opisuje symbol pusty, natomiast F to zbiór stanów końcowych. Istotnymi elementami definicji są ograniczenia, które zakładają, że symbol B, jak i zbiór symboli wejściowych Σ należą do zbioru Γ. Jednocześnie do zbioru Σ nie należy symbol B. Ponadto q0 należy do zbioru stanów Q. Poniżej przedstawiona jest definicja formalna funkcji δ obliczającej kolejny stan maszyny Turinga.

δ: Γ × Q ⟶ Q × Γ × {L, P, −}

Definicja funkcji przejścia, która znajduje się powyżej oznacza, że na podstawie aktualnego stanu maszyny i symbolu wejściowego, funkcja odnajduje nowy stan maszyny, nowy symbol, a także decyzję dotyczącą przesunięcia głowicy. Przesunięcie zgodnie z powyższą funkcją może odbyć się w lewo, prawo lub może nie nastąpić w ogóle.

3.5.3.2 Zastosowanie w temacie języków formalnych

Maszyna Turinga może zostać zastosowana do zdefiniowania języków formalnych. Można za-tem określić, że dany ciąg znaków należy do danego języka, jeżeli istnieje maszyna Turinga o określonej krotce, która zatrzymuje się wtedy i tylko wtedy, kiedy dane wejściowe należą do danego języka. Nie wszystkie języki mogą być zdefiniowane poprzez maszynę Turinga. Oznacza to, że nie można stwierdzić w skończonym procesie, czy wskazane słowo należy do wskazanego języka. W sytuacji, w której mo-żemy dokonać takiej definicji i dla języka istnieje maszyna Turinga, język nazywamy rozpoznawalnym przez maszynę Turinga (Sipser 1996).

Jeżeli dany język jesteśmy w stanie zapisać za pomocą maszyny Turinga, język taki jest okre-ślony jako rekurencyjny. Oznacza to również, że możemy skonstruować automat, który pozwoli na przetwarzanie i analizę zawartości takiego języka.