Tehtävä:
Yhteys­riippu­mattomat kieli­opit

Tässä tehtä­vässä opiskel­laan yhteys­riippu­mattomia kieli­oppeja ja niiden tuottamia kieliä. Kokeile rohkeasti eri ala­tehtäviä niin paljon kuin haluat ja kokeile myös tahallasi vääriä vastauksia, sillä sekin on usein hyödyksi oppimi­selle. Vastaukset tarkastava ohjelma on nimeltään MathCheck. Se ei tiedä kuka olet, eikä se talleta vastauk­siasi mihinkään.

Kuva­ruudun oikeassa ala­reunassa olevat laatikot ja napit ovat tarpeen vasta lähellä tämän veppi­sivun loppua. Älä välitä niistä ennen sitä.

Joidenkin ala­tehtävien kohdalla on hyvä tietää, että äärel­linen joukko esitetään usein luettelona aalto­sulkeiden välissä tyyliin {1, 2, 3}. Ei ole väliä missä järjestyk­sessä alkiot luetellaan, joten {3, 1, 2} on sama joukko kuin {1, 2, 3}. On olennaista, esiintyykö alkio vähintään yhden kerran vai ei, mutta ei ole olennaista, esiintyykö alkio kerran, kahdesti vai useammin. Siksi {1, 2, 3, 1} on sama joukko kuin {1, 2, 3} mutta eri joukko kuin {2, 3}.

  1. Merkki eli loppu­symboli, sekä aakkosto
  2. Merkki­jono eli sana
  3. Tyhjä merkki­jono
  4. Kieli
  5. Esi­merkki: kolmella jaollisuus
  6. Yhteys­riippu­mattoman kieli­opin kirjoit­taminen
  7. Yhteys­riippu­mattoman kieli­opin tuottama kieli
  8. Kieli­oppien muodostaminen itse

1. Merkki eli loppu­symboli, sekä aakkosto

Ensim­mäinen tarvitsemamme käsite on merkki. Merkkien joukko vaihtelee tilanteen mukaan. Tässä tehtä­vässä sallittuja merkkejä ovat numerot, pienet kirjaimet (ei kuitenkaan å, ä ja ö) sekä useimmat välimerkit kuten ! ja jotkut erikoismerkit kuten @. Isot kirjaimet, väli­lyönti, " ja ; eivät ole sallittuja merkkejä. Jatkossa riittää, että muistat, että isot kirjaimet, väli­lyönti, " ja ; eivät ole sallittuja merkkejä tässä tehtä­vässä.

Huo­mau­tus: sii­nä roo­lis­sa mis­sä nyt on "", ope­tus­ko­keen ai­ka­na oli $. Al­ku­pe­räi­nen va­lin­ta osoit­tau­tui huo­nok­si ja muu­tet­tiin se­kä Math­Checkis­sä et­tä täs­sä teh­tä­väs­sä. Tä­tä teh­tä­vää on kui­ten­kin muu­tet­tu vain sen ver­ran kuin oli vält­tä­mä­tön­tä jot­ta se toi­mi­si ny­kyi­sel­lä Math­Checkil­lä; teh­tä­vän nar­ra­tii­via ei ole päi­vi­tet­ty.

Kirjoita tähän mikä tahansa sallittu merkki. Sitten paina jompaa kumpaa vastausnappia, tai vaikka molempia vastausnappeja vuoron perään. ”oikealle” kirjoittaa palautteen oikealla olevaan isoon laatikkoon. ”uuteen” avaa uuden välilehden tai ikkunan ja kirjoittaa palautteen sinne. Se on kätevä, jos palaute ei mahdu oikealla olevaan laatikkoon. Kokeile myös kielletyillä merkeillä, mutta varaudu siihen, että (syistä, joista puhumme myöhemmin) virhe­ilmoitukset voivat olla vaikeatajuisia.
tai

Kun jatkossa käytetään sanaa merkki tarkoitetaan sallittua merkkiä, ellei erikseen ole mainittu että voidaan tarkoittaa myös kiellettyä merkkiä.

Käytössä olevien merkkien joukkoa kutsutaan aakkostoksi (englan­niksi alphabet). Aakkostossa voi olla vain sallittuja merkkejä. Aakkosto vaihtelee tapauskohtaisesti. Tässä tehtä­vässä siis h, 3 ja ? kuuluvat aakkostoon joissakin ala­tehtävissä ja joissakin toisissa eivät kuulu, mutta H ja " eivät kuulu koskaan.

