Turingmaskiner en kortfattet introduksjon. Christian F Heide



Like dokumenter
Turingmaskiner en kortfattet introduksjon. Christian F Heide

Matematikk for IT Eksamen. Løsningsforslag

INF oktober Dagens tema: Uavgjørbarhet. Neste uke: NP-kompletthet

INF2820 Datalingvistikk V2017 Forelesning 1.2 Jan Tore Lønning

Avgjørbarhet / Uavgjørbarhet

INF oktober Stein Krogdahl. Altså: Hva kan ikke gjøres raskt (med mindre P = NP)

MAT1030 Diskret Matematikk

Forelesning 29: Kompleksitetsteori

INF Algoritmer: Design og effektivitet

TMA4140 Diskret Matematikk Høst 2016

INF1820: Introduksjon til språk-og kommunikasjonsteknologi

INF1820: Introduksjon til språk-og kommunikasjonsteknologi

Forelesning 14. Rekursjon og induksjon. Dag Normann februar Oppsummering. Oppsummering. Beregnbare funksjoner

MAT1030 Diskret matematikk

IN2080. Oppgave 1. Oppgave 2. Eksamen. Vår Den nondeterministiske endelige automaten A er gitt ved (Q, Σ, δ, q 0, F ) der

Løsningsforslag. Oppgavesettet består av 9 oppgaver med i alt 20 deloppgaver. Ved sensur vil alle deloppgaver telle omtrent like mye.

Følger Sipsers bok tett både i stoff og oppgaver.

INF2220: Time 8 og 9 - Kompleksitet, beregnbarhet og kombinatorisk søk

Kompleksitetsteori reduksjoner

Kompleksitet og Beregnbarhet

Obligatorisk oppgave 2 i INF 4130, høsten 2009

INF Stein Krogdahl. NB: Det som under forelesningen ble kalt et vitne er nå omdøpt til et sertifikat.

TMA 4140 Diskret Matematikk, 1. forelesning

Emnenavn: Matematikk for IT. Eksamenstid: Faglærer: Christian F Heide

INF2820 Datalingvistikk V2016. Jan Tore Lønning

INF2820 Datalingvistikk V2016. Jan Tore Lønning

Notat om Peanos aksiomer for MAT1140

Eksamensoppgave i TMA4140 Diskret matematikk

MAT1030 Diskret matematikk

Aksiom 3.1 (Likhet av mengder). La A og B være mengder. Da er A og B like hvis og bare hvis de har akkurat de samme elementene.

LO118D Forelesning 3 (DM)

Eksamensoppgave i TMA4140 Diskret matematikk

MAT1030 Diskret matematikk

INF INF1820. Arne Skjærholt. Terza lezione INF1820. Arne Skjærholt. Terza lezione

Analyse av Algoritmer

Emnenavn: Matematikk for IT. Eksamenstid: Faglærer: Christian F Heide

INF2820 Datalingvistikk V2015. Jan Tore Lønning

UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

Løsningsforslag. Emnekode: Emne: Matematikk for IT ITF Eksamenstid: Dato: kl til kl desember Hjelpemidler: Faglærer:

Mengder, relasjoner og funksjoner

Forelesning 30: Kompleksitetsteori

MAT1030 Diskret Matematikk

INF2820 Datalingvistikk V2017 Forelesning 2, 23.1 Jan Tore Lønning

Eksamensoppgave i MA0301 Elementær diskret matematikk løsningsforslag

Representasjon av tall på datamaskin Kort innføring for MAT-INF1100L

Plenumsregning 12. Diverse oppgaver. Roger Antonsen mai Eksamen 12/6-06 Oppgave 2. Plan

INF2820 Datalingvistikk V2012. Jan Tore Lønning

Repetisjon. MAT1030 Diskret Matematikk. Oppsummering. Oppsummering. Forelesning 15: Rekursjon og induksjon. Roger Antonsen

OFFENTLIG-NØKKELKRYPTOGRAFI

MAT1030 Diskret Matematikk

LØSNINGSFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet. Oppgave 1 Mengdelære (10 poeng)

Repetisjon og mer motivasjon. MAT1030 Diskret matematikk. Repetisjon og mer motivasjon

Løsningsforslag oblig. innlevering 1

