ICS-C2000 Tietojenkäsittelyteori Kevät 2016 Kierros 2, 18. 22. tmmikuut Demonstrtiotehtävien rtkisut D1: Formuloi luennoll (monisteen s. 17) esitetty yksinkertinen khviutomtti täsmällisesti äärellisen utomtin trkn määritelmän (määritelmä 2.1) mukiseksi. Mikä on utomtin tunnistm kieli? Rtkisu: Tehtävässä piti nt formli esitys llolevlle tilkoneelle: 0.30 0.40 10c 10c 10c 10c 0.00 0.10 0.20 10c, Deterministinen tilkone (äärellinen utomtti) M on monikko: M = (Q,Σ,δ,q 0,F), >0.40 10c, missä Q on äärellinen tilojen joukko, Σ äärellinen kkosto, δ siirtofunktio δ : Q Σ Q, q 0 K lkutil j F Q hyväksyvien lopputilojen joukko. Tehtävän koneess monikon ost on määritelty seurvsti 1 : Q = {0.00,0.10,0.20,0.30,0.40,>0.40 Σ = {10c, q 0 = {0.00 F = {0.40,>0.40 Tilnsiirtofunktio δ on selvintä esittää tulukkon: q δ(q, 10c) δ(q, ) 0.00 0.10 0.20 0.10 0.20 0.30 0.20 0.30 0.50 0.30 0.40 >0.40 0.40 >0.40 >0.40 >0.40 >0.40 >0.40 1 Selvyyen vuoksi on tilojen nimissä olevt esimlipilkut vihettu pisteiksi. 1
Tilkoneen konfigurtio c Q Σ muoostuu koneen tilst j syötteestä. Kone lukee syötettä merkki kerrlln j siirtyy in siirtofunktion mukisesti uuteen tiln. Mikäli snn loppuess pääytään lopputiln, sn hyväksytään. Muuss tpuksess sn hylätään. Tilkoneen M hyväksymä kieli (M) on kikkien hyväksyttyjen snojen joukko. Tehtävän koneelle tämä on: (M) = {x 1 x 2 x n x i Σ kikill 1 i n j n i=1 x i 40c Kone siis hyväksyy kikki jonot, joiss syötettyjen kolikoien summ on 40 c ti enemmän. Trkstelln koneen toimint muutmll syötteellä: w = 0.10c 0.10c 0.: (0.00,0.10c 0.10c 0.) M (0.10,0.10c 0.) M (0.20,0.) M (0.40,ε) Kosk 0.40 F, sn hyväksytään. Tässä merkintä M trkoitt sitä, että kone M suoritt yhen skeleen. w = 0. 0.10c: Kosk 0.30 / F, sn hylätään. w = 0. 0. 0.: (0.00,0. 0.10c) M (0.20,0.10c ) M (0.30,ε) (0.00,0. 0. 0.) M (>0.40,ε) Sn hyväksytään. Merkintä M trkoitt, että kone M suoritt noll ti usempi skeli. D2: Li äärelliset utomtit seurvien kielten tunnistmiseen: () { m n m = n mo 3 () {w {, w sisältää yhtä mont :t j :tä, moulo 3 (Merkintä m = n mo 3 trkoitt, että luvut m j n ntvt kolmell jettess smn jkojäännöksen.) Rtkisu: ) Kielen L = { m n m = n mo 3 tunnist seurv äärellinen utomtti: M = (Q,Σ,δ,q 0,F) Q = {q 0,q 1,q 2,q 3,q 4,q 5,q 6 Σ = {, F = {q 0,q 5 Tilnsiirtofunktio δ määritellään seurvsti: 2
q δ(q, ) δ(q, ) q 0 q 1 q 3 q 1 q 2 q 5 q 2 q 0 q 4 q 3 q 6 q 4 q 4 q 6 q 5 q 5 q 6 q 3 q 6 q 6 q 6 Tässä til q 6 käytetään hylkäystiln, johon siirrytään heti, kun on vrm että sn ei voi enää kuulu kieleen (kun snst löytyy lijono ), j joss pysytään in lskennn loppuun sti. Tälliset tilt jätetään usein merkitsemättä, kun tilkone esitetään konekvion. Näin on tehty myös ll olevn kvion tpuksess: q 3 q 4 q 5 q 0 q 1 q 2 Intuitio utomtille: lrivin tilt lskevt -merkkien lukumäärää moulo 3 j ensimmäisen -merkin tulless vstn utomtti siirtyy yläriville oiken kohtn lskemn -merkkien lukumäärää moulo 3. Esimerkiksi tilst q 2 ( olln nähty k 3 + 2 -kirjint jollekin k ) siirrytään -merkillä ylärivin tiln q 4 ( olln nähty l 3 + 1 -kirjint jollekin l ). ) Kielen L = {w {, w sisältää yhtä mont - j -kirjint moulo 3 tunnist seurv tilkone: q 2 q q 1 0 D3: Li äärellinen utomtti, jok tunnist yhteen- j vähennyslskumerkein toisistn erotettujen kokonislukujen jonoj (esim. 11+20-9, -5+8). Toteut utomttisi tietokoneohjelmn, jok myös lskee lukujonon rvon. Rtkisu: 3
Kokonislukujen yhteen- j vähennyslskut voin tunnist seurvll utomtill: q 0 q 1 q 2 Tässä on lyhennysmerkintä, jok trkoitt mitä thns numero joukost {0,...,9. Automtti voin toteutt vrsin suorviivisesti millä thns proseurlisell ohjelmointikielellä lisäämällä siihen summn lskent j virheellisen syötteen käsittely. All on esitetty C-kielinen toteutus: #inclue <stio.h> #inclue <ctype.h> int min (voi) { int q = 0; /* The current stte */ int c; /* The current input chrcter */ int sgn = 1, vl = 0, sum = 0; /* Some uxiliry vriles */ while ((c = getchr())!= '\n') { switch (q) { cse 0: if (c == '+') sgn = -1; else if (isigit(c)) { vl = c - '0'; rek; cse 1: if (c == '+') sgn = -sgn; else if (isigit(c)) { vl = c - '0'; rek; cse 2: if (isigit(c)) { vl = 10 * vl + (c - '0'); 4
else if (c == '+') { sum = sum + vl*sgn; vl = 0; sgn = 1; sum = sum + vl*sgn; vl = 0; sgn = -1; rek; cse 99: rek; sum = sum + sgn*vl; if (q == 2) printf("the vlue of the expression is %.\n", sum); else printf("the expression is not well-forme.\n"); return 0; 5