Yhteys­riippu­mattomien kieli­oppien yhteydessä merkkejä kutsutaan myös loppu­symboleiksi (terminal) syystä, johon tulemme palaamaan.

2. Merkki­jono eli sana

Kun nolla tai useampia sallittuja merkkejä pannaan peräkkäin, saadaan merkki­jono (string) eli sana (word). Merkki­jonon pituus on siihen kuuluvien merkkien määrä.

Tässä ala­tehtä­vässä merkeiksi hyväksytään vain a, b ja c.
Kirjoita merkki­jono, jonka pituus on 5.
Kirjoita merkki­jono, jonka pituus on 1.
tai

Valitse oikeat vaihtoehdot.
Edellisessä ala­tehtä­vässä aakkosto oli {a, b, c}.
Merkki­jonon jokaisen merkin pitää olla sama. Siis abaa ei ole merkki­jono, koska siinä on kahta eri merkkiä a ja b.
Jokainen merkki on merkki­jono.
Jokainen merkki­jono on merkki.
tai

Muodosta kaikki merkki­jonot, jotka saadaan ottamalla yksi merkki­jonoista an, ana ja s; laitta­malla sen perään jompi­kumpi jäljelle jääneistä; ja lisäämällä loppuun viimeiseksi jäljelle jäänyt. Jos et keksi tarpeeksi montaa vastausta, älä jätä mitään kohtaa tyhjäksi vaan laita sama vastaus moneen kohtaan, jotta virhe­ilmoitus olisi helpompi ymmärtää.





tai

Muodosta kaikki merkki­jonot, jotka saadaan ottamalla alkuosaksi auto tai ammatti ja loppuosaksi koulu tai kuski.



tai

Nyt tavoitteena on selvittää, kuinka pitkä merkki­jono syntyy, kun tunnetun pituisen merkki­jonon perään liitetään tunnetun pituinen merkki­jono. Täydennä taulukko.
ekan pituustokan pituustuloksen pituus
72
04
xy
tai

3. Tyhjä merkki­jono

Merkki­jonossa voi olla 0 merkkiä. Kirjoita tähän sellainen merkki­jono:
tai

Tyhjä merkki­jono todellakin tarkoittaa merkki­jonoa, jossa ei ole mitään. Se vaikeuttaa tyhjästä merkki­jonosta puhumista. Lausepari

Merkki­jonossa koira esiintyy merkki r. Merkki­jonossa heppa ei esiinny merkkiä i.

on ongelmaton, mutta jos merkki­jonon heppa tilalle laitetaan tyhjä merkki­jono, saadaan

Merkki­jonossa koira esiintyy merkki r. Merkki­jonossa ei esiinny merkkiä i.

Siitä syntyy vaikutelma, että väitetään, että koira:ssa ei esiinny i:tä, kun tarkoitus oli väittää, että tyhjässä merkki­jonossa ei esiinny i:tä.

Tämä ilmiö on toisinaan hyvin hankala. Olisi muun muassa ollut liian vaikeaa rakentaa MathCheck sellai­seksi, että se ei koskaan hämääntyisi sen vuoksi. Siksi sitä ei edes yritetty vaan tyydyttiin kompromissiin, jossa MathCheckin antama virhe­ilmoitus voi olla omituinen silloin, kun vastaus­ruutu on tyhjä.

Tähän pulmaan on kaksi laajasti käytettyä ratkaisua. Ensim­mäisessä merkki­jonojen alku ja loppu osoitetaan jotenkin, usein lainaus­merkeillä. Silloin äskeisen esi­merkin merkki­jonot esitetään näin: ”heppa” ja ””. Jos merkki­jonot ”an”, ”ana” ja ”s” laitetaan peräkkäin tässä järjestyk­sessä, ei tule ”an””ana””s” vaan ”ananas”, koska lainaus­merkit eivät ole osa itse merkki­jonoa vaan keino osoittaa, missä merkki­jono alkaa ja missä se loppuu.

Olet ehkä jo huomannut, että MathCheck käyttää tätä tapaa vastauk­sissaan. Tässä sinulle tehtävä, johon et voi vastata oikein, koska et voi kirjoittaa vastausta. Voit vain painaa nappua.
tai