IN2010: Forelesning 11. Kombinatorisk søking Beregnbarhet og kompleksitet

MAT1030 Forelesning 14

Kompleksitet. IN algoritmer og datastrukturer Plenumstime / repetisjon

Kapittel 6: Funksjoner

LØSNINGSFORSLAG EKSAMEN VÅR07, MA0301

Forelesning 30. Kompleksitetsteori. Dag Normann mai Informasjon. Oppsummering

KONTROLLSTRUKTURER. MAT1030 Diskret matematikk. Kontrollstrukturer. Kontrollstrukturer. Eksempel (Ubegrenset while-løkke)

Forelesning 2. Flere pseudokoder. Representasjoner av tall. Dag Normann januar 2008 KONTROLLSTRUKTURER. Kontrollstrukturer. Kontrollstrukturer

UNIVERSITETET I OSLO

MAT1030 Forelesning 19

Svarforslag til ukeoppgaver til INF 4130

Sekventkalkyle for utsagnslogikk

Forelesning 33. Repetisjon. Dag Normann mai Innledning. Kapittel 11

LØSNINGSFORSLAG, SIF 5015, DISKRET MATEMATIKK 12. august 2003 Oppgave 1. La oss begynne med å bygge en ikke-deterministisk maskin:

MAT1030 Diskret Matematikk

Kapittel 5: Relasjoner

Eksamen i Elementær Diskret Matematikk - (MA0301)

MAT1030 Diskret matematikk

Innledning. MAT1030 Diskret matematikk. Kapittel 11. Kapittel 11. Forelesning 33: Repetisjon

MAT1030 Forelesning 25

INF1080 Logiske metoder for informatikk. 1 Små oppgaver [70 poeng] 1.1 Grunnleggende mengdelære [3 poeng] 1.2 Utsagnslogikk [3 poeng]

Velkommen til MAT1030!

MAT1030 Diskret Matematikk

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Dag Normann

Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot. barn

MAT1030 Diskret matematikk

Diofantiske likninger Peer Andersen

MAT1030 Diskret matematikk

Lars Vidar Magnusson Kapittel 13 Rød-Svarte (Red-Black) trær Rotasjoner Insetting Sletting

LØSNINGSFORSLAG EKSAMEN MNF130 VÅREN 2010 OPPGAVE 1

MAT1030 Diskret Matematikk

Innføring i bevisteknikk

Repetisjon. 1 binærtall. INF3110 Programmeringsspråk. Sist så vi ulike notasjoner for syntaks: Jernbanediagrammer. BNF-grammatikker.

MAT1030 Forelesning 13

Forelesning 13. Funksjoner. Dag Normann februar Opphenting. Opphenting. Opphenting. Opphenting

MAT1030 Forelesning 11

Generell induksjon og rekursjon. MAT1030 Diskret matematikk. Generell induksjon og rekursjon. Generell induksjon og rekursjon.

Kapittel 6: Funksjoner

INF3110 Programmeringsspråk

MAT1030 Diskret Matematikk

Kapittel 5: Mengdelære

Om oppgaveteksten på noe punkt er uklar eller upresis, kan du gjøre egne presiseringer. Formulér i så fall disse tydelig i oppgavebesvarelsen din.

Oppgave: BOW Bowling. Regler for Bowling. norwegian. BOI 2015, dag 1. Tilgjengelig minne: 256 MB

UNIVERSITETET I OSLO

Hjemmeeksamen 1 i INF3110/4110

Transkript:

13. november 2014 Turingmaskiner en kortfattet introduksjon Christian F Heide En turingmaskin er ikke en fysisk datamaskin, men et konsept eller en tankekonstruksjon laget for å kunne resonnere omkring bl.a. beregnbarhet. Det var det brilliante matematikeren Alan Turing (1912 1954) som introduserte dette konseptet i sin artikkel On Computable Numbers i 1936 [1, 2]. En turingmaskin består av 1. En tape (f. eks. en papirstrimmel eller en magnetisk tape), uendelig lang i begge retninger, som er inndelt i celler, hvor hver celle inneholder et symbol. 2. En styringsenhet som kan være i én av et endelig antall tilstander, med et skrive- /lesehode som kan lese et symbol fra og skrive et symbol til den cellen på tapen som styringsenheten peker på. Man tenker seg at tapen kan flytte seg en celle fram eller tilbake i forhold til styringsenheten og at lese-/skrivehodet deretter kan skrive ett symbol til og/eller lese ett symbol fra den nye cellen. Tilstanden til styringsenheten vil kunne endre seg og tapen vil kunne flytte seg til høyre eller venstre avhengig av hvilket symbol den leser fra tapen. Turingmaskinen skiller seg fra endelige automater ved at den har et uendelig minne (tapen). Det som viser seg noe overraskende er at en Turingmaskin i prinsippet kan gjøre alt en datamaskin kan, og er således en enkel men generell modell av en datamaskin [3]. En turingmaskin kan formelt defineres på følgende måte [3]: En turingmaskin T = (S, I, f, s0) består av en endelig mengde av tilstander, S, et alfabet, I, som inkluder det tomme symbolet, B, og en partiell funksjon, f, fra S I til S I {R, L} samt en starttilststand, s0. R og L angir henholdsvis right og left, altså om tapen skal beveges til høyre eller venstre. At f er en partiell funksjon, innebærer at den ikke er definert for alle elementer i S I. Men for de (tilstand, symbol)-par som den er definert for, er det assosiert et unikt (tilstand, symbol, retning)-trippel. Vi kaller de sammenhørende (tilstand, symbol)-par og (tilstand, symbol, retning)-tripler for turingmaskinens overgangsregler. La oss nå se hvordan en turingmaskin kan tenkes å operere.

En turingmaskin opererer trinnvis. I hvert trinn vil lesehodet lese symbolet, x, i cellen den peker på. Dersom styringsenheten er i tilstand s, og dersom funksjonen f er definert for paret (s, x) med f(s, x) = (s, x, d) vil følgende skje: - kontrollenheten går til sin nye tilstand s - lesehodet skriver symbolet x i cellen den peker på - tapen flyttes til høyre dersom d = R og til venstre dersom d = L Vi kan skrive dette trinnet som (s, x, s, x, d). Dersom f ikke er definert for paret (s, x) vil turingmaskinen stoppe. Man kan definere en turingmaskin ved å liste alle fem-tupler av formen (s, x, s, x, d). På den måten vil man også implisitt definere mengden av tilstander og inngangsalfabetet. Det er alltid definert en starttilstand for turingmaskinen, kalt s0. Videre antar man at lesehodet er posisjonert over den cellen som er lengst til venstre som ikke er blank. Vi kaller dette startposisjonen. Ulike typer turingmaskiner Det kan defineres mange ulike typer turingmaskiner. For eksempel kan vi definere en turingmaskin som i tillegg til å kunne flytte høyre og venstre, også kan bli stående på samme tape-posisjon. Vi kan tillate at en turingmaskin opererer på mer enn en tape om gangen, en såkalt multitape turingmaskin. Vi kan videre tillate at tapen er todimensjonal, slik at den kan flyttes opp og ned, i tillegg til høyre og venstre. Vi kan ha flere lesehoder som leser flere celler samtidig. Vi kan også tillate at en turingmaskin opererer såkalt ikke-deterministisk ved å tillate at et (tilstand, tape-symbol)-par kan opptre som de to første elementer i mer enn ett fem-tuppel. Vi kan også redusere turingmaskinens kapasitet, f. eks. ved at tapen er uendelig bare i en retning, eller vi kan begrense alfabetet til bare å omfatte to symboler. Poenget med å liste opp alle disse mulighetene er for å gjøre følgende poeng tydelig: uansett hvilke av disse variasjonene vi bruker, vil vi aldri bedre eller redusere maskinens regnekraft. Alt som kan gjøres med en av disse variantene av turingmaskinen, kan også gjøres av den originale turingmaskinen. I tillegg til å introdusere konseptet turingmaskin, viste også Turing at det er mulig å konstruere en turingmaskin som kan simulere beregningene til enhver annen turingmaskin. En slik maskin kalles en universell turingmaskin. 2

