Teh­tä­vä:
Li­sää BNF-har­joi­tuk­sia

Tä­mä teh­tä­vä on jat­koa teh­tä­väl­le Backus-Naur Form. Täs­sä teh­tä­väs­sä har­joi­tel­laan yh­teys­riip­pu­mat­to­mien kie­li­op­pien muo­dos­ta­mis­ta ja sel­ven­ne­tään joi­ta­kin yk­si­tyis­koh­tia.

Jos oi­keal­la al­haal­la ole­vaan isoon laa­tik­koon kir­joit­taa kie­li­opin, pie­neen laa­tik­koon kir­joit­taa merk­ki­jo­non, ja pai­naa nap­pia, niin Math­Check piir­tää merk­ki­jo­non jä­sen­nys­puun tai ker­too, et­tä merk­ki­jo­no ei kuu­lu kie­leen. Täs­tä voi ol­la hyö­tyä kun rat­kais­tes­sa­si al­la ole­via teh­tä­viä saat pa­lau­tet­ta, et­tä kie­li­op­pi­si tuot­taa jon­kin merk­ki­jo­non jo­ta ei oli­si pi­tä­nyt tuot­taa.

Ol­koon A ::= 0 | 1 ja B ::= A | AB. Ly­hen­ne ”n.y.k.” tar­koit­taa ”nol­lis­ta ja / tai yk­kö­sis­tä koos­tu­vat”. Mit­kä seu­raa­vis­ta pi­tä­vät paik­kan­sa?
A on kaik­ki n.y.k. jo­not.
A on kaik­ki n.y.k. epä­tyh­jät jo­not.
A on kaik­ki n.y.k. jo­not pi­tuu­del­taan 1.
B on kaik­ki n.y.k. jo­not.
B on kaik­ki n.y.k. epä­tyh­jät jo­not.
B on kaik­ki n.y.k. jo­not pi­tuu­del­taan 1.
tai

Mit­kä seu­raa­vis­ta pi­tä­vät paik­kan­sa?
A si­säl­tää ai­na­kin kaik­ki n.y.k. jo­not.
A si­säl­tää ai­na­kin kaik­ki n.y.k. epä­tyh­jät jo­not.
A si­säl­tää ai­na­kin kaik­ki n.y.k. jo­not pi­tuu­del­taan 1.
B si­säl­tää ai­na­kin kaik­ki n.y.k. jo­not.
B si­säl­tää ai­na­kin kaik­ki n.y.k. epä­tyh­jät jo­not.
B si­säl­tää ai­na­kin kaik­ki n.y.k. jo­not pi­tuu­del­taan 1.
tai

Mit­kä seu­raa­vis­ta pi­tä­vät paik­kan­sa?
A si­säl­tää enin­tään kaik­ki n.y.k. jo­not.
A si­säl­tää enin­tään kaik­ki n.y.k. epä­tyh­jät jo­not.
A si­säl­tää enin­tään kaik­ki n.y.k. jo­not pi­tuu­del­taan 1.
B si­säl­tää enin­tään kaik­ki n.y.k. jo­not.
B si­säl­tää enin­tään kaik­ki n.y.k. epä­tyh­jät jo­not.
B si­säl­tää enin­tään kaik­ki n.y.k. jo­not pi­tuu­del­taan 1.
tai

Ol­koon C ::= A | ε. (Muis­tat­han, et­tä ma­te­ma­tii­kas­sa tyh­jä merk­ki­jo­no esi­te­tään sym­bo­lil­la ε.) Mit­kä seu­raa­vis­ta si­säl­tä­vät kaik­ki n.y.k. jo­not?
X ::= A | XA
X ::= A | XC
X ::= C | XA
X ::= C | XC
tai


Al­la on ku­vaus merk­ki­jo­no­jen ja kie­li­op­pien kir­joit­ta­mi­ses­ta Math­Checkil­le. Se ei ole sii­nä sik­si, et­tä opis­ke­li­sit sen ul­koa, vaan sik­si, et­tä kun jäl­jem­pä­nä tar­vit­set yk­si­tyis­koh­tia, voit kat­soa ne sii­tä. Se on myös esi­merk­ki sii­tä, min­kä­lai­sia asioi­ta voi tul­la vas­taan, kun laa­di­taan tark­ka, eri nä­kö­koh­tia huo­mioon ot­ta­va spe­si­fi­kaa­tio näen­näi­ses­ti yk­sin­ker­tai­sel­le asial­le.