Yhteys­riippu­mattomissa kieli­opeissa esiintyy usein paljon lyhyitä merkki­jonoja. Silloin lainaus­merkkejä tulisi niin paljon, että ne häirit­sisivät varsi­naista asiaa. Siksi on tavallista jättää lainaus­merkit pois. Tällöin tyhjä merkki­jono esitetään yleensä kreikkalaisella kirjaimella ε, joka luetaan epsilon.

No niin, kirjoitapas seuraavaan ruutuun ε! Eikö näppäi­mistössäsi ole sellaista näppäintä? Keinoja on kyllä olemassa, voit esimer­kiksi maalata, kopioida ja pudottaa symbolin tästä: ε Keinot ovat kuitenkin liian hankalia. Siksi tämä on ainoa ala­tehtävä, jossa sinun tarvitsee kirjoit­taa ε.
tai

Tarvitsemme helpommin kirjoitettavan symbolin esit­tämään tyhjää merkki­jonoa. Siihen tehtävään sopii "", koska se on melko helppo kirjoittaa näppäimistöltä eikä ole jo varattu muihin tässä yhteydessä tärkeisiin tehtäviin, toisin kuin esimer­kiksi +, jota tarvitaan matema­tiikan kaavojen kieli­opeissa. Tästä eteenpäin, kun sinun pitää jostain syystä kirjoittaa tyhjä merkki­jono MathCheck:lle, niin kirjoita "".

Kirjoita ε.
tai

Vastauk­sissaan MathCheck käyttää tyhjän merkki­jonon symbolina "", koska vastaukset esiintyvät usein yhteydessä, jossa lainaus­merkkien käyttö on tarpeen. Esimer­kiksi seuraava lause on varsin sekava koska lainaus­merkit puuttuvat: tärkeitä välimerkkejä ovat ?, !, , ja ..

Esitä äskeisen lauseen loppu kysymysmerkistä alkaen loppupiste mukaan lukien siten, että käytät lainaus­merkkejä. Käytä sitä lainaus­merkin symbolia, joka on helpoin kirjoittaa näppäimistöltä. Valitettavasti MathCheck menee sekaisin jos käytät välilyöntejä, joten jätä ne pois, vaikka ne kuuluisivatkin asiaan.
tai

Valitse oikeat vaihtoehdot.
"" on tyhjän merkki­jonon symboli MathCheck:in syöte­kielessä. Muualla käytetään usein symbolia ε.
"" eli ε on merkki.
Merkki­jonossa "" eli ε ei ole yhtään merkkiä.
Jos σ on merkki­jono, niin εσ tarkoittaa samaa merkki­jonoa.
Jos σ on merkki­jono, niin σε tarkoittaa eri merkki­jonoa.
tai

4. Kieli

Matema­tiikassa ja teoreettisessa tietojen­käsittely­tieteessä kieli (language) on joukko merkki­jonoja. Ei sen enempää eikä vähempää. Esimer­kiksi koira kuuluu suomenkielen sanojen joukkoon, mutta dog ja gfrwwstxq eivät kuulu.

Vaikka tästä kielen käsitteestä puuttuvat sanojen ja lauseiden merki­tykset, se ei ole ollenkaan niin tyhjän­päiväinen kuin aluksi saattaa näyttää. Tarkastellaan esimer­kiksi kieltä, johon kuuluvat ne ja vain ne epätyhjät numero­jonot, joiden esittämä lukuarvo on alkuluku. Ei ole ihan helppoa selvittää, onko annettu luonnol­linen luku alkuluku. Hidas keino tämän tehtävän ratkaisemiseksi on tunnettu ainakin antiikin ajoista saakka, mutta taatusti aina kohtuullisen nopea keino keksittiin vasta niinkin myöhään kuin vuonna 2002.

Jos (a) mikä tahansa luonnol­linen luku osataan esittää numero­jonona ja (b) mistä tahansa merkki­jonosta pystytään selvit­tämään kuuluuko se tähän kieleen, niin pystytään selvit­tämään, onko mikä tahansa annettu luonnol­linen luku alkuluku. Vaihe (a) on hyvin helppo ja tuttu, kuten seuraava ala­tehtävä havainnol­listaa.

Esitä kaksikymmentäviisi numero­jonona. tai

Koska (a) on hyvin helppo ja koska (a) ja (b) yhdessä muodostavat keinon ratkaista jossain määrin vaikea tehtävä, täytyy (b):n olla jossain määrin vaikea.

