582206 Laskennan mallit (syksy 2008) 2. kurssikoe 11.12., ratkaisuja Tehtävän 1 tarkasti Harri Forsgren, tehtävän 2 Joel Kaasinen ja tehtävän 3 Jyrki Kivinen. Palautetilaisuuden 19.12. jälkeen arvosteluun voi tutustua ottamalla yhteyttä Jyrki Kiviseen sähköpostitse. 1. [2+2+4 pistettä] (a) Yhteydetön kielioppi, joka tuottaa aakkoston { a,b,c} merkkijonot, jotka päättyvät abc : S Xabc X ax bx cx ε. (b) Yhteydetön kielioppi, joka tuottaa kielen { 0 m 1 n 0 m m,n N }: S 0S0 A A 1A ε. (c) Yksiselitteinen yhteydetön kielioppi, joka tuottaa joukoista A, B ja C yhdisteitä ja leikkauksia muodostamalla saadut joukko-opilliset lausekkeet: S L L S L L P P P A B C (S) Arvostelu: (a) Täydellinen vastaus 2 p, helposti korjattava virhe 1 p (b) Täydellinen vastaus 2 p, helposti korjattava virhe 1 p. Tyypillisiä virheitä: n 1; jos n > 0, niin m > 0; kieli onkin { 0 m 1 n 0 k }. (c) Oikea kielioppi: 3 p. Kieli ei kata kaikkia joukko-opillisia lausekkeita: 1 tai 2p, esim. A (B C) mutta ei (A B) C. Uloimpien sulkujen puutteesta ei yksinään sakotettu. (Lähes) oikea kielioppi on yksiselitteinen: +1 p Pahoja ongelmia esim. sulkujen kanssa: 0 tai 1 p Tyypillisiä virheitä: kielioppi ei ole yksiselitteinen; sallitaan vain jonkinlaisessa normaalimuodossa olevat lausekkeet; rajoitteita sulkujen käytössä.
2. [4+4 pistettä] (a) Kieliopista S XS X X axb ε saadaan seuraava pinoautomaatti: ε,ε $ ε,x b ε,ε S ε,ε X ε,x ε a,a ε b,b ε c,c ε ε,ε a ε,s S ε,$ ε ε,ε X Merkkijonon aabbab eräs johto: S XS axbs aaxbbs aabbs aabbx aabbaxb aabbab. Pinoautomaatin hyväksyvä laskenta syötteellä aabbab: syöte jäljellä pinon sisältö aabbab aabbab $ aabbab S$ aabbab XS$ aabbab axbs$ abbab XbS$ abbab axbbs$ bbab XbbS$ bbab bbs$ bab bs$ ab S$ ab X$ ab axb$ b Xb$ b b$ $ 2
(b) On annettu Chomskyn normaalimuodossa oleva yhteydetön kielioppi G. Seuraava algoritmi ratkaisee, tuottaako se jonkin merkkijonon, jossa on merkki a : Etsitään ensin kieliopista kaikki tuottamattomat muuttujat (ks. harjoitus 8, tehtävä 5): tuottavat for kaikilla muuttujilla A do if kieliopissa on sääntö A c jollain c Σ then tuottavat tuottavat A if tuottavat = then return FALSE while muuttui do muuttui FALSE for kaikilla kieliopin säännöillä A BC do if A tuottavat and B tuottavat and C tuottavat then tuottavat tuottavat { A } Poista kieliopista kaikki säännöt, joissa esiintyy muita kuin joukkoon tuottavat kuuluvia muuttujia. Tämän jälkeen varsinainen tehtävä ratkeaa seuraavalla proceduurilla: TUOTTAA-MERKIN-A(G) a_tuottavat for kaikilla muuttujilla A do if kieliopissa on sääntö A a then a_tuottavat a_tuottavat A if a_tuottavat = then return FALSE while muuttui do muuttui FALSE for kaikilla kieliopin säännöillä A BC do if A a_tuottavat and (B a_tuottavat or C a_tuottavat) then a_tuottavat a_tuottavat { A } return S a_tuottavat Arvostelu: Kohdassa (a) merkkijonon johto 1 p, automaatin muodostaminen 2 p ja simulointi 1 p. Jos automaatti tunnistaa oikean kielen, mutta sitä ei ole muodostettu annetulla menetelmällä kieliopin pohjalta, automaatista ja simuloinnista yhteensä on saanut 1 pisteen. Kohdassa (b) jonkinlainen yritys sääntöjoukon läpikäymiseksi antoi 1 pisteen. Jos algoritmi ei käsittele oikein saavuttamattomia muuttujia tai ei aina pysähdy, pisteitä on voinut saada 2. Yleisin virhe oli tuottamattomien muuttujien jättäminen ottamatta huomioon; jos ratkaisu tällöin oli muuten oikein, siitä on saanut 3 pistettä. 3
3. [4+4 pistettä] (a) Tarkastellaan ongelmaa Syöte: Turingin kone M, koneen M tila q, merkkijono w Tuloste: kyllä jos M syötteellä w menee tilaan q; muuten ei. Muotoillaan ongelma formaalina kielenä: VISIT = { M,q,w Turingin kone M syötteellä w menee tilaan q }. Väite: Kieli VISIT ei ole ratkeava. Todistus: Tehdään vastaoletus, että ongelma VISIT on ratkeava. Turingin koneen pysähtymisongelma HALT TM voidaan nyt tunnistaa seuraavasti: i. Etsi syötteestä M,w koodit koneen M hyväksyvälle tilalle q accept ja hylkäävälle tilalle q reject. ii. Jos M,q accept,w VISIT, niin hyväksy. iii. Jos M,q reject,w VISIT, niin hyväksy. iv. Hylkää. Oletuksen mukaan ehtotestit riveillä (ii) ja (iii) osataan ratkaista. Algoritmi siis ei millään syötteellä jää silmukkaan. Siis pysähtymisongelma on ratkeava; ristiriita. Täsmällisesti ottaen olemme siis todistaneet, että Turingin koneen tilassakäyntiongelmaa ei voi ratkaista Turingin koneella. Tällöin sitä ei voi ratkaista missään muussakaan Turing-ekvivalentissa laskennan mallissa, kuten RAM-koneilla, tai Churchin-Turingin teesiin nojaten millään muullakaan realistisella laskentalaitteella kuten erityisesti oikealla tietokoneella tai yleiskäyttöisellä ohjelmointikielellä (esim. Java). Mallien ekvivalenssin perusteella tästä voisi kenties edelleen tehdä sen johtopäätöksen, että tilassakäyntiongelman vastine oikeille tietokoneille ei ole ratkaeava oikeilla tietokoneilla. Tässä on se pieni aukko, että ei ole täysin selvää, mikä on tilassakäyntiongelman vastine esim. Java-ohjelmassa. Luonteva vaihtoehto olisi samastaa ohjelman rivit ja Turingin koneen tilat. Hieman arvellen voimme siis tulkita, että Java-kielellä ei voi ratkaista ongelmaa, suorittaako annettu ohjelma annetulla syötteellä jonkin tietyn ohjelmarivin. Itse asiassa tämä mahdottomuustulos voidaan todistaa hieman täsmällisemmin jäljittelemällä edellä esitettyä Turingin koneiden todistusta (ks. harjoitus 12, tehtävä 5). (b) Valitaan esimerkiksi seuraavat kaksi ongelmaa ylimääräisistä harjoitustehtävistä: Kauppamatkustajan ongelma: Syöte: suuntaamaton painotettu verkko G, luonnollinen luku k Tuloste: kyllä jos verkossa G on polku, jonka kustannus on korkeintaan k ja joka vierailee jokaisessa solmussa tasan kerran ja palaa lähtösolmuunsa; muuten ei Joukkopeiteongelma: Syöte: perusjoukko X; kokoelma A 1,...,A n perusjoukon osajoukkoja A i X; luonnollinen luku k Tuloste: kyllä jos voidaan valita I {1,...,n}, jolla I k ja i I A i = X; muuten ei. Muita kurssilla esiintyneitä NP-täydellisiä ongelmia ovat klikkiongelma, propositiologiikan toteutuvuusongelma (SAT), Hamiltonin polku -ongelma ja repunpakkausongelma. (Ks. myös http://xkcd.com/287/; kiitos tämän viitteen osoittamisesta!) Käytännössä jos ongelma on NP-täydellinen, sille ei kannata etsiä aina polynomisessa ajassa toimivaa algoritmia, koska sellaisen löytäminen olisi tasan yhtä vaikeaa kuin todistaa P = NP. Sen sijaan ongelmalle on olemassa eksponentiaalisessa ajassa toimivia algoritmeja, jotka kenties ovat vielä käyttökelpoisia käsillä olevan sovelluksen kannalta relevanteilla syötteen ko oilla. Laajemmin 4
NP-täydellisten ongelmien algoritmit eivät kuulu kurssin alueeseen, mutta yleisesti niille käytetään esim. approksimointialgoritmeja (jotka tuottavat ei-optimaalisia ratkaisuja kuitenkin taaten, että virhe ei ole kovin suuri) ja erilaisia heuristiikkoja (jotka yleensä ovat suhteellisen nopeita, mutta eivät anna takeita tuloksen laadulle); heuristiikat voivat myös käyttää satunnaisuutta hyväkseen. Arvostelu: Kohdassa (a) todistuksesta on saanut 2 pistettä; esityksen ei ole tarvinnut olla erityisen yksityiskohtainen tai formaali, kunhan peruslogiikka on oikein. Tyypillinen virhe on ollut osoittaa, että kyseisen ongelman ratkeavuus seuraisi pysähtymisongelman ratkeavuudesta; epäsuoraa todistusta varten tämä on väärä suunta. Tällaisesta ratkaisusta on kuitenkin saanut yhden pisteen (jos se muuten osoittaa asian hallintaa), samoin ratkaisuista, joissa on vedottu simulaation voivan jäädä silmukkaan (mikä ei osoita, ettei ongelmaa voisi kenties ratkaista jollain muulla tavalla kuin simuloimalla). Käytännön johtopäätöksiin ei ole mitään yksiselitteistä oikeaa vastausta. Kaksi pistettä on saanut selityksestä, jossa on esitetty perusteluina kurssiin kuuluvia asioita (Churchin-Turingin teesi, tietokoneiden ja Turingin koneiden ekvivalenssi tms.) tai joissa muuten johtopäätökset on esitetty hyvin. Kohdan (b) arvostelussa on otettu huomioon, että NP-täydellisyyden osaaminen teknisellä tasolla ei kuulu kurssin tavoitteisiin. Oleellista on, minkä tyyppiset tehtävät ovat NP-täydellisiä (2 pistettä), että niille ei tunneta tehokkaita algoritmeja (1 p) mutta jotain kuitenkin voidaan tehdä (1 p). Vaikka teknisistä yksityiskohdista ei kohdassa (b) olekaan kovin herkästi sakotettu, seuraavat asiat olisi hyvä panna merkille: Näennäisesti pienet muutokset ongelmassa voivat muuttaa sen NP-täydellisestä helposti polynomisessa ajassa ratkeavaksi. Esim. jos repunpakkausongelmassa kaikki painot tai kaikki arvot ovat samoja, ongelma ratkeaa helposti järjestämällä esineet sopivasti. Monet polunetsimisongelmat ratkeavat polynomisessa ajassa (ks. Tietorakenteet); erityisesti Hamiltonin kehää muistuttava Eulerin kehä ( Königsbergin sillat ) on löydettävissä polynomisessa ajassa. Määritelmän mukaan NP-täydelliset ongelmat ovat kaikki päätösongelmia (kyllä/ei). Tässä tosin näkee epätäsmällistä kielenkäyttöä varsin yleisesti. 5