Merk­ki­jo­no voi­daan kir­joit­taa Math­Checkil­le muu­ta­mal­la eri ta­val­la:

Kie­li­op­pi esi­te­tään Math­Checkil­le nol­lal­la tai useam­mal­la vä­li­sym­bo­lin mää­ri­tel­mäl­lä, joi­den pe­räs­sä voi ol­la al­ku­sym­bo­lin ase­tus.

Ma­te­maat­ti­ses­sa kir­jal­li­suu­des­sa on ta­pa­na esit­tää ku­kin vä­li­sym­bo­lin mää­ri­tel­mä omal­la ri­vil­lään tai useal­la ri­vil­lä, jois­ta muut kuin en­sim­mäi­nen on si­sen­net­ty. Math­Checkis­sä voi teh­dä niin­kin, mut­ta ol­lak­seen se­kä it­sen­sä et­tä mo­nien oh­jel­moin­ti- yms. kiel­ten kans­sa joh­don­mu­kai­nen, Math­Check sal­lii käyt­tää vä­li­lyön­te­jä ja ri­vin­siir­to­ja va­paas­ti kun­han teks­ti­al­kiot ei­vät me­ne se­kai­sin. Esi­mer­kik­si A::=aB B ::=""|bB toi­mii mut­ta A::=aBB ::=""|bB ei toi­mi, kos­ka toi­nen B ei tu­le tul­ki­tuk­si kie­len B mää­ri­tel­män aluk­si vaan osak­si kie­len A mää­ri­tel­män vii­meis­tä vaih­to­eh­toa.

Kie­li­opin lo­pus­sa on ai­na ;, jot­ta Math­Check ei tul­kit­si­si seu­raa­van ko­men­non al­kua osak­si kie­li­op­pia. Si­nun ei kui­ten­kaan tar­vit­se vä­lit­tää täs­tä, kos­ka opet­ta­ja on kir­joit­ta­nut sen puo­les­ta­si.


Har­joi­tel­laan hie­man tie­don esiin kai­va­mis­ta spe­si­fi­kaa­tios­ta. Mää­rit­te­le kie­li O, jo­hon ei kuu­lu yh­tään merk­ki­jo­noa. Sen voi teh­dä ai­na­kin kah­del­la eri ta­val­la.
tai

Mi­ten Math­Checkin merk­ki­jo­noon saa ri­vin­siir­ron? Vas­tausEi mi­ten­kään. Oli­si sii­hen­kin voi­tu kei­no ke­hit­tää, mut­ta se tus­kin oli­si tuot­ta­nut yh­tä pal­jon pe­da­go­gis­ta hyö­tyä kuin se oli­si tuot­ta­nut vai­vaa ja on­gel­mia. Oli­si mm. pi­tä­nyt kek­siä, mi­ten ri­vin­siir­to piir­re­tään jä­sen­nys­puun sol­muun. Math­Checkin saa jät­tä­mään merk­ki­jo­noon tar­jo­tut ri­vin­siir­rot huo­miot­ta, mut­ta ei saa ot­ta­maan nii­tä mu­kaan. Mi­ten Math­Checkil­le il­mais­taan ε? Vas­taus Tyh­jä merk­ki­jo­no il­mais­taan Math­Checkil­le jo­ko "" tai ''. Ma­te­ma­tii­kas­sa tyh­jää merk­ki­jo­noa mer­ki­tään sym­bo­lil­la ε, mut­ta Math­Checkia ei ole ope­tet­tu tul­kit­se­maan sym­bo­lia ε tyh­jäk­si merk­ki­jo­nok­si. Jos Math­Checkin syöt­tees­sä on ε, niin Math­Check tul­kit­see sen UTF-8-koo­dauk­sen mu­kai­ses­ti kah­den mer­kin mit­tai­sek­si merk­ki­jo­nok­si.

Sa­ma kie­li voi­daan ai­na tuot­taa mo­nel­la eri kie­li­opil­la. Al­la on muu­ta­ma kie­li­op­pi, jot­ka kaik­ki tuot­ta­vat kie­len {ε, a, aa, aaa, …}. Ko­kei­le val­miik­si an­ne­tul­la ja muu­ta­mal­la muul­la merk­ki­jo­nol­la, min­kä­lai­nen jä­sen­nys­puu tu­lee.

A ::= ε | Aa
A ::= ε | aA
A ::= ε | a | aAa
A ::= ε | a | Aaa
A ::= BC   B ::= ε | a | aa   C ::= ε | aaCa
tai