Samanlainen päättely pätee suurelle joukolle muita tehtäviä, jotka ovat erittäin paljon vaikeampia kuin sen selvit­täminen, onko annettu luonnol­linen luku alkuluku. Siksi tehtävä, kuuluuko annettu merkki­jono annettuun kieleen, voi olla äärimmäisen vaativa. Tämä pätee vaikka kielen käsite itsessään on hyvin yksinkertainen — se on vain merkki­jonojen jako kahtia: niihin, jotka ovat mukana ja niihin, jotka ovat ulkona.

Avain­asemassa tässä on, millä tavalla ”annettu kieli” annetaan. Jotta tieto­kone voisi etsiä vastausta kysymykseen kuuluuko annettu merkki­jono annettuun kieleen, sille pitää tavalla tai toisella antaa sekä merkki­jono että kieli. Merkki­jonon antamista harjoit­telimme edellä. Opimme esit­tämään jopa tyhjän merkki­jonon, vaikka siihen tarvit­tiinkin vippas­konsti. Kielen esittäminen tieto­koneelle on moni­muotoinen asia. Aloittakaamme sen pohtiminen esimer­killä.

Tässä laatikossa on yhteys­riippu­maton kieli­oppi, joka esittää kolmella jaollisten luonnol­listen lukujen kielen. Se on esitetty MathCheckin ymmärtämässä muodossa. Älä vielä murehdi miten ja miksi se toimii, siihen palaamme myöhemmin.

Kokeile tätä kieli­oppia kirjoit­tamalla kolmella jaollisia ja kolmella jaottomia lukuja! Kokeile myös merkki­jonoja, jotka eivät esitä lukuja.
tai

Pystyimme siis esit­tämään kolmella jaollisten luonnol­listen lukujen kielen tieto­koneelle. Kysymys ”onko annettu luonnol­linen luku kolmella jaollinen” voidaan nyt ratkaista esittämällä luku numero­jonona (mikä on hyvin helppoa, kuten edellä todettiin) ja testaa­malla, kuuluuko annettu merkki­jono esit­tämäämme kieleen.

Äärettömien joukkojen teorian avulla voidaan todistaa vastaan­sanomat­tomasti, että ei ole eikä voi olla olemassa esitys­tapaa, joka pystyisi esit­tämään kaikki kielet. Tunnetaan useita esitys­tapoja. Toisessa ääri­päässä olevat tavat mahdol­listavat hyvin tehokkaan käsittelyn tieto­koneella, mutta ne pystyvät esit­tämään vain vähän kieliä. Vastak­kaisessa ääri­päässä olevat tavat pystyvät esit­tämään paljon kieliä, mutta moni tarpeellinen asia on mahdoton tehdä tieto­koneella.

Yhteys­riippu­mattomat kieli­opit sijaitsevat keski­alueella. Niillä ei pystytä esit­tämään kovin paljoa kieliä, mutta pystytään kuitenkin niin paljon, että siitä on suurta hyötyä käytännössä. On kohtalaisen helppoa testata, kuuluuko annettu merkki­jono annetun yhteys­riippu­mattoman kieli­opin esit­tämään kieleen. Yhteys­riippu­mattomat kieli­opit ovat siis hyvä kompromissi ääri­päiden väliltä. Siksi niitä käytetään erittäin paljon tietojen­käsittelyssä.

Valitse jokaiselle vasemman reunan olennolle, onko se merkki (vasen ruutu), onko se merkki­jono (keskim­mäinen ruutu) ja onko se kieli (oikea ruutu).

k
tai
{k}
tai
koira
tai
{koira}
tai
koira, kissa, heppa
tai
{koira, kissa, heppa}
tai
ε
tai
{ε}
tai

Voi tuntua omitui­selta, että yksit­täinen merkki on samalla merkki­jono, mutta yksit­täinen merkki­jono ei ole kieli (vaikka muuttuu kieleksi, jos sen ympärille lisätään { ja }). Lähtö­kohtai­sesti olento on eri asia kuin kokonaisuus, jonka osana olento on. Joukko-oppi menisi aivan rikki, ellei pidettäisi tiukasti kiinni siitä, että x ≠ {x}.

Lähtö­kohtai­sesti myös merkki ja merkki­jono ovat eri asioita. Kun merkki­jono esitetään lainaus­merkeillä, tämä tulee näkyväksi: a on merkki eikä merkki­jono, ja ”a” on merkki­jono eikä merkki. Matema­tiikassa on kuitenkin tapana luopua tällaisista jyrkistä erotte­luista silloin kun mahdol­lista, koska niin on helpompaa. Merkin tulkit­seminen merkki­jonoksi ei riko mitään mutta helpottaa asioita. Siksi niin on päätetty.

