Formális nyelv

A Wikipédiából, a szabad enciklopédiából

A formális nyelv a matematika, a logika és a informatika számára egy véges ábécéből generálható, véges hosszúságú szavak (például karakter stringek, jelsorozatok) halmaza, amelyekkel a formális nyelvek elmélete foglalkozik. (Más kontextusban, mint például jog vagy politika, a formális nyelv kifejezés alatt egy, a napi beszédtől eltérő, udvarias, megfontolt, körülíró jellegű, túlzottan modoros kifejezési módot értenek. Jelen cikkben a formális nyelvet a formális nyelvek elmélete szerint értjük, és minden esetben szigorúan csak írott nyelvről beszélünk, ezért a jelsorozat elemei megjeleníthető, nyomtatható karakterek.)

Definíció[szerkesztés | forrásszöveg szerkesztése]

Legyen A = \left \{ a_1, a_2, \dots, a_n \right \} véges halmaz, amelyet a továbbiakban ábécének nevezünk.

Készítsünk A elemeiből véges sorozatokat minden lehetséges módon. Jelölje A^{1} az egyelemű sorozatok halmazát (ezekből értelemszerűen annyi van, ahány jelből áll az ábécé), A^{2} a kételeműekét, és így tovább. A^{0} jelenti az üres sorozatok halmazát (ez megint csak könnyen beláthatóan egyelemű). A hatványjelölés a halmaz önmagával vett Descartes-szorzataira utal.

Jelölje A^* = A^{0} \cup A^{1} \cup A^{2} \cup \dots az ábécé elemeiből képzett véges sorozatok halmazát (ezt az A ábécé feletti univerzumnak hívjuk). Ekkor formális nyelvnek nevezzük A^{*}\, egy (nem feltétlenül valódi) részhalmazát. Szokásos még az A\, ábécé feletti formális nyelv megnevezés is.

Észrevehető, hogy a definíció megengedi az üres szót is (ami nem más, mint egy nulla hosszúságú jelsorozat), és gyakran az e, \epsilon vagy a \Lambda szimbólumokkal jelölik. Bár véges halmaz az ábécé, és a belőlük képzett jelsorozatok (szavak) hossza is véges (bár nem korlátos), egy nyelvhez mégis akár megszámlálhatóan végtelenül sok jelsorozat is tartozhat (mivel a szavak száma nincs korlátozva, akár a teljes univerzumot is vehetjük!). A formális nyelvek száma kontinuum számosságú (mivel az univerzum hatványhalmazát képezve megkapjuk az összes formális nyelv halmazát; és nyilván az univerzum megszámlálhatóan végtelen számosságú, mivel elemei felsorolhatóak).

Kitüntetett nyelvek az univerzum, a csak az üres jelsorozatot tartalmazó nyelv, és az egyetlen jelsorozatot sem tartalmazó nyelv.

Az egyes nyelveket szokás L betűvel jelölni, és ha többet is használunk, indexszel megkülönböztetni őket (például L_1, L_2, L_a, stb.)

Példák[szerkesztés | forrásszöveg szerkesztése]

Legyen az ábécé A=\left \{ a , b \right \}. Ekkor egy jelsorozat például ababba. Egy egyszerű nyelv lehet a fenti ábécé alapján például az, amely az összes olyan jelsorozatot tartalmazza, amelyekre igaz, hogy ugyanannyi a szimbólumból és b szimbólumból állnak.

Néhány további példa formális nyelvekre:

  • Az üres halmaz és maga A^* is nyelvek. Triviális nyelvek.
  • L_1 = \left \{ a^{n} : n \in \mathbb{N} \right \} (ahol a^n az a n-szeri ismétlését jelenti)
  • egy adott programozási nyelven szintaktikailag helyes programok halmaza, vagy
  • egy bizonyos Turing-gépet megállító bemeneti jelek halmaza.

Formális nyelvek megadása, definiálása[szerkesztés | forrásszöveg szerkesztése]

Egy formális nyelv nagyon sok lehetséges módon meghatározható, többek között:

Műveletek formális nyelvekkel[szerkesztés | forrásszöveg szerkesztése]

Adott formális nyelvből vagy nyelvekből műveletekkel új nyelvek állíthatóak elő. Tegyük fel, hogy L_{1} és L_{2} közös ábécén értelmezett nyelvek. A formális nyelvek halmazok, tehát a halmazműveletek minden további nélkül alkalmazhatóak rájuk:

Halmazműveletek[szerkesztés | forrásszöveg szerkesztése]

  • metszet – L_1 \cap L_2közösrész képzés művelet az L_{1} és L_{2} nyelvre előállítja az összes olyan jelsorozatot, amelyek L_1-ben és L_{2}-ben is léteznek.
  • unió – L_1 \cup L_2egyesítés művelet az L_{1} és L_{2} nyelvre előállítja az összes olyan jelsorozatot, amelyek vagy L_{1}-ben vagy L_{2}-ben léteznek.
  • komplementer – \bar{L_{1}} – az L_1 nyelvre előállítja az összes olyan jelsorozatot, amelyek az L_{1} nyelvben nem szerepelnek, de az A^{*} alaphalmazban igen.
  • különbség – L_1 \setminus L_2különbségképzés művelet az L_{1} és L_{2} nyelvekre előállítja az összes olyan jelsorozatot, amelyek L_1-ben léteznek, L_{2}-ben viszont nem.

A formális nyelvek speciális halmazok, így speciális műveletek is értelmezhetőek rajtuk:

Egyéb műveletek[szerkesztés | forrásszöveg szerkesztése]

  • konkatenáció – L_{1}L_{2}konkatenáció vagy összekapcsolás művelet előállítja az összes vw formájú jelsorozatot, ahol v egy L_{1}-ből származó jelsorozat, és w a L_{2}-ből származó jelsorozat.
  • A right quotientL_{1}/L_{2}különbségképzés művelet az L_{1} és L_{2} nyelvek között előállítja az összes olyan L_{2}-ben létező w jelsorozatot, amely jelsorozatok az L_{1} nyelvben vw formában fordulnak elő (ahol v jelsorozat az L_{1} nyelvben létezik).
  • A tranzitív lezárt (lezárt, lezárás, angolul Kleene star, Kleene csillag) – L_{1}^{*} – a tranzitív lezárt művelet előállítja az összes w_{1}w_{2}...w_{n} formában leírható jelsorozatot, ahol a w_{i} jelsorozat az L_{1} nyelvben létezik és n \ge 0). Meg kell jegyezni, hogy az n = 0 értékadás megengedett, tehát az \epsilon üres jelsorozat mindig része a L_{1}^{*} nyelvnek, minden L_{1} nyelvre! (Ha az eredeti nyelv nem is tartalmazta az üres jelsorozatot, a tranzitív lezártja akkor is tartalmazni fogja!) A legalább egy betűt (karaktert) tartalmazó nyelvek tranzitív lezártja végtelen számosságú; az elnevezés onnan származik, hogy a tranzitív lezárt az összes olyan elemet tartalmazza, ami az eredeti nyelv szavaiból kiindulva konkatenációk tetszőleges egymás után alkalmazásával megkapható (lezárt, mert ez a „legnagyobb” ilyen halmaz, elemeinek konkatenációjával már nem bővíthető).
  • A reverseL_{1}^{R}fordítottja művelet előállítja az összes L_{1} nyelvben létező jelsorozat fordítottját ( például az ababba jelsorozat fordítottja a abbaba jelsorozat).
  • A shuffle, megkever művelet az L_{1} és az L_{2} nyelvek között előállítja az összes v_{1}w_{1}v_{2}w_{2}...v_{n}w_{n} formában leírható jelsorozatot, ahol n \ge 1 és a v_{1},...,v_{n} jelsorozatok, amelyek az L_{1} nyelvben léteznek, és az előzőek szerinti értelemben össze vannak kapcsolva a w_{1},...,w_{n} jelsorozatokkal, amelyek az L_{2} nyelvben léteznek.

A generatív nyelvek[szerkesztés | forrásszöveg szerkesztése]

A formális nyelvek definíciója (hogy minden formális nyelv egy univerzum részhalmaza) nyilván általános, de praktikus értelemben használhatatlan definíció (hiszen például egy végtelen számosságú nyelvet nem tudunk kezelni így, nem tudjuk felsorolni az elemeit). A gyakorlati problémák szempontjából fontosabb a generatív nyelvek osztálya; generatív nyelvek azok a nyelvek, amelyekre igaz, hogy van olyan nyelvtan (más néven grammatika), ami éppen az ő elemeiket generálja.

Matematikai-nyelvészeti problémák[szerkesztés | forrásszöveg szerkesztése]

A formális nyelvekkel kapcsolatosan gyakran felmerülő kérdés „milyen nehéz eldönteni egy adott szóról, hogy egy adott nyelvhez tartozik-e?” Ez az alapja a kiszámíthatóságelméletnek és bonyolultságelméletnek.

További fontos, generatív nyelvekkel kapcsolatos problémák:

  • Egy nyelvtan a teljes univerzumot generálja-e?
  • Két nyelvtan ugyanazt a nyelvet generálja-e?
  • Egy nyelvtan által generált nyelv tartalmazza-e egy másik nyelvtan által generált nyelv minden szavát?

Lásd még[szerkesztés | forrásszöveg szerkesztése]

Források[szerkesztés | forrásszöveg szerkesztése]