aaaaaa tuo­tet­tu­na osis­ta aa, aa ja aa aaaaaa tuo­tet­tu­na osis­ta aaa ja aaa Kie­li­op­pi on mo­ni­se­lit­tei­nen, jos ja vain jos jol­la­kin merk­ki­jo­nol­la on kak­si eri jä­sen­nys­puu­ta. Mi­kään lä­hel­lä yl­lä ole­vis­ta kie­li­opeis­ta ei ole mo­ni­se­lit­tei­nen. Esi­mer­kik­si A ::= ε | aaaA | aaA on mo­ni­se­lit­tei­nen, kos­ka se tuot­taa merk­ki­jo­non aaaaaa mo­lem­pien ku­vien mu­kai­ses­ti.

Usein py­ri­tään vält­tä­mään mo­ni­se­lit­tei­syyt­tä. Sen vält­tä­mi­nen on kui­ten­kin jos­kus vai­keaa tai jo­pa mah­do­ton­ta.

Suun­nit­te­le seu­raa­vat kie­li­opit. Aak­kos­to­na on {0, 1}, ja al­ku­sym­bo­lit on an­net­tu val­miik­si. Voit mää­ri­tel­lä va­paas­ti li­sää vä­li­sym­bo­lei­ta.

Ne jo­not, jois­sa ei ole mis­sään koh­das­sa yk­kö­sen pe­räs­sä nol­la.
Kiel­lä mo­ni­se­lit­tei­syys
tai

Ne jo­not, jois­sa on ai­na­kin yk­si yk­kö­nen ei­kä ole mis­sään koh­das­sa yk­kö­sen pe­räs­sä nol­la.
Kiel­lä mo­ni­se­lit­tei­syys
tai

Ne jo­not, jois­sa on ai­na­kin yk­si 0 ja ai­na­kin yk­si 1.
Kiel­lä mo­ni­se­lit­tei­syys
tai

Kir­joi­ta kie­li­op­pi kie­lel­le, jos­sa on kaik­ki kir­jai­mes­ta c koos­tu­vat jo­not, joi­den pi­tuus ei ole kol­mel­la jaol­li­nen, ja vain ne.
tai

Kir­joi­ta kie­li­op­pi Math­Checkin merk­ki­jo­noil­le olet­taen, et­tä vä­li­lyön­ti, " ja ' edus­ta­vat it­seään, ja m edus­taa mi­tä ta­han­sa muu­ta merk­kiä jo­ka voi tul­la ky­see­seen. Jot­ta teh­tä­vä ei oli­si liian vai­kea, jä­tä huo­miot­ta teks­ti­al­kioi­den vä­li­nen tyh­jä ti­la.
tai

Kir­joi­ta kie­li­op­pi Math­Checkin kie­li­opeil­le olet­taen, et­tä v edus­taa mi­tä ta­han­sa vä­li­sym­bo­lia (eli isoa kir­jain­ta) ja m edus­taa mi­tä ta­han­sa ky­see­seen tu­le­vaa merk­ki­jo­noa (myös nii­tä, jois­sa käy­te­tään vä­li­sym­bo­lei­ta). Jot­ta teh­tä­vä ei oli­si liian vai­kea, esi­tä teks­ti­al­kioi­den vä­li­nen tyh­jä ti­la ai­na täs­mäl­leen yh­del­lä vä­li­lyön­nil­lä, älä­kä edes yri­tä esit­tää si­tä, et­tä sa­maa vä­li­sym­bo­lia ei saa mää­ri­tel­lä kah­des­ti.
tai

Munk­ki­rin­ki­löi­tä myy­dään nel­jän ja seit­se­män kap­pa­leen pak­kauk­sis­sa. Kir­joi­ta kie­li­op­pi kie­lel­le, jos­sa on täs­mäl­leen ne kir­jai­mes­ta m koos­tu­vat jo­not, joil­le on mah­dol­lis­ta os­taa jo­non pi­tuu­den il­mai­se­ma mää­rä munk­ki­rin­ki­löi­tä.
tai

Mi­ten voit täs­sä lä­hel­lä ole­via työ­ka­lu­ja käyt­täen hel­pos­ti sel­vit­tää, voi­daan­ko os­taa 18 munk­ki­rin­ki­lää ja jos kyl­lä niin mi­ten voi­daan? Vas­tausKo­pioi­mal­la yl­lä ole­va kie­li­op­pi oi­keal­le alas isoon laa­tik­koon, kir­joit­ta­mal­la 18 m-kir­jain­ta pie­neen laa­tik­koon ja pai­na­mal­la vas­taus­nap­pia.