Valitse oikeat vaihtoehdot.
On olemassa monia eri tapoja esittää kieli tieto­koneelle.
Nykyaikaisen tieto­tekniikan valtava menestys perustuu siihen, että moni­mutkaisten kielten käsittely tieto­koneella on helppoa kuin heinän­teko.
Mikä tahansa kieli voidaan esittää tieto­koneelle luettelemalla siihen kuuluvat merkki­jonot.
Teoreettisen tietojen­käsittely­tieteen käyttämä kielen määri­telmä ei ota kantaa merkki­jonojen merkityksiin.
Jokainen merkki on merkki­jono.
Jokainen merkki­jono on kieli.
tai

5. Esi­merkki: kolmella jaollisuus

Kun luonnol­linen luku jaetaan kolmella kokonais­lukujakona, jako­jäännös voi saada vain kolme eri vaihtoehtoa: 0, 1 ja 2. Esimer­kiksi 7 = 3+3+1, joten 3 menee seitsemään kaksi kertaa ja jako­jäännös on 1.

jaettava=osamääräkertaa jakajaplusjako­jäännös
7=2·3+1
15=5·3+0
5=1·3+2

Kun luonnol­linen luku esitetään numero­jonona, niin sen jako­jäännös kolmella jaettaessa voidaan laskea käymällä numerot yksitellen läpi, laskemalla kunkin niistä jako­jäännös kolmella jaettaessa, ja laskemalla näin saadut luvut yhteen siten että aina kun summa ylittää kakkosen, siitä vähennetään 3. Alla näytetään, miten tällä tavalla saadaan tulokseksi, että luvun 327685 jako­jäännös kolmella jaettaessa on 1.

numerot32768 5
jako­jäännös02102 2
summa023
0024
1

Alla oleva yhteys­riippu­maton kieli­oppi hyödyntää tätä periaatetta. Se etenee numero­jonossa oikealta vasem­malle eli vastak­kaiseen suuntaan kuin äskeisessä esimer­kissä edettiin, mutta tämä ei riko periaatetta. Kutakin kieli­opissa esiintyvää isoa kirjainta kutsutaan väli­symboliksi (nonterminal). Kukin väli­symboli edustaa tietynlaisia numero­jonoja seuraa­vasti:

N ne numerot, joiden luku­arvon jako­jäännös on 0
Y ne numerot, joiden luku­arvon jako­jäännös on 1
K ne numerot, joiden luku­arvon jako­jäännös on 2
A ne epätyhjät numero­jonot, joiden luku­arvon jako­jäännös on 0
B ne epätyhjät numero­jonot, joiden luku­arvon jako­jäännös on 1
C ne epätyhjät numero­jonot, joiden luku­arvon jako­jäännös on 2
A::= N | NA | YC | KB
B::= Y | NB | YA | KC
C::= K | NC | YB | KA
N::= 0 | 3 | 6 | 9
Y::= 1 | 4 | 7
K::= 2 | 5 | 8

Pysty­viivalla on erotettu toisistaan eri vaihtoehdot, joilla vasemman reunan väli­symbolin kieleen kuuluva merkki­jono voi muodostua. Esimer­kiksi rivi

B ::= Y | NB | YA | KC

tarkoittaa, että kieleen B kuuluva merkki­jono muodostuu jollakin seuraavista tavoista:

Luonnol­linen luku on kolmella jaollinen, jos ja vain jos sen jakojäännös kolmella jaettaessa on 0. Kolmella jaollisten luonnol­listen lukujen kieli on siis väli­symbolin A kieli.

6. Yhteys­riippu­mattoman kieli­opin kirjoit­taminen

Yhteys­riippu­maton kieli­oppi esitetään tyypillisesti yhtenä tai useampana väli­symbolin määri­telmänä. Väli­symbolin määri­telmässä on ensin iso kirjain, sitten ::= ja lopuksi yksi tai useampi määri­telmä­jono pysty­viivalla | toisistaan erotettuina, kuten tässä esimer­kissä:

X ::= "" | aX | bX

Sama iso kirjain saa esiintyä enintään yhden kerran määri­teltävänä väli­symbolina, siis juuri ennen ::=.