Church-Turing-tesen Turingmaskiner synes svært enkle. Allikevel viser det seg at de er ekstremt kraftige i den forstand at selv om det kan være vanskelig å lage en turingmaskin som kan utføre en bestemt algoritme, så er det alltid mulig å lage en slik turingmaskin. Church-Turing-tesen sier at dersom man har et problem (en oppgave) som kan løses med en algoritme, så vil det finnes en turingmaskin som kan løse dette problemet. Dette betyr at ethvert problem som kan løses av en datamaskin, også kan løses av en turingmaskin. Man kan også se det slik at en turingmaskin angir den teoretiske grensen for hva en datamaskin kan gjøre. Kompleksitet, beregnbarhet og avgjørbarhet Turingmaskiner kan benyttes som et presist mål for å angi en algoritmes kompleksitet. Fra Church-Turing-tesen som vi presenterte ovenfor, vet vi at dersom et problem kan løses ved hjelp av en effektiv algoritme, så finnes det en turingmaskin som kan løse problemet. Når en turingmaskin brukes til å løse et problem, vil inputen til problemet være kodet som en streng av symboler som skrives til turingmaskinens tape. Kodingen av inputen vil kunne være forskjellig. For eksempel kan vi kode et positivt heltall som en streng av 1-ere. Vi kan ha andre regler for å kode par av heltall, negative heltall osv. Skal vi bruke en turingmaskin for å løse graf-algoritmer, må vi ha en måte å kode grafens kanter og noder på, noe som kan gjøres på flere ulike måter. Poenget her er at måten inputen kodes på ikke har noen vesentlig betydning, så lenge kodingen er rimelig effektiv, siden en turingmaskin alltid kan endre kodingen fra en type til en annen. De problemene som enklest kan studeres ved hjelp av turingmaskiner, er de hvor svaret er enten ja eller nei. Definisjon Et avgjørbarhetsproblem (decision problem) spør hvorvidt et utsagn fra en klasse av utsagn er sant. Denne type problem er også kjent som ja-eller-nei-problem. Gitt et slikt avgjørbarhetsproblem ønsker vi å vite hvorvidt det finnes en algoritme som kan avgjøre hvorvidt ulike utsagn fra denne klassen av utsagn er sanne. Som et eksempel kan vi se på klassen av utsagn som spør om et bestemt heltall, n, er et primtall. Dette er et avgjørbarhetsproblem fordi svaret på spørsmålet «Er n et primtall?» er enten ja eller nei. Spørsmålet er altså om det finnes en algoritme som kan avgjøre hvorvidt hvert av utsagnene i avgjørbarhetsproblemet er sant, altså avgjør om et heltall n er et primtall. Svaret er at det finnes slike algoritmer. Mengden av input hvor svaret på ja-nei-problemet er ja, er en delmengde av mengden av mulige input, altså en delmengde av input-alfabetet. Dette 3

innebærer at det å løse ja-nei-problem er det samme som å gjenkjenne språket som består av alle bitstrenger som representerer input-verdiene til problemet som leder til svaret «ja». Følgelig er det å løse et ja-nei-problem det samme som å gjenkjenne språket som svarer til input-verdiene som gir svaret «ja» på problemet. Avgjørbarhet (Decidability) Dersom det finnes en effektiv algoritme som kan finne om en instans av et avgjørbarhetsproblem er sant, så sier vi at problemet er løsbart eller avgjørbart. Som eksempel kan vi si at problemet med å avgjøre hvorvidt et heltall er et primtall, er avgjørbart. Dersom det ikke finnes noen slik algoritme, sier vi at problemet er uløsbart eller uavgjørbart. For å vise at et problem er avgjørbart, må vi lage en algoritme som kan avgjøre problemet. Dersom vi skal vise at et problem er uavgjørbart, må vi bevise at det ikke finnes noen slik algoritme. Det er ikke tilstrekkelig at vi ikke klarte å finne en slik algoritme. Å bevise dette kan være svært vanskelig. Stopproblemet (The halting problem) er avgjørbarhetsproblemet som spør hvorvidt en turingmaskin vil stoppe når den gis en bestemt input-streng, x. Det viser seg at stopproblemet er et uløsbart avgjørbarhetsproblem (altså et uavgjørbart problem) [4]. Dette innebærer at det ikke finnes noen turingmaskin som dersom den gis en koding av turingmaskin T og dens input x kan avgjøre om T vil stoppe dersom den starter med x skrevet på tapen. Andre eksempler på problemer som ikke er avgjørbare er: - problemet med å bestemme hvorvidt to kontekstfrie grammatikker genererer samme mengde av strenger - Hilberts tiende problem som spør hvorvidt det finnes heltallsløsninger på et gitt polynom med heltallskoeffisienter. Beregnbarhet En funksjon som kan beregnes av en turingmaskin, kalles beregnbar, og en funksjon som ikke kan beregnes av en turingmaskin kalles uberegnbar. Det kan vises at det finnes funksjoner som er uberegnbare. Det er imidlertid ikke så enkelt å lage en slik funksjon. Merk at ethvert avgjørbarhetsproblem kan reformuleres slik at det blir en beregning av en funksjon som har verdien 1 når svaret er ja, og 0 når svaret er nei. Et avgjørbarhetsproblem er løsbart hvis og bare hvis den tilsvarende funksjonen er beregnbar. 4