Teh­tä­vä­si on sel­vit­tää suu­rin mää­rä munk­ki­rin­ki­löi­tä, jo­ta ei voi muo­dos­taa os­ta­mal­la so­pi­va yh­dis­tel­mä pak­kauk­sia. Käy­tet­tä­vis­sä­si on kak­si laa­tik­koa, joi­hin kum­paan­kin voit kir­joit­taa kie­li­opin. Kun pai­nat nap­pia, Math­Check ver­taa kie­li­op­pien tuot­ta­mat kie­let (sil­lä ra­joi­tuk­sel­la, et­tä Math­Check ei sel­viä ko­vin mo­ni­mut­kai­sis­ta ta­pauk­sis­ta). Vih­jeKo­pioi edel­li­sen teh­tä­vän kie­li­op­pi mo­lem­piin ruu­tui­hin. Li­sää alem­paan kie­li­op­piin vaih­to­eh­to, jol­la voi os­taa kol­me munk­ki­rin­ki­lää ja su­per­pak­kauk­sen. Laa­di su­per­pak­kauk­sen kie­li­op­pi si­ten, et­tä su­per­pak­kauk­sen ko­ko voi ol­la mi­kä ta­han­sa nol­laa suu­rem­pi mää­rä munk­ki­rin­ki­löi­tä. Vih­je Kun pai­nat nap­pia, Math­Check ker­too, et­tä su­per­pak­kauk­sen avul­la voi os­taa vii­si munk­ki­rin­ki­lää mut­ta il­man si­tä ei voi. Kun kas­va­tat su­per­pak­kauk­sen kans­sa os­tet­ta­vien munk­ki­rin­ki­löi­den mää­rän kol­mes­ta vii­teen, Math­Check ker­too seu­raa­van koon, jon­ka voi os­taa su­per­pak­kauk­sen avul­la mut­ta ei il­man si­tä.


tai

Mi­kä on suu­rin mää­rä munk­ki­rin­ki­löi­tä, jo­ta ei voi muo­dos­taa?
tai

Suun­nit­te­le seu­raa­vat kie­li­opit. Aak­kos­to­na on {a, b}, ja al­ku­sym­bo­lit on an­net­tu val­miik­si. Kun mo­ni­se­lit­tei­syys kiel­le­tään, teh­tä­vät ei­vät muu­tu mah­dot­to­mik­si, mut­ta mel­ko vai­keik­si kyl­lä­kin. Ihan hy­vä, jos saat nä­mä rat­kais­tua mo­ni­se­lit­tei­ses­ti­kin, mut­ta jos kai­paat kun­non haas­tet­ta, niin kiel­lä mo­ni­se­lit­tei­syys.

Ne merk­ki­jo­not, jois­sa on sa­ma mää­rä a:ta kuin b:tä. Vih­jeMää­rän saat sa­mak­si käyt­tä­mäl­lä vain vaih­to­eh­to­ja, jois­sa a esiin­tyy yh­tä mon­ta ker­taa kuin b. Ra­ken­na vas­taus­ta vä­hi­tel­len ja an­na Math­Checkin ker­toa mi­tä vie­lä puut­tuu. Jos py­rit yk­si­se­lit­tei­syy­teen, niin kan­nat­taa mää­ri­tel­lä kie­li, jos­sa on täs­mäl­leen ne merk­ki­jo­not, jois­sa va­sem­mal­ta luet­taes­sa b:n mää­rä ei mis­sään koh­das­sa yli­tä a:n mää­rää ja on lo­puk­si sa­ma.
Kiel­lä mo­ni­se­lit­tei­syys
tai

Ne merk­ki­jo­not, jois­sa on vä­hem­män a:ta kuin b:tä. Vih­jeJos­sa­kin koh­das­sa on yli­mää­räi­nen b. Si­tä en­nen on sa­ma mää­rä a:ta kuin b:tä. Sen jäl­keen­kin saat­taa ol­la jo­ta­kin.
Kiel­lä mo­ni­se­lit­tei­syys
tai

Ne merk­ki­jo­not, jois­sa on eri mää­rä a:ta kuin b:tä. Vih­jeOn eri mää­rä jos ja vain jos on vä­hem­män tai enem­män.
Kiel­lä mo­ni­se­lit­tei­syys
tai