On tapana kirjoittaa kukin väli­symbolin määri­telmä omalle rivilleen, mutta MathCheck ei vaadi sitä. Sen sijaan MathCheck vaatii, että pysty­viiva ja sitä edeltävä määri­telmä­jono eivät ole kiinni toisissaan. Jos ne ovat kiinni toisissaan, MathCheck tulkitsee pysty­viivan osaksi määri­telmä­jonoa. Jos saat jatkossa käsittä­mättömiä virhe­ilmoituksia, tarkista, että olet käyttänyt pysty­viivaa oikein.

Korjaa annettu kieli­oppi.

tai

Kokeile, mitä edellisessä ala­tehtä­vässä tapahtuu, jos lisäät a:n ja X:n väliin välilyönnin. Osaatko selittää ilmiön? (Ei ole väliä, teetkö lisäyksen alkuperäiselle vai korjatulle kieli­opille.)

Määri­telmä­jono on muuten kuten epätyhjä merkki­jono, mutta siinä saa esiintyä aakkoston merkkien lisäksi isoja kirjaimia ja ε. (MathCheckille ε:n sijaan kirjoi­tetaan "".) (Sana ”määri­telmä­jono” ei ole yleisessä käytössä. Normaalisti sen sijaan puhutaan merkki­jonoista. Silloin kuitenkin käytössä on yhtäaikaa kaksi erilaista merkki­jonon käsitettä, aiheuttaen sekaan­tumisen vaaran.)

Jokainen väli­symboli esittää yhtä kieltä. Yksi väli­symboleista on alku­symboli (start symbol). Jollei muuta sanota, alku­symboli on ensim­mäisenä määri­telty väli­symboli. MathCheckin voi käskeä käyt­tämään muuta väli­symbolia lisäämällä kieli­opin perään kaksois­pisteen : ja sen ison kirjaimen, jonka haluaa alku­symboliksi. Älä kirjoita kaksois­pistettä välittömästi kiinni edelliseen määri­telmä­jonoon.

Muuta kieli­oppi sellaiseksi, että se tuottaa kielen C eli ne numero­jonot, joiden luku­arvon jakaminen kolmella tuottaa jakojäännökseksi 2. Sen voi tehdä kahdella tavalla, hoksaatko molemmat?

tai

Väli­symbolia saa käyttää määri­telmä­jonoissa, vaikka sitä itseään ei määri­teltäisi. Sellainen väli­symboli tuottaa tyhjän kielen eli ei tuota yhtään merkki­jonoa. Määrit­tele kieli O, jossa ei ole yhtään merkki­jonoa. Sen voi tehdä kahdella tavalla, osaatko molemmat?

tai

Alussa aakkostosta kiellettiin isot kirjaimet, "", ; ja väli­lyönti. Olisi ollut mahdol­lista kehittää vippas­konsteja, joilla nekin olisi voitu sallia. Silloin tämä alaluku olisi muuttunut moni­mutkai­semmaksi. Se olisi ollut minusta paljon suurempi haitta kuin näiden merkkien kieltäminen.

Isojen kirjainten ja "":n kielto aakkostosta on saanut seli­tyksen: niillä on tärkeä muu tehtävä. Väli­lyönti on kielletty siksi, että muutoin olisi jotakuinkin mahdo­tonta suunnitella selkeä kokonaisuus, joka ei perustu lainaus­merkkeihin. ; on kielletty siksi, että MathCheck käyttää sitä sisäisesti ilmoittamaan kieli­opin loppua. Jollei kieli­opilla olisi loppu­merkkiä, joissakin tilanteissa olisi mahdo­tonta antaa järkevää virhe­ilmoi­tusta. Sinun ei kuitenkaan tarvitse kirjoittaa sitä, koska tehtävissä se on kirjoi­tettu valmiiksi piiloon vastauk­sesi perään. (Kyllä, saat kokeilla mitä tapahtuu jos kirjoitat sen.)

Valitse oikeat vaihtoehdot.
Merkki­jonossa voi esiintyä isoja kirjaimia.
Määri­telmä­jonossa voi esiintyä isoja kirjaimia.
Merkki­jonossa voi esiintyä |.
Määri­telmä­jonossa voi esiintyä |.
Merkki­jonossa voi esiintyä "".
Määri­telmä­jonossa voi esiintyä "".
tai

Sallittuja merkkejä kutsutaan myös loppu­symboleiksi, koska yhteys­riippu­mattoman kieli­opin tuottama merkki­jono koostuu vain niistä ja koska se on johdon­mukaista sanojen alku­symboli ja väli­symboli käytön kanssa.