Appendiks Noen eksempler på bruk av turingmaskiner (Dette er ikke pensum til eksamen) Bruk av turingmaskiner for å gjenkjenne mengder En av oppgavene turingmaskiner kan brukes til, er å gjenkjenne mengder. Vi må da først definere hva vi mener med en sluttilstand for en turingmaskin. Dersom vi definerer turingmaskinen ved hjelp av fem-tupler, er sluttilstanden en tilstand som ikke er listet som første tilstand i noen av fem-tuplene, kun som annen tilstand (altså kun som s, ikke som s, dersom man bruker symbolene i forrige avsnitt). Vi kan nå definere hva vi formelt sett mener med at en turingmaskin gjenkjenner en streng [3]: La V være en delmengde av alfabetet I. En turingmaskin T = (S, I, f, s0) gjenkjenner en streng x i V* hvis og bare hvis T, som starter i startposisjonen når x skrives til papirremsen, stopper i en sluttilstand. T sies å gjenkjenne en delmengde A av V* dersom x gjenkjennes av T hvis og bare hvis x tilhører A. Merk at for å gjenkjenne en delmengde A av V* kan vi bruke symboler som ikke er elementer i V. Dette betyr at inngangsalfabetet I kan inneholde symboler som ikke er elementer i V. Disse symbolene kan f eks benyttes som markører. Når vil en turingmaskin ikke gjenkjenne en streng x i V*? Svaret er at x ikke gjenkjennes dersom turingmaskinen ikke stanser eller stanser i en tilstand som ikke er en sluttilstand. Eksempel Finn en turingmaskin som gjenkjenner en bitstreng som har 1 som sin andre bit, dvs. strengen (0 + 1) 1 (0 + 1)* Løsning: Følgende sett av fem-tupler definerer en turingmaskin som gjør dette: (s0, 0, s1, 0, R) (s0, 1, s1, 1, R) Disse to første leser inn det første symbolet og setter turingmaskinen i tilstand s1. I tillegg må vi ha følgende to: (s1, 0, s2, 0, R) (s1, 1, s3, 1, R) Disse to leser inn symbol nummer to, og går til tilstand s2 dersom symbol nummer to er 0, og til tilstand s3 dersom symbol nummer to er 1. Vi tenker oss her at s3 er sluttilstanden, mens s2 ikke må være en sluttilstand. Vi må derfor inkludere et fem-tuppel med s2 som starttilstand: (s2, 0, s2, 0, R) Fordi vi ikke ønsker å gjenkjenne en tom streng eller en streng med ett bit, inkluderer vi følgende to fem-tupler: 5