Lo­puk­si muu­ta­ma asia, jois­sa ai­kai­sem­pien tent­ti­vas­taus­ten pe­rus­teel­la on ol­lut vää­rin­kä­si­tyk­siä.

Jo­kai­nen seu­raa­vis­ta kie­li­opeis­ta tuot­taa tyh­jän kie­len, kos­ka mis­tään niis­tä ei voi joh­taa merk­ki­jo­noa, jos­sa ei ole vä­li­sym­bo­lei­ta, kos­ka jo­kai­ses­sa vaih­to­eh­dos­sa on ai­na­kin yk­si vä­li­sym­bo­li.

Kie­li on (ää­rel­li­nen tai ää­re­tön) jouk­ko merk­ki­jo­no­ja, jois­ta jo­kai­nen on ää­rel­li­nen. Kie­li­op­pi A ::= ε | aA ei tuo­ta ää­re­tön­tä merk­ki­jo­noa aaa… ei­kä jouk­koa {aaa…}. Se tuot­taa ää­ret­tö­män mon­ta eri­lais­ta merk­ki­jo­noa, ni­mit­täin merk­ki­jo­not ε, a, aa, aaa ja niin edel­leen, eli se tuot­taa jou­kon {ε, a, aa, aaa, …} eli {a0, a1, a2, a3, …}. Se ei tuo­ta merk­ki­jo­noa an, mis­sä n on luon­nol­li­nen lu­ku. Se tuot­taa jou­kon {an | n ∈ ℕ}. Kie­li­op­pi A ::= aAb ei tuo­ta merk­ki­jo­noa aaabbb, sil­lä A ::= aAb ei tuo­ta si­tä ei­kä se edes ole merk­ki­jo­no.

Kie­li ei ole kaik­kien merk­ki­jo­no­jen jouk­ko ei­kä edes kaik­kien aak­kos­tos­ta muo­dos­tet­ta­vien merk­ki­jo­no­jen jouk­ko. Kie­li on jouk­ko aak­kos­tos­ta muo­dos­tet­ta­via merk­ki­jo­no­ja eli kaik­kien aak­kos­tos­ta muo­dos­tet­ta­vien merk­ki­jo­no­jen jou­kon osa­jouk­ko.

Ää­rel­li­nen kie­li on kie­li, jos­sa on vain ää­rel­li­nen mää­rä merk­ki­jo­no­ja. Esi­mer­kik­si A ::= aa | aaa mää­rit­te­lee ää­rel­li­sen kie­len, mut­ta A ::= aa | aaaA mää­rit­te­lee ää­ret­tö­män kie­len. Vaik­ka kie­li oli­si ää­re­tön, jo­kai­nen sii­hen kuu­lu­va merk­ki­jo­no on ää­rel­li­nen.

Kaik­ki kie­let
Jol­lain ta­val­la mää­ri­tel­tä­vis­sä ole­vat kie­let
BNF:llä mää­ri­tel­tä­vis­sä ole­vat kie­let
Ää­rel­li­set kie­let

Hup­sis­ta, yl­lä ole­va ku­va ei ole mit­ta­kaa­vas­sa. Jot­kin jou­kot on piir­ret­ty liian isoik­si toi­siin näh­den. Piir­re­tään se uu­des­taan mit­ta­kaa­vaan, jot­ta jouk­ko­jen ko­ko­erot nä­kyi­si­vät oi­kein.

Kaik­ki kie­let

Piir­täi­sin mie­lel­lä­ni myös mit­ta­kaa­vas­sa ole­van ku­van, jos­ta kaik­kien kiel­ten jouk­ko puut­tuu mut­ta muut kol­me ovat mu­ka­na. Va­li­tet­ta­vas­ti en osaa, sil­lä vaik­ka nii­den vä­lil­lä val­lit­se­vat ai­dot osa­jouk­ko­suh­teet ovat ku­ten en­sim­mäi­nen ku­va näyt­tää, ne ovat kes­ke­nään yh­tä­suu­ria. Ää­re­tön jouk­ko to­del­la­kin voi ol­la yh­tä­suu­ri kuin ai­to osa­jouk­kon­sa.

Syy näi­hin on il­miöis­sä, joi­ta tu­tki­taan teh­tä­väs­sä Ra­tio­naa­li­lu­ku­jen jouk­ko on nol­la­mi­tal­li­nen.