7. Yhteys­riippu­mattoman kieli­opin tuottama kieli

Ensin pitää tietää, mitä tarkoittaa kielten laittaminen peräkkäin. Esitte­lemme sen esimer­killä, jossa on kolme kieltä:

K, L ja M peräkkäin laitettuna muodostaa kielen, jossa on ne ja vain ne merkki­jonot, jotka saadaan valitsemalla mikä tahansa K:n alkio, laitta­malla sen perään mikä tahansa L:n alkio ja lopuksi mikä tahansa M:n alkio. Esi­merkin kielessä on 12 merkki­jonoa seuraa­vasti:

K:n alkioL:n alkioM:n alkioloppu­tulos
kanaεkoppi kanakoppi
kanaεva kanava
kanankoppi kanankoppi
kananva kananva
kissaεkoppi kissakoppi
kissaεva kissava
kissankoppi kissankoppi
kissanva kissanva
koiraεkoppi koirakoppi
koiraεva koirava
koirankoppi koirankoppi
koiranva koiranva

Huomasithan, että ε jätetään pois epätyhjistä loppu­tulok­sista. Jos loppu­tulok­seksi tulee esimer­kiksi εε tai εεε, sen paikalle kirjoi­tetaan ε. Näin tehdään, koska ε ei ole merkki, vaan symboli, joka edustaa sitä merkki­jonoa, jossa ei ole yhtään merkkiä.

Kielten peräkkäin laittamisen loppu­tulos riippuu yleensä järjestyk­sestä. Laita {kukka, salaatti} ja {ruukku} peräkkäin siten, että {kukka, salaatti} on ensin.
{, } tai

Laita {kukka, salaatti} ja {ruukku} peräkkäin siten, että {ruukku} on ensin.
{, } tai

Määri­telmä­jonon σ tuottama kieli L(σ) on sen osien tuottamat kielet laitettuna peräkkäin. Osien tuottamat kielet määräytyvät seuraa­vasti:

Jos väli­symbolin A määri­telmä on muotoa

A ::= σ1 | σ2 | ⋯ | σn

missä jokainen σi on määri­telmä­jono, niin L(A) = L1) ∪ L2) ∪ ⋯ ∪ Ln). Tämä tarkoittaa, että merkki­jono kuuluu väli­symbolin tuottamaan kieleen jos ja vain jos yksikin väli­symbolin määri­telmän oikealla puolella esiintyvistä, pysty­viivoin toisistaan erote­tuista vaihtoehdoista tuottaa ko. merkki­jonon.

Yhteys­riippu­mattoman kieli­opin tuottama kieli on sen alku­symbolin tuottama kieli.

Luettele tämän kieli­opin tuottamat merkki­jonot pysty­viivalla toisistaan erotet­tuina. Muista laittaa jokaisen pysty­viivan eteen ainakin yksi väli­lyönti (tai rivinsiirto).
tai

Kuinka monta eri merkki­jonoa edellisen ala­tehtävän vastauk­sessa on?
tai

Kirjoita jokin edellisen ala­tehtävän kielen merkki­jono vastaus­ruutuun ja paina nappia, niin saat kuvan, joka esittää, miten merkki­jono rakentuu kielen määri­telmän mukaisesti. Tällaista kuvaa kutsutaan merkki­jonon jäsennys­puuksi. Toista muutamalla merkki­jonolla. Niille merkki­jonoille, jotka voidaan tuottaa kahdella tavalla, kone piirtää kuvan yhdestä tavasta.
tai

Väli­symbolin määri­telmä voi viitata väli­symboliin itseensä. (Tätä kutsutaan rekursioksi.) Yksinkertaisin hyödyllinen esi­merkki tästä on

A ::= ε | aA.

Nyt selvitämme kielen, jonka A tuottaa.

Kirjoita jokin kieli­opin A ::= ε | aA tuottama merkki­jono vastaus­ruutuun ja paina nappia, niin saat merkki­jonon jäsennys­puun. Toista muutamalla merkki­jonolla.
tai

Kieli­oppi A ::= ε | Aa tuottaa samat merkki­jonot kuin äskeinen kieli­oppi, mutta jäsennys­puista tulee erilaisia. Kokeile muutamalla merkki­jonolla.
tai

Kieli­oppi A ::= A | aA | Aa ei tuota yhtään merkki­jonoa. Merkki­jonojen tuottaminen ei pääse alkuun, koska siinä ei ole yhtään vaihtoehtoa, joka tuottaisi merkki­jonon käyttä­mättä sen osana A:han kuuluvaa merkki­jonoa.