(s0, B, s2, 0, R) (s1, B, s2, 0, R) En turingmaskin definert av disse syv fem-tupler, vil terminere i sluttilstanden s3 hvis og bare hvis bitstrengen har minst to bit og det andre bitet er 1. Ellers vil maskinen terminere i tilstanden s2 som altså ikke er en sluttilstand. Eksempel Finn en turingmaskin som gjenkjenner en bitstreng som består av en eller flere 0-er fulgt av det samme antall 1-ere, altså strengen 0 n 1 n med n 1 Her vil det være lurt å benytte seg av et ekstra symbol som et merke, la oss kalle det M. Vi har da V = {0, 1} og I = {0, 1, M}. Vi ser her at V* består av alle mulige bitstrenger, mens vi ønsker å gjenkjenne en delmengde av disse. Vi lager nå turingmaskinen slik at den erstatter en 0 lengst til venstre med en M, og en 1 lengst til høyre med en M. Dette er altså for å holde styr på hvilken 0 lengst til venstre og hvilken 1 lengst til høyre vi har sjekket. Sluttilstanden vil bli hetende s6, og maskinen skal altså nå denne tilstanden kun dersom den finner en blokk med 0-er fulgt av en blokk med samme antall 1-ere. Denne turingmaskinen defineres av følgende fem-tupler: (s0, 0, s1, M, R) (s1, 0, s1, 0, R) (s1, 1, s1, 1, R) (s1, M, s2, M, L) (s1, B, s2, B, L) (s2, 1, s3, M, L) (s3, 1, s3, 1, L) (s3, 0, s4, 0, L) (s3, M, s5, M, R) (s4, 0, s4, 0, L) (s4, M, s0, M, R) (s5, M, s6, M, R) Funksjonsberegninger ved hjelp av turingmaskiner En turingmaskin kan betraktes som en maskin som finner verdien til en partiell funksjon. Vi kan se dette ved å anta at når turingmaskinen T gis strengen x som input, terminerer den med strengen y på tapen. Vi kan da definere funksjonen y = T(x). Definisjonsmengden til T er 6

mengden av strenger for hvilke turingmaskinen T terminerer. T(x) er udefinert dersom T ikke terminerer når den gis strengen x som input. Men kan dette brukes når vi skal beregne funksjonsverdier av mer «vanlige» heltallsfunksjoner? Ja, det er mulig, men det blir ikke veldig enkelt og oversiktlig. Dette vil da bli en funksjon fra k-tupler av ikke-negative heltall til ikke-negative heltall. En slik funksjon kalles en tallteoretisk funksjon. For å kunne bruke en turingmaskin til dette, må vi ha en måte å representere k-tupler av heltall på turingmaskinens tape. Til dette kan vi bruke en såkalt unær (unary) representasjon av heltall. Dette består i å representere det ikke-negative heltallet n med en streng av n + 1 enere. F. eks. vil da tallet 0 representeres av 1, tallet 2 representeres av 111 og tallet 5 representeres av 111111. For å representere fem-tuplene som turingmaskinen består av, bruker vi et skilletegn (ofte *) mellom hvert av de fem symbolene. Dersom vi skal representere fem-tuplet (2, 0, 1, 3) vil vi da gjøre det ved hjelp av strengen 111*1*11*1111. Vi kan da betrakte en turingmaskin som en beregning av sekvenser av tallteoretiske funksjoner T, T 2, T 3,, T k, Funksjonen T k er definert ved aksjonen av T på k-tuplene av heltall representert ved den unære representasjonen av heltall separert med skilletegn. Eksempel Lag en turingmaskin som adderer to ikke-negative heltall. Vi ønsker altså å bygge en turingmaskin, T, som beregner funksjonen f(n1, n2) = n1 + n2. Den unære representasjon av paret n1, n2 består av en streng av n1 + 1 enere fulgt av en stjerne fulgt av n2 +1 enere. Maskinen skal altså ta denne strengen som input og skal som output produsere en tape med n1 + n2 + 1 enere. En mulighet for å oppnå dette, er som følger: Maskinen starter med eneren lengst til venstre i inputstrengen, og sletter denne. Den stopper dersom n1 = 0. Den bytter ut stjerna med den gjenværende eneren lengst til venstre, og stopper så. Vi kan bruke følgende fem-tupler for å oppnå dette: (s0, 1, s1, B, R) (s1, *, s3, B, R) (s1, 1, s2, B, R) (s2, 1, s2, 1, R) (s2, *, s3, 1, R) 7

Referanser 1. Turing, A.M., «On Computable Numbers, with an Application to the Entscheidungsproblem», Proceedings of the London Mathematical Society, 2 42: 230 65, 1937. 2. Turing, A.M., «On Computable Numbers, with an Application to the Entscheidungsproblem: A correction», Proceedings of the London Mathematical Society, 2 43: 544 6). 3. Rosen, K. H., «Discrete Mathematics and Its Applications», New York, McGraw-Hill, 2007, 6. utgave, avsnitt 12.5. 4. Sipser, Michael, «Introduction to the Theory of Computation», Boston, Course Technology Inc, 2006, 2. utgave. 8