8. Kieli­oppien muodostaminen itse

Jatkossa on tehtäviä, joissa sinua pyydetään kirjoit­tamaan kieli­oppi. Jos MathCheck ilmoittaa, että kieli­oppisi tuottaa merkki­jonon jota se ei saisi tuottaa, voi olla hyödyllistä saada nähdä, miten kieli­oppisi sen tuottaa. Sitä varten oikealla alhaalla on keski­kokoinen laatikko johon voit syöttää kieli­opin, pieni laatikko johon voit syöttää merkki­jonon ja kaksi nappia joita painamalla saat jäsennys­puun, jos antamasi merkki­jono kuuluu antamasi kieli­opin tuottamaan kieleen. Voisi olla hyödyllistä saada apua myös tilanteeseen, jossa kieli­oppisi jättää tuottamatta jonkin merkki­jonon joka sen pitäisi tuottaa, mutta valitettavasti sitä en osaa järjestää.

Kirjoita kieli­oppi kielelle A, johon kuuluvat ne ja vain ne merkki­jonot, joissa on pelkästään a-kirjaimia ja joiden pituus on 3 tai 5 tai 7 tai 9 tai …
tai

Vaikka olisit saanut äskeisen ala­tehtävän heti oikein, jatkon kannalta voi olla hyödyllistä, että harjoit­telet oikeassa alareunassa olevien laatikoiden käyttöä. Siksi kopioi kieli­oppisi keski­kokoiseen laatikkoon, kirjoita pieneen laatikkoon jokin kieli­oppisi tuottamaan kieleen kuuluva merkki­jono, ja paina vastausnappia. Muistathan, että saat alku­symbolin vaihdettua lisäämällä loppuun välilyönnin ja esimer­kiksi :A.

Kaikki merkki­jonot, joissa on joko a:ta tai b:tä mutta ei molempia, saadaan kieli­opilla

X ::= A | B
A ::= ε | aA
B ::= b | bB

Huomaathan, että ε tulee X:n kieleen A:n kautta mutta ei B:n kautta? Tämän olisi tietenkin voinut tehdä toisinkin päin, tai ottaa ε mukaan vasta X:ssä, tai ottaa ε mukaan sekä A:n että B:n kautta.

Kirjoita äskeinen kieli­oppi uusiksi siten, että ε tulee mukaan vasta X:ssä.
tai

Kaikki merkki­jonot, joissa on joko a:ta tai b:tä tai molempia ihan missä järjestyk­sessä tahansa, saadaan kieli­opilla

X ::= ε | aX | bX

Kirjoita kieli­oppi kielelle K, johon kuuluvat ne ja vain ne merkki­jonot, joissa on vähintään yksi a ja vähintään yksi b. Muun muassa aaab ja ba kuuluvat tähän kieleen, mutta bbb ei kuulu.
tai

Ne merkki­jonot, joissa on ensin jokin määrä a:ta ja sitten sama määrä b:tä saadaan näin:

Z ::= ε | aZb

Palindromi on merkki­jono, joka on sama etuperin ja takaperin. Kuuluisia suomen­kielen palindromeja ovat mm. saippuakauppias ja innostunutsonni. Kirjoita kieli­oppi palindromien kielelle P, kun aakkosto on {a, b}.
tai

Määrit­tele kieli S, joka ilmaisee lailliset sulutukset. Kielessä käytetään vain merkkejä ( ja ). Laillisessa sulutuksessa jokaisella alku­sululla on sitä vastaava loppu­sulku ja päinvastoin. Esimer­kiksi (), (()) ja ()(()) ovat laillisia sulutuksia. Alku­sulku on merkki­jonossa aikaisemmin kuin sitä vastaava loppu­sulku, joten )( ei ole laillinen sulutus. Myöskään (() ei ole laillinen sulutus, koska siinä jompi­kumpi alku­sulku jää vaille vastaavaa loppu­sulkua. Myös tyhjä merkki­jono on laillinen sulutus.
tai

Yhteys­riippu­mattomat kieli­opit sopivat hyvin matemaat­tisten lausek­keiden rakenteen määrit­telemiseen. Niitä käytetään paljon myös ohjelmointi­kielten syntaksin määrit­telyssä. Ne ovat niin laaja aihepiiri, että ansaitsevat oman tehtävänsä.