NEODLOČLJIVI PROBLEMI V TEORIJI IZRAČUNLJIVOSTI

Similar documents
UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA LUKA VIKTOR ROGAČ KONČNI AVTOMATI DIPLOMSKO DELO

AKSIOMATSKA KONSTRUKCIJA NARAVNIH

POLDIREKTNI PRODUKT GRUP

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE. Kvadratne forme nad končnimi obsegi

Računalnik iz domin. Škafar, Maja Šafarič, Nina Sangawa Hmeljak Mentor: Vid Kocijan

Reševanje problemov in algoritmi

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA POLONA ŠENKINC REŠEVANJE LINEARNIH DIFERENCIALNIH ENAČB DRUGEGA REDA S POMOČJO POTENČNIH VRST DIPLOMSKO DELO

UNIVERZA V MARIBORU FAKULTETA ZA NARAVOSLOVJE IN MATEMATIKO. Oddelek za matematiko in računalništvo DIPLOMSKO DELO.

Miha Drole. Sintaksna analiza rahlo kontekstno odvisnih jezikov

NIKJER-NIČELNI PRETOKI

SLIKE CANTORJEVE PAHLJAµCE

Problem umetnostne galerije

TOPLJENEC ASOCIIRA LE V VODNI FAZI

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE. Simetrije cirkulantnih grafov

DELOVANJA GRUP IN BLOKI NEPRIMITIVNOSTI

Sekvenčna preklopna vezja

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE. Verjetnostni algoritmi za testiranje praštevilskosti

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA SAŠO ZUPANEC MAX-PLUS ALGEBRA DIPLOMSKO DELO

Iskanje najcenejše poti v grafih preko polkolobarjev

Matematika 1. Gabrijel Tomšič Bojan Orel Neža Mramor Kosta

Hipohamiltonovi grafi

Matej Mislej HOMOMORFIZMI RAVNINSKIH GRAFOV Z VELIKIM NOTRANJIM OBSEGOM

SIMETRIČNI BICIRKULANTI

Verifying Time Complexity of Turing Machines

Eulerjevi in Hamiltonovi grafi

Kode za popravljanje napak

Jernej Azarija. Štetje vpetih dreves v grafih

UNIVERZA V MARIBORU FAKULTETA ZA NARAVOSLOVJE IN MATEMATIKO. Oddelek za matematiko in računalništvo MAGISTRSKA NALOGA. Tina Lešnik

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE. Kromatično število in kromatični indeks grafa

JERNEJ TONEJC. Fakulteta za matematiko in fiziko

UNIVERZA V MARIBORU FAKULTETA ZA NARAVOSLOVJE IN MATEMATIKO. Oddelek za matematiko in računalništvo DIPLOMSKO DELO. Gregor Ambrož

Uporaba preglednic za obdelavo podatkov

Ana Mlinar Fulereni. Delo diplomskega seminarja. Mentor: izred. prof. dr. Riste Škrekovski

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE

OPTIMIZACIJSKE METODE skripta v pripravi

UNIVERZA V LJUBLJANI FAKULTETA ZA MATEMATIKO IN FIZIKO ODDELEK ZA MATEMATIKO

DIOFANTSKE ČETVERICE

Hadamardove matrike in misija Mariner 9

OFF-LINE NALOGA NAJKRAJŠI SKUPNI NADNIZ

TEORIJA GRAFOV IN LOGISTIKA

Neli Blagus. Iterativni funkcijski sistemi in konstrukcija fraktalov

Călugăreanu-White-Fullerjev teorem in topologija DNA

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE. O neeksaknotsti eksaktnega binomskega intervala zaupanja

Cveto Trampuž PRIMERJAVA ANALIZE VEČRAZSEŽNIH TABEL Z RAZLIČNIMI MODELI REGRESIJSKE ANALIZE DIHOTOMNIH SPREMENLJIVK

Multipla korelacija in regresija. Multipla regresija, multipla korelacija, statistično zaključevanje o multiplem R

Univerza v Ljubljani Fakulteta za matematiko in fiziko. Oddelek za fiziko. Seminar - 3. letnik, I. stopnja. Kvantni računalniki. Avtor: Tomaž Čegovnik

FRAKTALNA DIMENZIJA. Fakulteta za matematiko in fiziko Univerza v Ljubljani

ENAČBA STANJA VODE IN VODNE PARE

Zgoščevanje podatkov

Izvedbe hitrega urejanja za CPE in GPE

Linearna regresija. Poglavje 4

SIMETRIČNE KOMPONENTE

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA DIPLOMSKO DELO MAJA OSTERMAN

Simulacija dinamičnih sistemov s pomočjo osnovnih funkcij orodij MATLAB in Simulink

INTELLIGENTNI SISTEMI Mehka Logika

Vsebina vaj: Komunikacije v Avtomatiki Avditorne vaje. 1. Postopki cikličnega kodiranja (CRC). 2. Postopki zgoščevanja podatkov (Huffman).

Miha Troha. Robotsko učenje in planiranje potiskanja predmetov

Linearne enačbe. Matrična algebra. Linearne enačbe. Linearne enačbe. Linearne enačbe. Linearne enačbe

Ivan Pucelj: RIMSKE ŠTEVILKE IN RAČUNANJE Z NJIMI. List za mlade matematike, fizike, astronome in računalnikarje

Izbrana poglavja iz velikih omreºij 1. Zbornik seminarskih nalog iz velikih omreºij

SVM = Support Vector Machine = Metoda podpornih vektorjev

DOMINACIJSKO TEVILO GRAFA

Preprečevanje neizvedljivosti urnikov pri metahevrističnem razvrščanju proizvodnih procesov

Univerza na Primorskem FAMNIT, MFI STATISTIKA 2 Seminarska naloga

UČNI NAČRT PREDMETA / COURSE SYLLABUS Predmet: Analiza 1 Course title: Analysis 1. Študijska smer Study field. Samost. delo Individ.

UČNI NAČRT PREDMETA / COURSE SYLLABUS (leto / year 2017/18) Parcialne diferencialne enačbe Partial differential equations. Študijska smer Study field

Izbrana poglavja iz algebrai ne teorije grafov. Zbornik seminarskih nalog iz algebrai ne teorije grafov

modeli regresijske analize nominalnih spremenljivk

Topološka obdelava slik

Interpolacija s parametričnimi polinomskimikrivuljami 1

APLIKACIJA ZA DELO Z GRAFI

UČNI NAČRT PREDMETA / COURSE SYLLABUS (leto / year 2017/18) Predmet: Optimizacija 1 Course title: Optimization 1. Študijska smer Study field

Naloge iz LA T EXa : 3. del

OA07 ANNEX 4: SCOPE OF ACCREDITATION IN CALIBRATION

USING SIMULATED SPECTRA TO TEST THE EFFICIENCY OF SPECTRAL PROCESSING SOFTWARE IN REDUCING THE NOISE IN AUGER ELECTRON SPECTRA

UČNI NAČRT PREDMETA / COURSE SYLLABUS Numerical linear algebra. Študijska smer Study field. Samost. delo Individ. work Klinične vaje work

IZPELJANKE ALGORITMA LZW

Attempt to prepare seasonal weather outlook for Slovenia

Vsebina Od problema do načrta programa 1. del

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA FAKULTETA ZA MATEMATIKO IN FIZIKO DIPLOMSKO DELO MIHAELA REMIC

Vrednotenje gibov in kretenj roke kot vhodne naprave za komunikacijo človek stroj v navideznih okoljih

OPTIMIZACIJA Z ROJEM DELCEV

Iterativne metode podprostorov 2010/2011 Domače naloge

Intervalske Bézierove krivulje in ploskve

LISREL. Mels, G. (2006). LISREL for Windows: Getting Started Guide. Lincolnwood, IL: Scientific Software International, Inc.

Fakulteta za matematiko in fiziko Univerza v Ljubljani. Seminar. Kvantni računalniki. Avtor: Matjaž Gregorič. Mentor: prof. N.S.

UNIVERZA NA PRIMORSKEM FAKULTETA ZA MATEMATIKO, NARAVOSLOVJE IN INFORMACIJSKE TEHNOLOGIJE. Ekstremne porazdelitve za odvisne spremenljivke

OPTIMIRANJE IZDELOVALNIH PROCESOV

Osnove numerične matematike

Linearna algebra. Bojan Orel. Univerza v Ljubljani

Katastrofalno zaporedje okvar v medsebojno odvisnih omrežjih

UNIVERZA V MARIBORU FAKULTETA ZA ELEKTROTEHNIKO, RAČUNALNIŠTVO IN INFORMATIKO. Filip Urh DINAMIČNI PARALELIZEM NA GPE.

Formalni sistem in mehka logika za analizo digitalne slike: osnovni koncept

Grafi, igre in še kaj

Univerza na Primorskem. Fakulteta za matematiko, naravoslovje in informacijske tehnologije. Zaznavanje gibov. Zaključna naloga

UČNI NAČRT PREDMETA / COURSE SYLLABUS (leto / year 2017/18) Predmet: Analiza 3 Course title: Analysis 3. Študijska smer Study field ECTS

Verifikacija napovedi padavin

Katja Tuma Generiranje in reševanje sudokuja

Razvoj spletnega slovarja slovenskega znakovnega jezika

Transcription:

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA LUKA VIKTOR ROGAČ NEODLOČLJIVI PROBLEMI V TEORIJI IZRAČUNLJIVOSTI MAGISTRSKO DELO LJUBLJANA, 2017

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA POUČEVANJE, PREDMETNO POUČEVANJE LUKA VIKTOR ROGAČ NEODLOČLJIVI PROBLEMI V TEORIJI IZRAČUNLJIVOSTI MAGISTRSKO DELO MENTOR: red. prof. dr. ALEKSANDER MALNIČ SOMENTOR: doc. dr. ROK POŽAR LJUBLJANA, 2017

Zahvala Mentorju red. prof. dr. Aleksandru Malniču in somentorju doc. dr. Roku Požarju hvala za strokovno pomoč, nasvete in vodenje pri nastajanju magistrskega dela. Družini hvala za vso podporo in razumevanje.

Povzetek V magistrskem delu je predstavljena hierarhija avtomatov in pripadajočih jezikov. Vpeljani so pojmi, povezani z razpoznavnimi in nerazpoznavnimi jeziki. Sledi nadaljnja vpeljava podrazreda razpoznavnih jezikov; to so odločljivi jeziki. S pomočjo odločljivih oziroma neodločljivih jezikov prevedemo in strogo definiramo koncept odločljivih oziroma neodločljivih problemov. Podrobno so opisani so naslednji zgledi neodločljivih problemov: problem zaustavitve Turingovega stroja, Postov korespodenčni problem, problem zaposlenega bobra in Hilbertov deseti problem. V okviru magistrskega dela je bila izdelana spletna aplikacija, ki išče konkretne rešitve Postovega korespodenčnega problema. Podrobno je opisano programsko orodje z razlago programske kode in navodili za uporabo. Naveden je tudi primer uporabe spletne aplikacije v praksi, na primer pri računalniškem krožku. MSC (2010) klasifikacija: 03D10, 03D20, 03D25, 68Q45. Ključne besede: hierarhija avtomatov in jezikov, razpoznavni jeziki, odločljivi jeziki, odločljivi problemi, problem zaustavitve Turingovega stroja, Postov korespodenčni problem, problem zaposlenega bobra, Hilbertov 10. problem.

Abstract In this master thesis the hierarchy of automata and related languages is presented. First, the concepts, associated with recognizable and unrecognizable languages are introduced, followed by further introduction of a subclass of recognized languages; these are decidable languages. By means of decidable and undecidable languages the concept of decidable and undecidable problems was translated and strictly defined. The following examples of undecidable problems are described in detail: the Turing s halting problem, the Post correspondence problem, the busy beaver problem and the Hilbert s tenth problem. In the frame of the master thesis, a web application which is searching for concrete solutions of the Post correspondence problem, was developed. The programming environment of the application and the interpretation of the source code with instructions for its using are described in detail. An example for the usage of the application at teaching, for example in a computer club, is presented. MSC (2010) classification: 03D10, 03D20, 03D25, 68Q45. Key words: hierarchy of automata and related languages, recognizable languages, decidable languages, decidable problems, the Turing s halting problem, the Post correspondence problem, the Busy beaver problem, the Hilbert s 10 th problem.

Kazalo 1 Uvod 1 2 Hierarhija avtomatov in jezikov 3 2.1 Končni avtomat.................................. 3 2.2 Skladovni avtomat................................ 6 2.3 Turingov stroj................................... 8 2.3.1 Gödelovo številčenje Turingovih strojev................. 10 2.4 Linearno omejeni avtomat............................ 11 2.5 Hierarhija..................................... 12 3 Razpoznavnost in nerazpoznavnost jezikov 15 4 Odločljivost in neodločljivost jezikov 19 5 Odločljivost in neodločljivost problemov 23 5.1 Problem zaustavitve Turingovega stroja..................... 23 6 Postov korespondenčni problem 27 7 Problem zaposlenega bobra 33 8 Problem rešljivosti diofantskih enačb 37 9 Spletna aplikacija 39 9.1 HTML, PHP in CSS............................... 39 9.1.1 Hyper Text Markup Language...................... 39 9.1.2 PHP: Hypertext Preprocessor...................... 39 9.1.3 Cascading Style Sheets.......................... 40 9.2 Opis aplikacije................................... 41 9.3 Navodila za uporabo............................... 41 9.3.1 Splošna navodila............................. 41 9.3.2 Lokalna uporaba spletne aplikacije na operacijskem sistemu Windows 43 9.4 Koda........................................ 44 9.4.1 Predlogi za nadgradnjo.......................... 45 9.5 Uporaba pri računalniškem krožku....................... 45 10 Zaključek 47

Slike 2.1 Končni avtomat, predstavljen z diagramom..................... 4 2.2 Skladovni avtomat, predstavljen z diagramom.................... 6 2.3 Turingov stroj, predstavljen z diagramom...................... 9 2.4 Hierarhija jezikov in pripadajoči avtomati.................... 12 4.1 Če je jezik L odločljiv, je njegov komplement L tudi odločljiv......... 20 4.2 Turingov stroj M.................................. 20 5.1 Primer realizacije Turingovega stroja D..................... 24 5.2 Primer realizacije Turingovega stroja F..................... 24 5.3 Turingov stroj P.................................. 25 7.1 Primer Turingovega stroja B(3), predstavljen z diagramom.......... 34 9.1 Začetna stran spletne aplikacije.......................... 42 9.2 Aplikacija najde rešitev.............................. 43 9.3 Programsko okno programa XAMPP....................... 43 9.4 Shematski prikaz programske kode........................ 44 Tabele 3.1 Tabela karakterističnih vektorjev......................... 17 7.1 Vrednosti Σ(n) in S(n) za 1 n 6 [16]..................... 35

Poglavje 1 Uvod Teorija izračunljivosti je temeljna disciplina računalništva, ki se ukvarja z reševanjem problemov s pomočjo različnih modelov računanja. Pri reševanju problema zahtevamo tak postopek oziroma algoritem, ki poda rešitev za vse mogoče konkretne primere. Pomembna veja teorije izračunljivosti je teorija avtomatov, ki leži na preseku med logiko, matematiko in računalništvom. Avtomat predstavlja abstraktni model stroja s stanji, ki se glede na vhodno besedo in funkcijo prehodov med stanji, premika po stanjih. V primeru, da se avtomat glede na vhodno besedo ustavi v končnem stanju, pravimo, da to vhodno besedo avtomat sprejme oziroma razpozna. Množici vseh tistih besed, ki jih avtomat sprejme, pravimo jezik avtomata. Na tak način lahko generiramo formalne jezike. Če za nek jezik obstaja tak avtomat, ki se ne glede na vhodno besedo vedno ustavi, pa če jo avtomat sprejme ali ne, temu jeziku pravimo, da je odločljiv. Na podoben način konkretnemu problemu priredimo ekvivalenten jezik in pripadajoči avtomat, za katerega si želimo, da je odločljiv. Z drugimi besedami to pomeni, da ne glede na vhodno besedo avtomat vedno poda povratno informacijo. V primeru, da za problem ni mogoče najti odločljivega jezika, pravimo, da je problem oziroma jezik neodločljiv. O neodločljivih problemih v teoriji izračunljivosti najdemo kar nekaj pomembne tuje literature, kot na primer dela Turinga [1], Hopcrofta s sodelavci [2], Sipserja [3] in Martina [4]. Magistrsko delo sestavlja osem poglavij. Po uvodu je v drugem poglavju predstavljena hierarhija avtomatov in pripadajočih jezikov, kjer spoznamo naslednje štiri tipe avtomatov: končni avtomat, skladovni avtomat, Turingov stroj in linearno omejeni avtomat. V naslednjem poglavju si ogledamo pomen razpoznavnosti oziroma nerazpoznavnosti jezika s konkretnim zgledom nerazpoznavnega jezika. V tretjem poglavju definiramo podrazred razpoznavnih jezikov, ki se imenujejo odločljivi jeziki. Nato v četrtem poglavju odločljive jezike prevedemo na odločljive probleme ter se posvetimo temeljnemu neodločljivemu problemu, to je problemu zaustavitve Turingovega stroja. Sledita dve poglavji konkretnih neodločljivih problemov, to sta Postov korespodenčni problem in problem zaposlenega bobra. V predzadnjem poglavju omenimo znameniti Hilbertov 10. problem, to je problem rešljivosti diofantskih enačb, ki ga formuliramo s pomočjo teorije avtomatov. V zadnjem poglavju razvijemo lastno spletno aplikacijo, ki išče konkretne rešitve Postovega korespodenčnega problema. Zaključimo s predstavitvijo spletno okolje skupaj z opisom aplikacije, razlago programske kode, navodili za uporabo in primerom uporabe v praksi. 1

2

Poglavje 2 Hierarhija avtomatov in jezikov Avtomat je abstraktni model stroja, ki se glede na vhodno besedo (zaporedje simbolov) in funkcijo prehodov premika po stanjih. V primeru, da avtomat po prebrani vhodni besedi obstane v končnem stanju, to besedo avtomat sprejme oziroma razpozna. Množici vseh besed, ki jih avtomat sprejme, pravimo jezik avtomata. Na tak način generiramo formalne jezike, ki jih je možno hierarhično razdeliti glede na to, s kako enostavnim avtomatom jih je moč razpoznati. V tem poglavju bomo s pomočjo literature [2, 3] spoznali to razdelitev. V prvem razdelku se bomo dodatno oprli še na dela [5, 6], v drugem in četrtem razdelku bomo uporabili informacije iz [7], v tretjem iz [1, 8, 9] in v petem razdelku iz [6, 10]. 2.1 Končni avtomat Končni avtomat si lahko predstavljamo kot računalnik, ki ga sestavljajo centralna procesna enota brez internega pomnilnika, zunanji pomnilnik, ki je kar trak, na katerem je zapisana beseda nad abecedo Σ, ter bralna glava, ki s traku sekvenčno bere vsakič po en simbol dane besede, to je zaporedje simbolov iz dane abecede Σ. Procesno enoto sestavljajo stanja in kazalec na stanja; eno od stanj je začetno stanje, nekatera pa so končna stanja. Kazalec stanj se premika glede na simbol, ki ga prebere bralna glava. Če se kazalec z začetnega stanja po branju vhodne besede prestavi v eno od končnih stanj, pravimo, da avtomat prepozna vhodno besedo in jo sprejme. Jezik avtomata M je množica vseh tistih besede nad abecedo Σ, ki jih avtomat sprejme; označimo ga L(M). Bolj nazorno lahko avtomat predstavimo v obliki diagrama, pri čemer so stanja narisana kot krogci, prehodi med stanji pa kot usmerjene povezave s pripadajočo oznako, ki predstavlja prebrani simbol. Začetno in končno stanje sta posebej označeni. Začetno stanje je predstavljeno v obliki krogca s širšo puščico nanj; končno stanje pa je oblikovan krogec s posebno obrobo. Te oznake veljajo za vse nadaljnje avtomate. Zgled 1. Na sliki 2.1 je prikazan diagram končnega avtomata M nad abecedo Σ = {0, 1}, ki sprejme jezik L(M) = {w Σ enak prvi in zadnji simbol v besedi w}. 3

Slika 2.1: Končni avtomat, predstavljen z diagramom. Formalno je končni avtomat urejena peterica pri čemer je: Q množica stanj, Σ abeceda, s Q začetno stanje, M KA = (Q, Σ, δ, s, F ), F Q neprazna množica končnih stanj, δ : Q Σ Q funkcija prehodov med stanji. Zgoraj smo formalno definirali končni avtomat, ki ga bolj natančno imenujemo deterministični končni avtomat. Obstajajo tudi nedeterministični končni avtomati. Prav tako kot deterministični tudi nedeterministični končni avtomat formalno sestavlja urejena peterica (Q, Σ, δ, s, F ), pojavi pa se razlika pri funkciji prehodov med stanji. Pri nedeterminističnem končnem avtomatu je funkcija prehodov med stanji definirana kot δ : Q Σ ε P (Q), kjer je P (Q) potenčna množica množice stanj in Σ ε = Σ {ε}. Nedeterministični končni avtomat poleg tega omogoča tako imenovane tihe prehode, kar pomeni prehajanja med stanji v primeru, ko je prebrana beseda prazna beseda ε. Formalno lahko pokažemo, da deterministični in nedeterministični končni avtomati sprejmejo isti razred jezikov, kljub temu, da se na prvi pogledi zdi, da so nedeterministični končni avtomati močnejših zaradi širše funkcije prehodov in bi zato morda lahko sprejeli večji razred jezikov. Rečemo, da sta dva končna avtomata ekvivalentna, če sprejmeta isti jezik. Ker je deterministični končni avtomat zgolj posebna oblika nedeterminističnega, lahko zgornjo trditev zapišemo z izrekom 1. Dokaz najdemo v literaturi [2, 3, 5]. Izrek 1 Vsak nedeterministični končni avtomat je ekvivalenten kakemu determinističnemu končnemu avtomatu. 4

Uporabnost ekvivaletnosti determinističnih in nedeterminističnih končnih avtomatov je v tem, da je za določeni jezik lažje skonstruirati nedeterministični končni avtomat kot determinističnega. Razred jezikov, ki jih sprejemajo končni avtomati, imenujemo tudi razred regularnih jezikov. To pa zato, ker so to natanko tisti jeziki, ki jih lahko formalno opišemo s pomočjo regularnih izrazov v pregledni krajši obliki. Množico regularnih izrazov Reg(Σ) in pripadajočih regularnih jezikov nad abecedo Σ definiramo rekurzivno na naslednji način: 1. Regularni izraz definira regularni jezik L( ) =, regularni izraz ε pa regularni jezik L(ε) = {ε}. 2. Naj bo a Σ. Potem je a Reg(Σ) regularni izraz, ki definira regularni jezik L(a) = {a}. 3. Če sta r 1 Reg(Σ) in r 2 Reg(Σ) regularna izraza, potem je tudi njun stik r 1 r 2 Reg(Σ) regularni izraz; jezik, ki mu pripada, pa je stik jezikov, ki pripadata regularnima izrazoma r 1 in r 2, to je, L(r 1 r 2 ) = L(r 1 ) L(r 2 ) = {a b a L 1, b L 2 }. 4. Če sta r 1 Reg(Σ) in r 2 Reg(Σ) regularna izraza, potem je r 1 + r 2 Reg(Σ) prav tako regularni izraz; jezik, ki mu pripada, pa je L(r 1 + r 2 ) = L(r 1 ) L(r 2 ), torej unija regularnih jezikov, ki pripadata izrazoma r 1 in r 2. 5. Če je r Reg(Σ) regularni izraz, potem je njegovo Kleenovo zaprtje r Reg(Σ) tudi regularni izraz, ki mu pripada ustrezeno Kleenovo zaprtje jezika L(r), torej L(r ) = L(r). 6. Regularni izrazi so natanko tiste besede nad razširjeno abecedo Σ {+,,, (, )}, ki jih iz 1. in 2. točke izpeljemo po pravilih iz točke 3., 4. in 5. Zaradi enostavnejšega zapisa se dogovorimo za prioritetni vrstni red operacij. Operacija z najvišjo prioriteto je operacija Kleenovo zaprtje, sledi stik in nato unija. Tako na primer regularni izraz ((01) + 1) + 0 zapišemo kot (01 + 1) + 1. V luči izreka 1 v nadaljevanju ne bomo razlikovali med determinističnim in nedeterminističnim končnim avtomatom, zato ga bomo imenovali kar končni avtomat (razen, če bo to posebej poudarjeno). Izrek, povezan s končnimi avtomati in regularnimi izrazi, bomo zapisali z izrekom 2. Dokaz je v literaturi [2, 3, 5]. Izrek 2 Za vsak regularni izraz r nad abecedo Σ obstaja tak končni avtomat M KA nad abecedo Σ, da je jezik avtomata L(M KA ) enak jeziku regularnega izraza r. Obratno, za vsak (determinstični) končni avtomat nad abecedo Σ obstaja tak regularni izraz r nad Σ, da je L(r) enak jeziku tega avtomata. Regularni jezik končnega avtomata iz zgleda 1, ki sprejme besede nad abecedo Σ = {0, 1}, ki se začnejo in končajo z enakim simbolom, zapišemo z regularnim izrazom 1(0 + 1) 1 + 0(0 + 1) 0. V tem poglavju smo spoznali formalno in neformalno koncept končnega avtomata in regularnega izraza. V naslednjem poglavju si bomo ogledali končni avtomat z dodatnim pomnilnikom, ki ga imenujemo sklad. Takemu avtomatu bomo rekli skladovni avtomat. 5

2.2 Skladovni avtomat Skladovni avtomat je končni avtomat z dodatnim pomnilnikom, tako imenovanim skladom, kamor avtomat zapisuje/prebere simbole skladovne abecede Γ po principu zadnji noter prvi ven. To pomeni, da podatek, v našem primeru simbol iz abecede Γ, ki je zadnji dodan na sklad, ga bo tudi prvi zapustil. Lahko si predstavljamo, da so simboli iz abecede Γ naloženi samostojno drug nad drugega, zadnjemu dodanemu podatku pa pravimo vrh sklada. Sklad poleg tega podpira dve operaciji, dodaj na vrh in briši z vrha. S to nadgradnjo se spremeni funkcija prehodov med stanji in procesiranje skladovnega avtomata. Procesno enoto tako kot končni avtomat sestavljajo stanja (eno je začetno stanje q 0, nekatera pa so končna stanja) in kazalec na stanja. Kazalec na stanja se premika glede na prebrani simbol, ki ga prebere bralna glava s traku in prebrani simbol z vrha sklada, ki se nato izbriše. Ko se kazalec na stanja premakne na naslednje stanje, se na vrh sklada doda nov simbol, ki ga dodeluje funkcija prehodov med stanji. Če se kazalec stanj po branju vhodne besede in vrha sklada prestavi iz začetnega stanja v končno stanje, pravimo, da skladovni avtomat prepozna vhodno besedo in jo sprejme. Potrebno je poudariti, da je lahko sklad na začetku tudi prazen. Skladovni avtomat lahko lažje predstavimo v grafični obliki, za katero veljajo podobni dogovorjeni grafični elementi, kot smo jih spoznali v prejšnjem poglavju. Razlika se pojavi pri oznakah na usmerjenih povezavah, ki predstavljajo funkcijo prehoda med stanji. Oznaka sestoji iz treh elementov: prvi predstavlja prebrani simbol s traku, drugi simbol predstavlja prebrani simbol z vrha sklada (po branju se izbriše), tretji simbol pa predstavlja simbol, ki ga zapišemo na vrh sklada. Oglejmo si spodnji zgled. Zgled 2. Na sliki 2.2 je prikazan diagram skladovnega avtomata M, ki sprejme natanko tiste besede, ki so vsebovane v množici jezika Simbol $ označuje prazen sklad. L(M) = {0 n 1 n n 0}. Slika 2.2: Skladovni avtomat, predstavljen z diagramom. Formalno skladovni avtomat definiramo kot urejeno šesterico M SA = (Q, Σ, Γ, δ, q 0, F ), pri čemer je 6

Q množica stanj, Σ abeceda vhodne besede, Γ abeceda sklada, δ : Q Σ ε Γ ε P (Q Γ ε ) funkcija prehodov med stanji, kjer je Σ ε = Σ {ε} in Γ ε = Γ {ε}, q 0 Q začetno stanje in F Q neprazna množica končnih stanj. Podobno kot pri končni avtomatih, skladovne avtomate razdelimo na deterministične in nedeterministične. Ponovno se razlikujeta v funkciji prehodov med stanji, kjer je pri nedeterminističnem prehod definiran kot funkcija iz množice stanj Q v potenčno množico stanj, pri determinističnem pa je novo stanje natančno določeno. Zaradi lažjega razumevanja in predstavljivosti običajno uporabljamo nedeterministični skladovni avtomat, ki je opisan zgoraj. Razreda determinističnih in nedeterminističnih skladovnih avtomatov sta si ekvivalentna v smislu, da generirata isti razred jezikov. Skladovni avtomati generirajo jezike imenovane kontekstno neodvisni jeziki, ki jih opišemo s konceptom kontekstno neodvisne gramatike. Kontekstno neodvisno gramatiko G formalno definiramo kot urejeno četverico (V, Σ, R, S), kjer je: V množica simbolov, ki jim rečemo spremenljivke, Σ množica simbolov, ki jim rečemo konstante, pri čemer velja Σ V =, R množica pravil za izpeljavo, ki rekurzivno omogočajo izpeljavo spremenljivke v konstanto, A α; A V, α (V Σ), S V začetna spremenljivka. Jezik L(G) gramatike G je množica vseh tistih besed nad abecedo Σ, ki jih lahko z uporabo pravil izpeljav izpeljemo iz začetne spremenljivke. Takemu jeziku pravimo, da je kontekstno neodvisen. Izrek, ki se nanaša na skladovne avtomate in kontekstno neodvisne jezike, je zapisana spodaj. Dokaz bralec lahko najde v literaturi [2, 3, 5]. Izrek 3 Za vsak skladovni avtomat M SA lahko konstruiramo kontekstno neodvisno gramatiko G, da velja L(G) = L(M SA ). Obratno, za vsak kontekstno neodvisni jezik L(G) obstaja tak skladovni avtomat M, da velja L(M SA ) = L(G). V nadaljevanju bomo spoznali nadgrajen skladovni avtomat, imenovan Turingov stroj. 7

2.3 Turingov stroj Turingov stroj si lahko predstavljamo kot nadgrajen skladovni avtomat, kjer pa zapis simbolov ne poteka na sklad, ampak kar na trak vhodne besede. Trak, ki je neomejen v desno, je razdeljen na celice, vsaka s svojim pripadajočim simbolom, ki pa je lahko tudi prazen (označuje prazno celico). Zapis je mogoč v prazno celico ali v že zapisano celico traku, katere vsebino je naprej potrebno izbrisati in nato na novo zapisati. To je prva pomembna razlika, saj skladovni avtomat ne omogoča sprememb vsebine traku. Dodatno je nadgrajena bralna glava, pri kateri je omogočeno premikanje levo in desno in ne samo v eno smer. Turingov stroj v enem koraku procesiranja opravi branje simbola, spremembo stanja, brisanje oziroma zapis simbola v trenutno dostopno celico ter nazadnje premik bralne glave za eno celico levo ali desno (če je bralna glava na začetku in se bralna glava premakne v levo, tedaj Turingov stroj očitno ne more premakniti bralne glave, zato preneha s procesiranjem zmrzne ). Množica končnih stanj obsega dve posebni stanji stanje q sprejmi in stanje q zavrni. Turingov stroj razpozna vhodno besedo w Σ, če obstane v q sprejmi. Množici besed, ki jih dani Turingov stroj sprejme, pravimo jezik Turingovega stroja. Turingov stroj je formalno definiran kot urejena sedmerica pri čemer je: Q množica stanj, M T S = (Q, Σ, Γ, δ, q 0, q sprejmi, q zavrni ), Σ abeceda vhodne besede, ki ne vsebuje praznega simbola (označimo ga z ), Γ abeceda traku, ki vsebuje prazni simbol, pri čemer je abeceda vhodne besede Σ njegova podmnožica, torej Γ in Σ Γ \ { }, q 0 Q začetno stanje, q sprejmi končno stanje, q zavrni zavrnitveno stanje, pri čemer mora veljati q zavrni q sprejmi, δ : Q Γ Q {q sprejmi, q zavrni } Γ {L, R} funkcija prehodov med stanji. Oglejmo si pojem trenutni opis procesiranja Turingovega stroja. Trenutni opis je zapis v obliki besede, ki jo zapišemo na naslednji način: besedi, ki je trenutno zapisana na traku, dodamo stanje natanko pred simbol, ki je procesiran v naslednjem koraku. Na primer, če imamo vhodno besedo 01001 in začetno stanje q 0, je začetni trenutni opis q 0 01001, kar pomeni, da pri stanju q 0 prebere simbol 0. Trenutni opis 010q 3 01 pa predstavlja neki korak procesiranja, kjer v stanju q 3 preberemo simbol 0. Z zaporedjem trenutnih opisov procesiranja Turingovega stroja lahko zapišemo vsak korak procesiranja Turingovega stroja. Zaporedje trenutnih opisov je končno, če se Turingov stroj ustavi bodisi v stanju q sprejmi bodisi q zavrni. Posamezne korake zaporedja trenutnih opisov ločimo s simbolom #. 8

Kot končne in skladovne avtomate lahko tudi Turingove stroje lažje predstavimo v grafični obliki, za katero veljajo podobni dogovorjeni grafični elementi, kot smo jih spoznali v prejšnjih podpoglavjih. Razlika je pri oznaki nad usmerjeno povezavo, ki se sestoji iz treh simbolov: prvi predstavlja prebrani simbol s traku, drugi zapis simbola, tretji pa predstavlja simbol, ki pove smer premika bralne glave. Zgled 3. Na sliki 2.3 je prikazan diagram Turingovega stroja, ki sprejme natanko besede regularnega jezika, ki ga opišemo z regularnim izrazom 01 0. Slika 2.3: Turingov stroj, predstavljen z diagramom. Na diagramu vsaka puščica 0 /X,R z oznako nad njo ponazarja trenutni prebrani simbol, zapis novega simbola v celico prebranega simbola, smer premika bralne glave in prehod v naslednji trenutni opis v zaporedju. Kot primer procesiranja Turingovega stroja si oglejmo procesiranje vhodne besede 01110. Procesiranje zapišimo z zaporedjem trenutnih opisov procesiranja Turingovega stroja: 01110 q 0 01110 0 /X,R Xq 1 1110 1 /Y,R XY q 1 110 1 /Y,R XY Y q 1 10 1 /Y,R XY Y Y q 1 0 0 /X,R XY Y Y Xq 2 /,R XY Y Y X q sprejmi. Zaporedje trenutnih opisov procesiranja Turingovega stroja nam pove, da tak Turingov stroj sprejme vhodno besedo 01110. Turingov stroj ima tri možne izide procesiranja: 1. obstane v končnem stanju q sprejmi ; 2. obstane v zavrnitvenem stanju q zavrni ; 9

3. bodisi ne obstane, to je, procesiranje se nadaljuje v neskončnost, bodisi stroj zmrzne. Jezik L je Turingovo razpoznaven, če obstaja Turingov stroj M T S, katerega jezik L(M T S ) je enak jeziku L = L(M T S ). V tem poglavju smo spoznali deterministični Turingov stroj z enim trakom. Poznamo pa še nedeterministični Turingov stroj z enim trakom in Turingov stroj z več trakovi, ki je lahko determinističen ali nedeterminističen. Še več, poznamo tudi Turingove stroje z več trakovi in več glavami, tako deterministične kot nedeterministične, itd., kot je podano z izrekom 4. Dokaz izreka lahko najdemo v literaturi [2, 3, 5]. Izrek 4 Vse omenjene različice Turingovega stroja je možno simulirati z osnovnim determinističnim Turingovim strojem z enim trakom. 2.3.1 Gödelovo številčenje Turingovih strojev V tem razdelku se bomo posvetili kodiranju in številčenju Turingovih strojev. Turingove stroje smo do sedaj predstavili v obliki tabele ali diagrama. Funkcijo prehodov med stanji pa lahko opišemo tudi z linearnim zapisom Turingovega stroja, ki ga bomo definirali v nadaljevanju. Naj bo M T S Turingov stroj z množico stanj Q {q sprejmi, q zavrni } = {q 0, q 1, q 2,..., q m } in abecedo traku Γ = {S 0 =, S 1, S 2,..., S n }. Prehod δ(q i, S j ) = (S k, A, q l ) lahko zapišemo tudi v obliki urejene peterice prehoda pri čemer je: q i trenutno stanje, S j prebrani simbol, S k na trak zapisan simbol, q i S j S k Aq l, A premik bralne glave levo ali desno (oznaka L pomeni levo, R pa desno), q l naslednje stanje. Na množici vseh peteric prehodov vpeljemo linearno relacijo leksikografske ureditve: q i S j S k Aq l < q i S j S k Aq l, če je i < i ali i = i in j < j. Linearni zapis Turingovega stroja M T S peterice zapišemo eno za drugo v skladu z dano leksikografsko ureditvijo. dobimo, če vse Zgled 4. Na sliki 2.3 je prikazan Turingov stroj, ki sprejme besede regularnega jezika 01 0. Linearni zapis tega Turingova stroja je naslednji: q 0 Rq 4 q 0 0XRq 1 q 0 11Rq 4 q 1 Rq 4 q 1 0XRq 2 q 1 1Y Rq 1 q 2 Rq 5 q 2 00Rq 4 q 2 11Rq 4. Stanje q 4 predstavlja stanje q zavrni, stanje q 5 pa stanje q sprejmi. 10

Z vpeljavo linearnega zapisa Turingovega stroja se lahko lotimo kodiranja Turingovega stroja. To bomo naredili s tako imenovanimi Gödelovimi števili, ki temeljijo na praštevilih. Najprej praštevila oštevilčimo in sicer p 0 = 2, p 1 = 3, p 2 = 5,... Nato zakodiramo vsak sestavni del peterice. Naj bo gn(l) = 2 gn(r) = 3 gn(q i ) = p 2+2i ; i = 0, 1, 2..., m gn(s j ) = p 2+2j+1 ; j = 0, 1, 2,..., n. Kako lahko zakodiramo celotno peterico prehoda F = q i S j S k Aq l? Na naslednji način: gn(f ) = 2 gn(q i) 3 gn(s j) 5 gn(s k) 7 gn(a) 11 gn(q l). Če je F 0 F 1... F k linearni zapis Turingovega stroja M T S, ga zakodiramo takole gn(m T S ) = 2 gn(f 0) 3 gn(f 1) 5 gn(f 2) p gn(f k) k. Številu gn(m T S ) pravimo Gödelovo število Turingovega stroja M T S ali tudi koda Turingovega stroja M T S. Potrebno je opozoriti, da vsako naravno število ni nujno veljavna koda kakšnega Turingovega stroja. V primeru, ko imamo podano naravno število gn(m T S ) za katerega vemo, da je veljavna koda nekega Turingovega stroja, lahko linearni zapis enolično dekodiramo na naslednji način: najprej naredimo praštevilsko faktorizacijo števila gn(m T S ), nato pa ponovno na potencah gn(f i ). Tako dobimo zakodirane peterice prehodov, ki jih seveda lahko razberemo (označimo z gn 1 (M T S )). Če pa dano naravno število ni veljavna koda, kot smo omenili zgoraj, potem posebej definiramo, da je to koda praznega Turingovega stroja, ki ima prazno funkcijo prehodov med stanji. Z Gödelovimi števili lahko Turingove stroje oštevilčimo: i-ti Turingov stroj M i definiramo kot { M T S ; če je gn 1 (i) veljavna koda nekega Turingovega stroja M T S, M i = M ; v vseh drugih primerih, kjer M označuje Turingov stroj s prazno funkcijo prehodov med stanji. naravnemu številu pripada natanko en Turingov stroj. Torej vsakemu V naslednjem podpoglavju bomo spoznali omejeni Turingov stroj, imenovan linearno omejeni avtomat. 2.4 Linearno omejeni avtomat Pomembna omejena varianta Turingovega stroja je linearno omejeni avtomat, ki ga bomo spoznali v tem podpoglavju. Linearno omejeni avtomat je posebna oblika Turingovega stroja. Vsebuje vse sestavne dele Turingovega stroja, vendar pa trak ni več neomejen, ampak je omejen na interval, zamejen s posebnim levim in desnim končnim znakom na traku. 11

Bralna glava se tako ne more premikati izven intervala, ki ga ta dva posebna znaka določata. Jezike linearno omejenih avtomatov bolj pregledno opišemo s kontekstno odvisnimi gramatikami. Taka gramatika je definirana podobno kot kontekstno neodvisna gramatika, torej kot urejena četverica (V, Σ, R, S), z nekaj razlikami: 1. Kontekstno odvisna gramatika lahko vsebuje več kot en simbol na levi strani pravila izpeljave (pri čemer mora biti vsaj en simbol spremenljivka), torej αaβ αγβ, kjer je A V, α, β (V Σ) in γ (V Σ) \ ε. 2. Število znakov na levi strani ne sme biti večje kot na desni strani. 3. Ne dopuščamo pravila A ε, razen v primeru, ko je A začetna spremenljivka, ki se nikoli ne pojavi na desni strani kakega pravila. Zaradi oblike leve strani v pravilih lahko neformalno rečemo, da je pri izpeljavi pomemben kontekst podniz levo in desno od spremenljivke. Jezikom, ki jih definirajo kontekstno odvisne gramatike, rečemo kontekstno odvisni jeziki. Kontekstne neodvisne gramatike in linearno omejeni avtomati generirajo isti razred jezikov, kot je zapisano v izreku 5. Dokaz je v literaturi [2, 3, 5]. Izrek 5 Za vsak kontekstno odvisen jezik obstaja linearno omejeni avtomat, ki sprejme natanko ta jezik. Obratno, za vsak jezik linearno omejenega avtomata obstaja kontekstno odvisna gramatika, katere jezik je natanko jezik danega linearno omejenega avtomata. 2.5 Hierarhija Hierarhija jezikov (in pripadajočih avtomatov), ki jo je prvi opisal Noam Chomsky [10] leta 1958, je prikazana na sliki 2.4. Slika 2.4: Hierarhija jezikov in pripadajoči avtomati. V skladu s to hierarhijo razdelimo Turingovo razpoznavne jezike na 4 razrede: 3. regularni jeziki, 12

2. kontekstno neodvisni jeziki, 1. kontekstno odvisni jeziki, 0. Turingovi razpoznavni jeziki. Da gre za hierarhijo, je potrebno upoštevati, da za vsak par indeksov i > j velja, da je i-ti razred jezikov strogo vsebovan v j-tem razredu, kar se da pokazati z izrekom 6. Dokaz lahko najdemo v literaturi [2, 10]. Izrek 6 Razred regularnih jezikov je vsebovan v razredu kontekstno neodvisnih jezikov, ta je vsebovan v razredu kontekstno odvisnih jezikov, le ta pa je vsebovan v razredu Turingovih razpoznavnih jezikih. Ob tem so vse inkluzije stroge. Z drugimi besedami, vsak avtomat lahko simuliramo z bolj kompleksnim avtomatom, obratno pa ni mogoče: Končni avtomat lahko simuliramo s skladovnim avtomatom. Skladovni avtomat lahko simuliramo z linearno omejenim avtomatom. Linearno omejeni avtomat je poseben primer Turingovega stroja. S tem zaključujemo poglavje, v katerem smo spoznali hierarhično razdelitev avtomatov in pripadajočih jezikov. V naslednjem poglavju se bomo posvetili jezikom, ki jih ne sprejme noben avtomat. 13

14

Poglavje 3 Razpoznavnost in nerazpoznavnost jezikov V prejšnjem poglavju smo opredelili hierarhično razdelitev avtomatov in pripadajočih jezikov. V tem poglavja bomo natančneje spoznali, da obstajajo jeziki, ki jih ne sprejme noben avtomat. Takim jezikom pravimo Turingovi nerazpoznavni jeziki. Skonstruirali bomo tudi konkreten primer takega jezika. Pri tem se bomo oprli na literaturo [2, 3, 11]. Izrek 7 Nad vsako abecedo obstaja jezik, ki ni Turingovo razpoznavnen. Dokaz: Ker lahko Turingove stroje nad dano abecedo Σ oštevilčimo, jih je števno mnogo. Torej je tudi Turingovo razpoznavnih jezikov nad abecedo Σ števno mnogo. Vseh jezikov nad abecedo Σ pa je neštevno mnogo, saj je to potenčna množica množice vseh besed Σ. Po Cantorjevem izreku je moč množice 2 Σ večja od moči množice Σ. V nadaljevanju si bomo ogledali primer Turingovo nerazpoznavnega jezika. Za lažje razumevanje se najprej seznanimo z metodo diagonalizacije, ki jo je leta 1891 Georg Cantor uporabil pri dokazu, da je množica realnih števil neštevno neskončna [11]. Ponovimo nekaj osnov iz teorije množic. Denimo, da imamo množici A in B in funkcijo f : A B, ki preslika elemente iz množice A v množico B. Funkcija f je injektivna natanko tedaj, če vsak par različnih elementov a b iz množice A preslika v par različnih elementov f(a) f(b) v množici B. V primeru, ko za funkcijo f velja, da za vsak element iz množice B obstaja element iz A, za katerega velja f(a) = b, pravimo, da je surjektivna. Za funkcijo f, ki je injektivna in surjektivna pravimo, da je bijektivna. Pri taki preslikavi ima vsak element iz A natanko določeno sliko v B in vsak element iz B je slika natanko enega elementa iz A. V tem primeru rečemo, da imata množici A in B enako moč. Množica A je števna natanko tedaj, ko je končna, ali pa obstaja bijektivna preslikava iz množice A na množico naravnih števil N. Ne preveč zapleteno lahko pokažemo, da med množicama naravnih števil N in množico racionalnih števil Q obstaja bijekcija, kar pomeni, da je množica racionalnih števil Q števna (za dokaz glej [3]). Zanima nas, kaj lahko povemo o števnosti množice realnih števil R. V ta namen si oglejmo spodnji izrek. Izrek 8 Množica realnih števil R je neštevna [11]. 15

Dokaz: Ker obstaja bijektivna preslikava R (0, 1), na primer 1 arctgx + 1, je dovolj π 2 pokazati, da ne obstaja bijektivna preslikava med množico naravnih števil N in intervalom (0, 1). Recimo, da obstaja bijektivna preslikava f med N in intervalom (0, 1). Ker lahko vsako realno število x na intervalu (0, 1) zapišemo v obliki x = 0, d 1 d 2 d 3..., kjer d i zavzemajo cele vrednosti med 0 in 9, lahko f predstavimo v naslednji obliki n f(n) 1 0, d 11 d 12 d 13 d 14... 2 0, d 21 d 22 d 23 d 24... 3 0, d 31 d 32 d 33 d 34... 4 0, d 41 d 42 d 43 d 44.... Skonstruirajmo realno število x = 0, x 1 x 2 x 3 x 4..., da velja x n d nn (pri čemer izbiramo take vrednosti za x n, da niso vse decimalke 0 ali 9). Povedano drugače, decimalka x n ne zavzame vrednosti n-te decimalne števke realnega števila f(n). To so natanko vrednosti decimalnih mest na diagonali. n f(n) 1 0, d 11 d 12 d 13 d 14... 2 0, d 21 d 22 d 23 d 24... 3 0, d 31 d 32 d 33 d 34... 4 0, d 41 d 42 d 43 d 44.... Kaj lahko povemo o številu x? Število x je realno število na intervalu (0, 1), vendar ni vsebovano v sliki preslikave f, saj za vsak n N velja, da se f(n) in x razlikujeta na n-tem decimalnem mestu. Torej f ni surjektivna preslikava, kar je v protislovju s predpostavko. Torej je množica (0, 1) neštevna. Potem pa je tudi množica realnih števil R neštevna. Z uporabo zelo podobnega diagonalnega principa lahko konstruiramo konkreten primer jezika nad poljubno dano abecedo, ki ni Turingovo razpoznaven. Naj bo Σ poljubno dana končna abeceda. Simbole abecede Σ najprej poljubno oštevilčimo, nato pa vse besede w iz Σ leksikografsko uredimo v skladu z začetnim oštevilčenjem simbolov v abecedi Σ. Ker je besed dolžine k končno mnogo, to je Σ k, lahko vse besede nad abecedo Σ oštevilčimo z naravnimi števili: w = w i, kjer je i = ln(w) leksikografsko število besede w. Kot smo spoznali v razdelku 2.3.1, lahko Turingove stroje oštevilčimo z uporabo Gödelovih števil. Procesiranje i-tega Turingovega stroja M i lahko opišemo s karakterističnim vektorjem jezika, ki pove, katere besede ta Turingov stroj sprejme in katere ne. Vse te karakteristične vektorje po vrsticah zložimo v tabelo (glej tabelo 3.1). V i-ti vrstici najdemo karakteristični vektor jezika, ki pove, katere besede sprejme Turingov stroj M i. Če je M i = M Turingov stroj, ki sprejme prazen jezik, karakteristični vektor sestavljajo le vrednosti NE. Skonstruirajmo tedaj diagonalni jezik: L D = {w i w i / L(M i )}. 16..

M 1 M 2 Tabela 3.1: Tabela karakterističnih vektorjev. w 1 w 2 w 3 w 4.... M i DA DA NE DA... karakteristični vektor jezika L(M i ). M j NE NE NE NE... karakteristični vektor jezika L(M ) =. Izrek 9 Diagonalni jezik L D ni Turingovo razpoznaven. Dokaz: Predpostavimo, da je L D jezik nekega Turingovega stroja. Potem je L D = L(M i ) za neki i. Zato se ta jezik ujema s karakterističnim vektorjem jezika v i-ti vrstici v tabeli 3.1. Vendar: če se na i-tem diagonalnem mestu v i-ti vrstici najde DA, to je w i L(M i ), potem je w i / L D po definiciji diagonalnega jezika L D ; če pa je v i-ti vrstici NE, to je w i / L(M i ), potem je w i L D po definiciji diagonalnega jezika L D. Sledi, da veljata naslednji implikaciji w i L(M i ) w i / L D w i / L(M i ) w i L D. Ob predpostavki, da je L D = L(M i ), sledi, da sta implikaciji w i L D w i / L D w i / L D w i L D hkrati izpolnjeni. To pa je očitno protislovje. Za vsako izjavo A velja (A A) ( A A) 0. Zato je predpostavka L D = L(M i ) napačna. Diagonalni jezik tako ni Turingovo razpoznaven. V nadaljevanju se bomo posvetili pomembnemu vprašanju, kdaj je kak jezik, ki ga sprejme nek Turingov stroj, odločljiv in kdaj ne. 17

18

Poglavje 4 Odločljivost in neodločljivost jezikov Glede na izid procesiranja lahko Turingovo razpoznavne jezike nad dano abecedo Σ razdelimo bolj natančno. V tem poglavju izhajamo iz literature [2, 3, 4]. Poseben podrazred Turingovo razpozavnih jezikov tvorijo Turingovo odločljivi jeziki: to so jeziki, za katere obstaja tak Turingov stroj, ki ne glede na vhodno besedo vedno konča procesiranje bodisi v stanju q sprejmi, če je vhodna beseda vsebovana v jeziku Turingovega stroja, bodisi v stanju q zavrni, če vhodna beseda ni vsebovana. Pri Turingovih razpoznavnih jezikih, ki niso odločljivi, gre za jezike, ki jih prepozna neki Turingov stroj, vendar se pri vhodni besedi, ki ne pripada jeziku Turingovega stroja, procesiranje končna bodisi v stanju q zavrni bodisi ne obstane. To pomeni, da ni mogoče odločiti, ali vhodna beseda pripada jeziku ali ne: če stroj ne obstane, ne vemo, ali ne obstane, ker besede ni v jeziku Turingovega stroja, ali pa ne obstane, ker ni dovolj dolgo procesiral. Ali je razred Turingovo razpozavnih jezikov kar enak razredu Turingovo odločljivih jezikov? Z drugimi besedami, ali lahko za vsak jezik, ki ga razpozna neki Turingov stroj, oblikujemo tak Turingov stroj, ki se bo vedno ustavil in ki bo razpoznal prav ta jezik? Če je to res, bi to pomenilo, da je vsak jezik algoritmično razpoznaven. A to ni res. V nadaljevanju bomo spoznali, da obstajajo Turingovo razpoznavni, vendar neodločljivi jeziki. V ta namen si oglejmo izreka 10 in 11. Izrek 10 Če je jezik L nad dano abecedo Σ odločljiv, je njegov komplement L tudi odločljiv. Dokaz: Naj bo L Turingovo odločljiv jezik, to je, naj zanj obstaja tak Turingov stroj M L, da se procesiranje vhodne besede konča bodisi v stanju q sprejmi, če je vhodna beseda vsebovana v jeziku Turingovega stroja, bodisi v stanju q zavrni, če vhodna beseda ni vsebovana v jeziku Turingovega stroja. Za jezik L lahko sedaj konstruiramo Turingov stroj M L, ki najprej preda vhodno besedo w v procesiranje stroju M L ; končni izid procesiranja stroja M L pa je naslednji: za w L se M L ustavi v stanju q zavrni, za w / L pa v stanju q sprejmi. Ker se Turingov stroj M L vedno ustavi, se ustavi tudi M L, kar pomeni, da je jezik L odločljiv. Dokaz je shematično je prikazan na sliki 4.1. Izrek 11 Jezik L nad dano abecedo Σ je odločljiv natanko takrat, ko sta L in njegov komplement L Turingovo razpoznavna. Dokaz: Pokažimo v obe smeri. Naj bo jezik L odločljiv. Po izreku 10 je tudi L odločljiv. Ker je vsak Turingovo odločljiv jezik Turingovo razpoznaven, sta tudi L in L Turingovo 19

Slika 4.1: Če je jezik L odločljiv, je njegov komplement L tudi odločljiv. razpoznavna. Sedaj pa predpostavimo, da sta jezika L in L Turingovo razpoznavna. Potem obstajata Turingova stroja M L in M L, za katera velja, da je L = L(M L ) in L = L(M L ). Za jezik L oblikujmo Turingov stroj M z dvema trakovoma. Prvi trak je namenjen simulaciji Turingovega stroja M L, drugi pa M L. Turingov stroj M, ki je prikazan na sliki 4.2, deluje na naslednji način: 1. paralelno procesira vhodno besedo w na M L in M L (paralelno procesiranje pomeni, da Turingov stroj M sekvenčno izmenično simulira procesiranje M L in M L na vhodni besedi w); 2. če M L sprejme vhodno besedo, vrni sprejeto; če M L sprejme w, vrni zavrnjeno. Slika 4.2: Turingov stroj M. Pokažimo, da je jezik L odločljiv. Vsaka vhodna beseda w Σ je vsebovana bodisi v L bodisi v L, kar pomeni, da jo razpozna bodisi M L bodisi M L. Ker se Turingov stroj M ne glede na vhodno besedo vedno ustavi in sprejme jezik L, je jezik L odločljiv. Predno preidemo na opis jezika, ki je Turingovo razpoznaven, pa ni odločljiv, si oglejmo koncept univerzalnega Turingovega stroja. 20

Univerzalni Turingov stroj U je Turingov stroj z enim trakom nad abecedo Σ = {1} in tračno abecedo Γ = Σ { }, ki kot vhodni podatek dobi dva parametra in zmore simulirati poljuben Turingov stroj na poljubni vhodni besedi. Zaradi enostavnosti obravnave bomo namesto stroja U uporabili ekvivalenten Turingov stroj M U, ki pa ima tri trakove. Na prvi trak Turingov stroj M U dobi celotni vhodni podatek, iz katerega dekodira opis Turingovega stroja, ki ga bo simuliral. Nato je na drugem traku zapisana vhodna beseda za simulirani Turingov stroj. Tretji trak pa je namenjen procesiranju. Spomnimo se, da M i in w i zaporedoma označujeta i-ti Turingov stroj glede na Gödelovo števičenje oziroma i-to besedo nad dano abecedo Σ glede na leksikografsko ureditev. Naj n označuje besedo z n enicami, torej n = } 11 {{ 1 }. n Turingov stroj M U iz vhodne besede m n dekodira opis Turingovega stroja M m in vhodno besedo w n za Turingov stroj M m. Drugi del n prepiše na drugi trak, tretji trak pa je namenjen simuliranju procesiranja stroja M m. Stroj M U sekvenčno bere transformirano vhodno besedo n na drugem traku in simulira delovanje M m v skladu z zakodirano funkcijo prehoda med stanji stroja M m, ki jo razbere iz kode m na prvem traku. Sprememba stanja se zapiše na tretji trak. Izrek 12 pove, da obstajajo jeziki, ki so Turingovo razpoznavni, vendar neodločljivi. Izrek 12 Komplement L D = {w i w i L(M i )} diagonalnega jezika je Turingovo razpoznaven, vendar neodločljiv. Dokaz: Naj bo L D = {w i w i / L(M i )} diagonalni jezik iz izreka 9. Pokažimo, da je njegov komplement L D Turingovo razpoznaven. Natančneje, pokažimo, da univerzalni Turingov stroj sprejme jezik L D = {w i w i L(M i )}. Naj bo w i L D. Turingov stroj M U iz vhodnega podatka i i dekodira opis delovanja M i in nato simulira njegovo delovanje na vhodni besedi w i. Ker je w i L(M i ), se simuliranje ustavi v stanju q sprejmi, v skladu z delovanjem Turingovega stroja M i. Zato je L D Turingovo razpoznaven. Če bi bil L D odločljiv, bi bil po izreku 10 tudi L D odločljiv. Po izreku 9 jezik L D ni niti Turingovo razpoznaven! Protislovje dokazuje, da je L D Turingovo razpoznaven, vendar ni odločljiv. V naslednjem poglavju bomo s pomočjo odločljivih jezikov prešli na odločljive probleme. 21

22

Poglavje 5 Odločljivost in neodločljivost problemov V prejšnjem poglavju smo pokazali, da obstajajo jeziki, ki so Turingovo razpoznavni, vendar neodločljivi. Posvetimo se znamenitemu konceptu odločljivih oziroma neodločljivih problemov. Predmet obravnave bodo tako imenovani odločljivostni problemi, to so problemi, na katere lahko odgovorimo bodisi z da bodisi z ne. V celotnem poglavju sledimo literaturi [1, 3, 4, 12]. Problem je splošno vprašanje, ki se nanaša na vse mogoče konkretne primere; recimo, ali je poljubna gramatika dvoumna. Konkretna instanca tega problema pa je vprašanje, ali je dana kontekstno odvisna gramatika dvoumna. Vsako konkretno vprašanje iz danega splošnega problema lahko zakodiramo kot besedo nad abecedo Σ. Splošni problem torej ustreza nekemu jeziku nad abecedo Σ. Temu jeziku rečemo korespodenčni jezik problema. Če je korespodenčni jezik odločljiv, potem rečemo, da je problem odločljiv; drugače pa je neodločljiv. Z drugimi besedami: problem je algoritmično rešljiv, če je korespodenčni jezik problema algoritmično razpoznaven, to je Turingovo odločljiv. 5.1 Problem zaustavitve Turingovega stroja Posvetimo se najprej temeljnemu neodločljivemu problemu, ki se nanaša na Turingove stroje same, problemu zaustavitve Turingovega stroja. Zanima nas, ali je za vsak Turingov stroj nad dano abecedo Σ in poljubni vhodni podatek možno algoritmično ugotoviti, če se ta Turingov stroj ustavi. Zanima nas torej, ali obstaja algoritem (Turingov stroj, ki se vedno ustavi), ki razpozna korespodenčni jezik tega problema. Preden nadaljujemo, vpeljimo pojem Turingovo izračunljive funkcije. Funkcija f : N N je Turingovo izračunljiva, če jo je mogoče v končnem številu korakov izračunati na kakem Turingovem stroju M nad abecedo {1}, oziroma pri vhodni besedi n, ki predstavlja vrednost n, se M ustavi in vrne vrednost f(n), ki predstavlja vrednost f(n). Podobno definiramo Turingovo izračunljive funkcije večih spremenljivk. Izrek 13 Problem zaustavitve Turingovega stroja je neodločljiv. Dokaz: Predpostavimo, da nad abecedo Σ obstaja tak Turingov stroj H, ki zmore algoritmično preveriti, ali se vsak Turingov stroj M = M m, m = gn(m), na poljubni dani 23

vhodni besedi w Σ, w = w i, i = ln(w), ustavi ali ne. Tak Turingov stroj H bomo simulirali z univerzalnim Turingovim strojem H U, ki izračuna funkcijo h: N N N, dano s predpisom { 1; če se Turingov stroj M m ustavi na vhodni besedi w n, h(m, n) = 2; v vseh drugih primerih. To pomeni, da univerzalni Turingov stroj H U dobi kot vhodni podatek m n, na koncu pa na traku ostane 1, če se Turingov stroj M m ustavi na vhodni besedi w n in 2 v vseh drugih primerih. Obstoj takega Turingovega stroja pomeni natanko to, da je problem zaustavitve Turingovega stroja algoritmično rešljiv. Konstruirajmo še dva Turingova stroja D in F. Turingov stroj D nad abecedo Σ = {1} pri vhodni besedi j kot rezultat procesiranja vrne (podvojeno) besedo j j, zapisano na traku Turingovega stroja. Ena od možnih realizacij takšnega Turingovega stroja D je prikazana na sliki 5.1. Slika 5.1: Primer realizacije Turingovega stroja D. Turingov stroj F nad abecedo Σ = {1} pa deluje takole: pri vhodni besedi 1, se ne ustavi; pri vhodni besedi 2, se ustavi (ustavi se tudi pri vhodni besedi n za n > 2). Tak Turingov stroj F je predstavljen na sliki 5.2. Slika 5.2: Primer realizacije Turingovega stroja F. 24

Slika 5.3: Turingov stroj P. Iz Turingovih strojev H U, D in F sedaj lahko sestavimo Turingov stroj P, ki je prikazan na sliki 5.3. Kako torej deluje Turingov stroj P? Pri vhodni besedi j Turingov stroj D naprej podvoji vhodno besedo in pripravi vhodno besedo j j za Turingov stroj H U. Glede na dani rezultat stroja H U se nato Turingov stroj F bodisi ustavi bodisi ne, Turingov stroj P pa se tudi bodisi ne ustavi bodisi ustavi. Če povzamemo, Turingov stroj P pri vhodni besedi j deluje na naslednji način: če je H U vrnil rezultat 1, se stroj P ne ustavi; če je H U vrnil rezultat 2, se stroj P ustavi. Ker je P Turingov stroj, ga lahko zakodiramo in oštevilčimo. Naj bo P = M p, torej je njegova koda gn(p ) = p. Če Turingov stroj P poženemo pri vhodni besedi p, imamo dva možna izida: Če je h(p, p) = 1, se po definciji Turingov stroj P na vhodni besedi w p ustavi. To pomeni, da je H U vrnil rezultat 1. Vendar se zaradi delovanja stroja F Turingov stroj P ne ustavi. Protislovje. Če je h(p, p) = 2, se Turingov stroj P na vhodni besedi w p ne ustavi (ali pa zmrzne ). To pomeni, da je H U vrnil rezultat 2. Vendar se zaradi delovanja stroja F stroj P na vhodni besedi w p zagotovo ustavi. Protislovje. Turingov stroj P je očitno protisloven, zato ne obstaja. Ker obstajata Turingova stroja D in F, stroj P obstaja natanko tedaj, ko obstaja stroj H U. Ker stroj P ne obstaja, ne obstaja niti H U. To pomeni, da ne obstaja tak Turingov stroj, ki bi ugotovil, ali se poljuben Turingov stroj pri poljubni vhodni besedi ustavi ali ne. V nadaljevanju si bomo ogledali zanimiv neodločljiv problem, imenovan Postov korespodenčni problem. 25

26

Poglavje 6 Postov korespondenčni problem Pomemben naraven matematični problem je Postov korespodenčni problem, ki je povezan z manipulacijo besed nad dano abecedo. Ta problem je prvi opisal Emil L. Post leta 1946 in pokazal, da je neodločljiv [13]. Ta problem zaposluje zadnjih 60 let veliko raziskovalcev. Z različnimi metodami in strategijami iščejo rešitve za konkretne primere Postovega korespodenčnega problema, kljub temu, da je ta problem v splošnem neodločljiv. Postov korespondenčni problem najdemo v veliko učbenikih kot uvodni zgled neodločljivega problema. V tem poglavju se opiramo na literaturo [2, 3, 5, 13]. Postov korespodenčni problem: Za poljubno dana seznama x = [x 1, x 2, x 3,..., x n ] in y = [y 1, y 2, y 3,..., y n ] besed nad neko abecedo poišči tako zaporedje indeksov i 1, i 2,..., i k beseda x i1 x i2... x ik enaka besedi y i1 y i2... y ik. za neki k N, da bo Formulirajmo ta problem še drugače: dana je množica sklopov { [x1 ] [ ] [ ] } x2 xn M P KP =,,..., y 1 kjer vsak sklop sestavljata zgornja in spodnja beseda. Poiskati je potrebno tako zaporedje sklopov, da je celotna zgornja beseda enaka spodnji besedi. Rešitev je vsako zaporedje s to lastnostjo; tako zaporedje označimo z M P KP. Postov korespondenčni problem torej na kratko zapišemo P KP = { M P KP M P KP }. Oglejmo si dva konkretna zgleda. Zgled 5. Imamo dano množico sklopov { [ ] [ 1 111, 10111 ] [ 10, 10 ] 0 }. V tem konkretnem primeru je rešitev Postovega korespodenčnega problema podana z zaporedjem sklopov [ ] [ ] [ ] [ ] 10111 1 1 10, 10 111 111 0 y 2 y n saj je zgornja beseda 101111110 enaka spodnji besedi. 27

Zgled 6. Imamo dano množico sklopov { [ ] [ 10 101, 011 ] [ 11, 101 011] }. Najprej moramo določiti začetni sklop zaporedja. Sklopa [ ] [ 011 11 in 101 011] ne ustrezata, saj se razlikujeta že v prvem simbolu. V našem primeru se iskana rešitev začne le s sklopom [ 10 101]. V naslednjem koraku imamo tri možne izbire, ki tvorijo naslednje zgornje in spodnje besede: 1010 101101, 10011 10101 10111 in 101011. Lahko vidimo, da ustreza le tretja možnost, ki tvori besedi 10101 101011 in je sestavljena iz zaporedja sklopov [ ] [ 10 101 101 011]. Prva možnost se razlikuje v četrtem simbolu, druga možnost pa v tretjem simbolu. Potrebno je poudariti, da se po trenutni izbiri zaporedja sklopov zgornja in spodnja beseda razlikujeta po dolžini zgornja beseda je za en simbol krajša kot spodnja. 1010110 Ponovno imamo tri možne izbire sklopov: možnost, ki je sestavljena iz sklopov [ ] [ 10 101 ] [ 101 101 011 101011101, 10101011 10101111 011]. 10101101 in 101011011. Ustrezna je zadnja Pri naslednjem in nadaljnih korakih bi ponovno izbrali sklop [ 101 011], druge možnosti ne pridejo v poštev. To pomeni, da je za dano množico domnevna rešitev zaporedje sklopov [ 10 101 ] [ 101 011 ] [ 101 011 ] [ 101 011 ] [ 101 011 ]... Kot lahko vidimo, domnevna rešitev ni ustrezna, saj se besedi razlikujeta po številu znakov. Za dano množico { [ ] [ 10 101, 011 ] [ 11, 101 011] } torej rešitev ne obstaja. Definirajmo še tako imenovani omejeni Postov korespodenčni problem. 28

Omejeni Postov korespodenčni problem: [ To je Postov korespondenčni problem, kjer x se vsaka rešitev začne s prvim sklopom 1 y 1 ]. Množico sklopov, kjer že s samim zapisom nakažemo, da iščemo le take rešitve, označimo z { [x1 ] [ ] [ ] } M P x2 xk KP = ;,...,. y 1 y 2 y k S simbolom ; ustrezno označimo začetni sklop iskane rešitve. Omejeni Postov korespodenčni problem na kratko zapišemo P KP = { M P KP M P KP }. V dokazu, da je Postov korespodenčni problem neodločljiv, bomo potrebovali naslednji lemi. Lema 1 Če obstaja algoritem za Postov korespodenčni problem, potem obstaja tudi algoritem za omejeni Postov korespodenčni problem. Dokaz: Pokazati moramo, da lahko poljubnemu omejenemu Postovemu korespodenčnemu problemu priredimo tak Postov korespodenčni problem, da ima ta prirejeni Postov korespodenčni problem rešitev natanko takrat, ko ima rešitev tudi omejeni Postov korespodenčni problem. To naredimo takole. { [ ] [ ] [ ] } Naj bo M P KP = x 1 x y 1 ; 2 x y 2,..., k y k množica sklopov za omejeni Postov korespodenčni problem. Definirajmo množico sklopov za prirejeni Postov korespodenčni problem { [ ] [ ] [ ] [ ] } x1 x2 xk M P KP =,,...,,. y 1 y 2 y k Dodani sklop [ ] je v rešitvi vedno zadnji sklop, saj z njim uravnamo število znakov. Tu gre res za splošni Postov korespondenčni problem, saj se ne zahteva, da naj se iskana rešitev začne z začetnim oziroma prvim sklopom. Lahko pa[ uvidimo, ] da se rešitev za množico sklopov M P KP zagotovo začne s prvim sklopom, torej 1 x y 1, saj je to edini sklop, pri katerem se prvi črki zgornje in spodnje besede ne razlikujeta. [ ] [ ] [ ] x Naj bo i1 x i2 x y i1 y i2... il y il rešitev za omejeni Postov korespodenčni problem. Potem je ] [ xi1 y i1 ] [ xi2 y i2 ]... [ xil y il ] [ rešitev za prirejeni Postov korespodenčni problem, saj iz lastnosti x i1 x i2... x il = y i1 y i2... y il sledi x i1 x i2... x il = y i1 y i2... y il. Obratno je tudi očitno res: pri iskanju rešitve za prirejeni Postov korespodenčni problem ne zahtevamo, da se zaporedje sklopov začne s prvim sklopom; vendar pa, kot smo že omenili, se vsaka rešitev mora začeti s prvim sklopom kar pa je natanko omejeni Postov korespodenčni problem. S tem smo pokazali pretvorbo omejenega Postovega korespodenčnega problema na Postov korespodenčni problem. 29

Lema 2 Za vsak Turingov stroj M in vsako vhodno besedo w obstaja tak omejeni Postov korespondenčni problem P KP (M, w), da velja naslednje: w L(M) natanko takrat, ko obstaja rešitev za P KP (M, w). Dokaz: Prirejeni omejeni Postov korespodenčni problem P KP (M, w) konstruiramo preko zaporedja trenutnih opisov procesiranja Turingovega stroja M pri vhodni besedi w. Vsak sklop iz M P KP (M, w) je sestavljen tako, da zgornja beseda predstavlja trenutni opis stroja M, spodnja beseda pa naslednji trenutni opis procesiranja. V rešitvi nam zgornje in spodnje zaporedje besed opiše delovanje Turingovega stroja M pri procesiranju vhodne besede w. Naj bo M = (Q, Σ, Γ, δ, q 0, q sprejmi, q zavrni ) poljubno dani Turingov stroj. Konstruirajmo konkreteno rešitev M P KP (M, w) prirejenega problema P KP (M, w) z lastnostjo, da ima le-ta rešitev, če in samo če Turingov stroj M sprejme vhodno besedo w = w 1 w 2 w 3... w n. Sklopi za omejeni Postov korespodenčni problem, ki so lokalni opisi trenutnega procesiranja Turingovega stroja M, so naslednji (zaradi enostavnosti uporabimo krajšo oznako M P KP = M P KP (M, w)): 1. [ x 1 y 1 ] = [ # #q 0 w 1 w 2 w 3...w n ] M P KP ; 2. [ qa br ] M P KP za a, b Γ in q, r Q, kjer je q q zavrni in δ(q, a) = (r, b, R); 3. [ cqa rcb ] M P KP za a, b, c Γ in q, r Q, kjer je q q zavrni in δ(q, a) = (r, b, L); 4. [ a a] M P KP za a Γ; 5. 6. 7. [ # # ] M P KP in [ # # ] M P KP ; [ ] [ ] a qsprejmi q sprejmi M P KP in qsprejmi a q sprejmi M P KP [ qsprejmi ## # ] M P KP. za a Γ; Denimo, da je w L(M). Potem obstaja končno zaporedje trenutnih opisov procesiranja Turingovega stroja M #q 0 w 1 w 2 w n #............... #q sprejmi #. Pokažimo, da lahko to zaporedje razdelamo na zaporedje zaporednih parov (trenutno stanje, naslednje stanje), pri čemer je prvi par (#, začetno stanje). Za vsak tak par na naraven način priredimo sklop, ki ima eno izmed sedmih zgoraj naštetih oblik. Tako definirano zaporedje sklopov je natanko rešitev omejenega Postovega korespodenčnega problema P KP (M, w). Obratno, če tako zaporedje sklopov obstaja, potem zaporedje zgornjih besed predstavlja legitimno zaporedje trenutnih opisov procesiranja Turingovega stroja od začetnega do končnega stanja, ko M sprejme w. 30

Zgled 7. Za lažje razumevanje si oglejmo konkretni zgled. Naj bo M Turingov stroj nad abecedo Σ = {0, 1, 2}, pri čemer je abeceda traku Γ = Σ { }, funkcija prehodov med nekaterimi stanji pa je definirana na naslednji način: δ(q 0, 0) = (q 1, 1, R), δ(q 1, 1) = (q 2, 2, R), δ(q 2, 1) = δ(q 3, 2, L). Oglejmo si delno konstrukcijo rešitve Postovega korespodenčnega problema, če[ za vhodno ] besedo Turingovega stroja M vzamemo w = 0110. V M P KP po 1. točki dodamo #, saj #q 0 0110# je začetna konfiguracija q 0 0110. To pomeni, [ da v naslednjem koraku sledi prehod δ(q 0, 0) = (q 1, 1, R) in v M P KP dodamo sklop q0 0 1q 1 ]. Da dobimo ujemanje zgornje in spodnje besede po 4. in 5. točki, v množico M P KP dodamo še sklope Torej sta trenutni besedi [ ] 0, 0 [ ] 1, 1 [ 2 2 ] [ ], [ ] # # in #q 0 0110# #q 0 0110#1q 1 110#. [ ] #. # V naslednjem koraku procesiranja imamo trenutni opis #1q 1 110#, torej prehod δ(q 1, 1) = (q 2, 2, R). Podobno kot prej po 2. točki dodamo v M P KP sklop [ q1 1 2q 2 ]. Za popolno ujemanje zgornje in spodnje besede uporabimo še sklope iz 4. in 5. točke, torej #q 0 0110#1q 1 110# #q 0 0110#1q 1 110#12q 2 10#. Sledi, da v stanju q 2 stroj M prebere simbol 1, kar pomeni, da naredi prehod v stanje q 3, zapiše simbol 2 in premakne glavo v levo; δ(q 2, 1) = δ(q 3, 2, L). Po 3. točki, glede na prehod, dodamo naslednje sklope: [ ] [ ] [ ] 0q2 1 1q2 1 2q2 1,,, q 3 02 q 3 12 q 3 22 V našem primeru bomo uporabili sklop [ q2 1 q 3 2 ]. [ ] 2q2 1 q 3 22 in tako dobimo ujemanje #q 0 0110#1q 1 110#12q 2 10# #q 0 0110#1q 1 110#12q 2 10#1q 3 220#. Kot smo lahko opazili, je zgornja beseda vedno za en trenutni opis krajša kot spodnja. Ko Turingov stroj M preide v končno stanje q sprejmi, to popravimo. Zaključek procesiranja in iskanja ujemanja si oglejmo na konkretnem primeru # #02q sprejmi 11#. 31

[ ] [ ] a qsprejmi qsprejmi a Po 6. točki, za vsak simbol a Γ dodamo q sprejmi in q sprejmi v M P KP. V [ primeru ] # #02q sprejmi 11 to pomeni, da v naslednjem koraku procesiranja dodamo sklop qsprejmi 1 q sprejmi in za ustrezno ujemanje zapolnimo s sklopi iz 4., 5. in 6. točke. Trenutna konfiguracija procesiranja je torej #02q sprejmi 11# #02q sprejmi 11#02q sprejmi 1#. Na tak način korak za korakom v zgornji besedi dodamo en simbol več kot v spodnji. Tako procesiranje izvajamo toliko časa, da se v spodnji konfiguraciji zaporedje konča le s q sprejmi #: #02q sprejmi 11#02q sprejmi 1# # #02q sprejmi 11#02q sprejmi 1#02q sprejmi # #q sprejmi #. [ ] qsprejmi ## Za zaključek procesiranja po 7. točki dodamo sklop # in procesiranje zaključimo, oziroma najdemo ustrezno rešitev za omejeni Postov korespodenčni problem, #q sprejmi## #q sprejmi ##. Podrobneje smo spoznali, kako ob procesiranju Turingovega stroja M pri vhodni besedi w zgradimo konkreten primer rešitve za omejeni Postov korespodenčni problem. Po lemi 1 pa vemo: če najdemo rešitev za omejeni Postov korespodenčni problem, obstaja tudi rešitev za Postov korespodenčni problem. Izrek 14 Postov korespodenčni problem je neodločljiv. Dokaz: Trditev pokažemo tako, da kak znani neodločljivi problem prevedemo na Postov korespodenčni problem. Po lemi 2 problem zaustavitve Turingovega stroja prevedemo na omejeni Postov korespodenčni problem, le-tega pa po lemi 1 prevedemo na Postov korespodenčni problem. Če bi bil Postov korespodenčni problem odločljiv, bi bil odločljiv tudi omejeni Postov korespodenčni problem, s tem pa bi bil odločljiv tudi problem zaustavitve Turingovega stroja kar pa ni res, kot smo že spoznali v poglavju 5. Zato je tudi Postov korespodenčni problem neodločljiv. V posebnih primerih, ko je dolžina seznama omejena, pa je Postov korespodenčni problem odločljiv. Konkretno, ko sta sklopa samo dva, je Postov korespodenčni problem odločljiv. V primerih, ko imamo število sklopov med tri in šest, še vedno ni znano, ali je v teh primerih Postov korespodnčni problem odločljiv ali ne. Primeri, pri katerih iščemo rešitve za sedem ali več sklopov, pa so dokazano neodločljivi. V naslednjem poglavju bomo spoznali poseben neodločljiv problem, imenovan problem zaposlenega bobra. 32

Poglavje 7 Problem zaposlenega bobra Problem zaposlenega bobra (the Busy beaver problem) je neodločljiv problem, ki ga je prvi opisal Tibor Radó leta 1962 [14]. Gre za problem, v katerem se prepletajo teorija izračunljivosti, problem zaustavitve Turingovega stroja in teorija kompleksnosti. V tem poglavju izhajamo iz literature [14, 15, 16]. Problem se nanaša na deterministične Turingove stroje z n stanji in abecedo traku Γ = {, 1}, pri čemer je trak neomejen v levo in desno ter na začetku procesiranja prazen (torej brez vhodne besede). Namesto dveh končnih stanj q sprejmi in q zavrni obstaja eno samo končno stanje q ustavi. Take Turingove stroje bomo označili z oznako B(n). Problem zaposlenega bobra je poiskati tak Turingov stroj B(n), ki ob koncu procesiranja na trak zapiše kar največje število enic. Za bolj formalno definicijo vpeljemo funkcijo Σ: N N. Za dani Turingov stroj T B(n) naj bo Σ T (n) število enic, ki jih T ob koncu procesiranja zapiše na trak. Potem je Σ(n) = max T B(n) Σ T (n) največje število enic, ki jih je s takimi Turingovimi stroji mogoče zapisati. Funkciji Σ rečemo bobrova funkcija. Turingovemu stroju z n stanji, ki zapiše največje možno število enic na trak (zapisanih Σ(n) enic na traku), pravimo zaposleni bober. Zdaj lahko problem zaposlenega bobra definiramo formalno: Problem zaposlenega bobra: Za dani razred Turingovih strojev B(n) določi Σ(n). Pokazali bomo, da je ta problem neodločljiv. Z drugimi besedami: bobrova funkcija Σ ni Turingovo izračunljiva. Ob tem vpeljemo še funkcijo S : N N. Za dani T B(n) označimo s S T (n) število konfiguracij dokler T ne konča procesiranja v stanju q ustavi. Potem je S(n) = max T B(n) S T (n) največje število korakov, ki jih taki Turingovi stroji naredijo do konca procesiranja. Za lažje razumevanje si oglejmo naslednji zgled. Zgled 8. 33

Slika 7.1: Primer Turingovega stroja B(3), predstavljen z diagramom. Naj bo T Turingov stroj s tremi stanji, ki je grafično prikazan na sliki 7.1. Ta Turingov stroj se ustavi po 13-ih konfiguracijah, s šestimi zapisanimi enicami na traku. Prepričajmo se: /1,L q 0 q 0 11 /1,L /1,L q 1 111 1q 1 1111 1 /1,R 111q 1 11 1 /1,R 11111q 1 1 /1,L 111q 2 111 /1,R 1 /1,L /1,L 1 /1,R 1q 1 q 2 11 q 0 1111 11q 1 111 1 /1,R 1111q 1 1 /1,L 11111q 0 11 1 /1,R 1111q ustavi 11. Iz tega razberemo, da je Σ T (3) = 6 in S T (3) = 13. Rado in Lin sta dokazala [15], da obstaja tudi Turingov stroj T s tremi stanji, ki se ustavi po 21 korakih, s šestimi zapisanimi enicami; torej Σ T (3) = 6 in S T (3) = 21. Prav tako sta tudi dokazala, da je Σ(3) = 6, torej, da ni Turingovega stroja T B(3), ki bi na trak zapisal več kot šest enic. Pri danem n lahko obstaja več kot en sam zaposleni bober, kot smo videli pri zgornjem zgledu. Zaposlene bobre je težko najti zaradi dveh pomembnih razlogov: 1. Prostor iskanja je izredno velik saj imamo za Turingov stroj z n stanji (4(n + 1)) 2n različnih možnih Turingovih strojev. To vidimo takole: Iz vsakega stanja imamo 2 prehoda glede na to, ali v tem stanju beremo simbol ali 1. Odvisno od tega, ali se bralna/pisalna glava giblje levo ali desno in kaj zapiše, ali 1, imamo na vsakem prehodu 4 možne oznake: /, R /1, R /, L in /1, L. Vsak prehod vodi do n + 1 možnih stanj (vključno s stanjem q ustavi ). Vseh prehodov iz enega stanja je 4(n + 1)(n + 1), število stanj iz katerih vodijo prehodi pa n. Torej (4(n + 1) 2 ) n = (4(n + 1)) 2n. 2. Ni možno ugotoviti, ali se poljuben Turingov stroj ustavi. To je natanko problem zaustavitve Turingovega stroja, ki je neodločljiv. 34

Kljub temu, da je v splošnem problem zaposlenega bobra neodločljiv (kot bomo še pokazali), so raziskovalci do danes za dovolj majhne n-je ugotovili naslednje vrednosti za Σ(n) in S(n), prikazane v tabeli 7.1 [16]. Tabela 7.1: Vrednosti Σ(n) in S(n) za 1 n 6 [16]. n Σ(n) S(n) 1 1 1 2 4 6 3 6 21 4 13 107 5 4098 47176870 6 95524079 8690333381690951 Izrek 15 Bobrova funkcija Σ: N N ni Turingovo izračunljiva. Dokaz: Če za vsako Turingovo izračunljivo funkcijo f obstaja tak n f, da je Σ(n) > f(n) za n n f, potem funkcija Σ zagotovo ni Turingovo izračunljiva. To je očitno, saj bi v nasprotnem primeru obstajal tak n Σ, da je Σ(n) > Σ(n) za n > n Σ, kar pa je protislovje. Naj bo torej f poljubna Turingovo izračunljiva funkcija. Turingov stroj M f, ki izračuna funkcijo f, dobi vhodno besedo n enic (v obliki n), ob koncu procesiranja pa na trak dodatno zapiše f(n) enic, ki so od vhodne besede ločene s praznim simbolom. Definirajmo novo funkcijo F : N N s predpisom Funkcija F ima naslednje očitne lastnosti: F (x) = f(0) + f(1) + f(2) + + f(x) + 2x. je strogo naraščajoča: za x > y velja F (x) > F (y), F (x) 2x, F (x) f(x). Ker je funkcija f Turigovo izračunljiva, je prav tako izračunljiva tudi funkcija F. Podobno kot stroj M f, tudi Turingov stroj M F izračuna funkcijo F, dobi vhodno besedo x enic, ob koncu procesiranja pa na trak dodatno zapiše F (x) enic, ki se od vhodne besede ločene s praznim simbolom. Predpostavimo, da ima Turingov stroj M F natanko n stanj. Izberimo poljuben x N. Oblikujmo Turigov stroj M x, ki ima x stanj in na prazen trak zapiše x enic ter se postavi na konec. Skonstruirajmo sedaj Turingov stroj M(x) B(x+2n), ki ima x + 2n stanj in je sestavljen iz stroja M x in dveh strojev M F. Deluje takole: najprej na prazen trak s strojem M x zapiše x enic, ki jih nato stroj M F prebere in dodatno na trak zapiše F (x) enic. Nato Turingov stroj M F prebere na traku zapisanih F (x) in vrne kot rezultat F (F (x)) enic. Turingov stroj M(x) tako ob koncu procesiranja zapiše x+f (x)+f (F (x)) enic. 35

Po definiciji vsak Turingov stroj T B(x + 2n) zapiše na trak Σ T (x + 2n) enic. Iz definicije bobrove funkcije vemo, da je pri takih strojih s stanji x + 2n največje število zapisanih enic Σ(x + 2n), kar pomeni, da jih je vsaj toliko, kot jih je zapisal stroj M(x). Torej velja Σ(x + 2n) x + F (x) + F (F (x)) F (F (x)). Za x > 2n velja 2x > x + 2n > 0. Zaradi lastnosti funkcije F velja F (x) 2x. Torej je F (x) 2x > x + 2n za vse x > 2n in posledično F (F (x)) > F (x + 2n) f(x + 2n). S tem smo prišli do neenakosti Σ(x + 2n) > f(x + 2n), za x > 2n. To pomeni, da je funkcija Σ sčasoma večja od funkcije f. Ker pa je funkcija f neka poljubna izračunljiva funkcija, funkcija Σ ni Turingovo izračunljiva. Izrek 16 Funkcija S : N N ni Turingovo izračunljiva. Dokaz: Denimo, da obstaja Turingov stroj M z n stanji, ki ob koncu procesiranja na trak zapiše Σ(n) enic. To pomeni, da mora stroj M narediti najmanj Σ(n) korakov, da na trak zapiše Σ(n) enic; torej velja S(n) Σ(n). Ker pa vemo, da je funkcija Σ(n) sčasoma večja kot vsaka Turingovo izračunljiva funkcija, je taka tudi funkcija S(n). Torej funkcija S(n) prav tako ni Turingovo izračunljiva. V naslednjem poglavju bomo omenili Hilbertov 10. problem in ga preformulirali za naše potrebe. 36

Poglavje 8 Problem rešljivosti diofantskih enačb Na mednarodnem kongresov matematikov v Parizu leta 1900 je nemški matematik David Hilbert prestavil seznam 23 matematičnih problemov, ki so močno vplivali na nadaljnji razvoj matematike [17]. Do danes ti problemi še niso vsi rešeni. Hilbertov 10. problem se nanaša na diofantske enačbe. Diofantska enačba sprašuje po celoštevilskih rešitvah polinomov več spremenljivk s celimi koeficient. Oglejmo si originalno formulacijo tega problem. Izhajamo iz literature [3, 17]. Hilbertov 10. problem (originalna formulacija): Za poljubno diofantsko enačbo z več spremenljivkami poiskati proceduro, s katero je mogoče v končno mnogo korakih poiskati rešitev. V času, ko je David Hilbert formuliral ta problem, teorija jezikov in avtomatov še ni bila razvita. Hilbert je (napačno) tiho predpostavljal, da taka procedura obstaja, potrebno jo je zgolj poiskati. Kot bomo videli, pa take procedure ni. Za naše potrebe formulirajmo Hilbertov 10. problem takole: Hilbertov 10. problem (formalna formulacija): Naj bo P n množica vseh tistih polinomov iz kolobarja Z[x 0, x 1,..., x n ], ki imajo kako celoštevilsko ničlo (a 0, a 1,..., a n ) Z n : P n = {p Z[x 0, x 1,..., x n ] (a 0, a 1,..., a n ) Z n : p(a 0, a 1,... a n ) = 0}. Ali za vsak polinom p Z[x 0, x 1,..., x n ] obstaja algoritem, ki presodi, ali je p P n? Kot zgled si oglejmo polinome z eno spremenljivko. Denimo, da imamo Turingov stroj M, ki deluje na naslednji način: 1. vhod: koeficienti polinoma p P 1 ; 2. izračunaj vrednosti polinoma p pri 0, 1, 1, 2, 2, 3, 3,...; 3. če je vrednost polinoma enaka 0, sprejmi in ustavi. Opisani Turingov stroj najprej izračuna njegovo vrednost dobljenega polinoma pri številu 0. Če dobljena vrednost polinoma ni enaka nič, vrednost spremenljivke po absolutni vrednosti povečuje in ponovno računa vrednost polinoma. V primeru, da ima polinom p celoštevilsko ničlo, se Turingov stroj ustavi, saj bo prej ali slej prišel do vrednosti, pri kateri je vrednost 37

polinoma enaka nič. Problem se pojavi pri polinomu brez celoštevilske ničle: zgoraj opisani Turingov stroj se v tem primeru izvaja v nedogled in se ne ustavi. Kljub temu pa za ta problem obstaja Turingov stroj, ki se vedno ustavi, kar pomeni, da je ta problem odločljiv. Namreč, za polinome z eno spremenljivko je mogoče določiti interval c [ a 0, a 0 ], saj mora celoštevilska ničla deliti koeficient a 0. Ta interval zagotovo vsebuje vse možne celoštevilske ničle, če za ta polinom obstajajo. Turingov stroj M nadgradimo tako, da izračuna vrednosti polinoma pri 0, 1, 1, 2, 2,..., a 0, a 0. Za polinome z več spremenljivkam pa tega Turingovega stroja ni, kar je leta 1970 dokazal ruski matematik Jurij Matijasevič [18]. Zapišimo to še formalno: Izrek 17 Problem, ali ima poljubna diofantska enačba z več spremenljivkami celoštevilsko rešitev, je algoritmično neodločljiv [18]. 38

Poglavje 9 Spletna aplikacija 9.1 HTML, PHP in CSS 9.1.1 Hyper Text Markup Language Hyper Text Markup Language, krajše HTML, je označevalni jezik (k besedilu dodan dogovorjeni sistem označb, ki jih posamezni program zna interpretirati in generirati videz besedila), s katerim izdelamo spletno stran in predstavlja osnovo spletnega dokumenta. Ta dokument v spletnem brskalniku ne prikazuje le zgradbe, ampak tudi semantični pomen dokumenta. V tem razdelku izhajamo iz literature [19]. Običajno spletni dokument izdelamo kar v urejevalniku besedil, ki je zapisan v obliki HTML značk (v obliki parov lomljenih oklepajev), pri čemer prva značka označuje začetek, druga pa konec oblike. Te značke si lahko predstavljamo kot ukaze brskalniku, kaj in v kakšni obliki mora predstaviti vsebino. To seveda omogoča gnezdenje značk. Začetek HTML dokumenta označujemo z značko <html>, konec dokumenta pa </html>. Spodaj je prikazan enostaven zgled HTML kode. HTML koda <html> <body> Testiramo </body> </html> j e z i k HTML! Prikaz v brskalniku Testiramo jezik HTML! 9.1.2 PHP: Hypertext Preprocessor PHP: Hypertext Preprocessor, krajše PHP, je razširjen odprtokodni programski jezik, ki se uporablja za razvoj dinamičnih spletnih vsebin. Dinamične spletne strani omogočajo interakcijo z uporabnikom, česar statične strani ne omogočajo. Jezik PHP je sintaktično najbolj podoben programskemu jeziku C. Vsebuje vse gradnike in podatkovne strukture programskega jezika. PHP se primarno izvaja na spletnem strežniku, kjer strežnik dobi za vhod PHP kodo in generira izhod v obliki spletne strani. V celotnem razdelku sledimo literaturi [20, 21]. Spletno stran narejeno v HTML-ju lahko nadgradimo z vključitvijo programskega jezika PHP. Kaj to pomeni? Spletno stran lahko naredimo dinamično in interaktivno z elementi, 39

ki jih HTML sam ne omogoča. Taki elementi so omogočanje vnosa uporabnikovega besedila, preoblikovanje besedila, prenašanje datotek, kreiranje grafičnih elementov, programiranje in podobno... Vendar PHP samostojno ne more generirati spletne strani v obliki kot HTML, zato je pomembna prepletenost PHP-ja in HTML-ja. Spodaj je prikazan primer PHP kode in primer prepleta PHP in HTML kode. PHP koda <?php $niz = PHP koda! echo $niz ; f o r ( $ i = ( count ( $niz ) 1); $ i <= 0 ; $i ){ echo $niz [ i ] ; }?> Prikaz v brskalniku PHP koda!!aodk PHP Preplet PHP in HTML kode <?php $niz = PHP in HTML! ; echo $niz ; f o r ( $ i = ( count ( $niz ) 1); $ i <= 0 ; $i ){ echo $obrat.= $ [ n i z ] [ $ i ] ; }?> Prikaz v brskalniku PHP in HTML!!LMTH ni PHP <html> <body> <p> <?php echo </body> </html> $niz, $obrat?> </p> 9.1.3 Cascading Style Sheets Cascading Style Sheets, krajše CSS, so predloge, ki skrbijo za predstavitev spletnih strani. Z njimi preoblikujemo privzeti stil HTML elementov s pravili, kako naj se elementi prikažejo na spletni strani. HTML elementom lahko določamo velikost, pozicijo, poravnavo, odmike, barve, obliko pisave,... CSS prav tako omogoča oblikovanje predstavitve interaktivnih aktivnosti, ki jih izvaja uporabnik. Pri tem bomo uporabljali informacije iz literature [22]. Poleg uporabe različnih predstavitev za različne HTML elemente je CSS pomemben predvsem zaradi strukturiranja strani. S tem omogočimo večjo preglednost HTML elementov. HTML elemente oblikujemo na naslednji način: s e k t o r { l a s t n o s t 1 : vrednost1 ; l a s t n o s t 2 : vrednost2 ;... } 40

Sektor določa HTML element, na katerega se stilska pravila nanašajo. Na sektor vpliva tudi način, kako so elementi postavljeni drug na drugega oziroma gnezdeni med seboj. V dekleracijskem bloku je zapisana lastnost atributa in njena vrednost, ločena z dvopičjem. Lastnosti je potrebno ločiti z vrsticami. Oglejmo si primer uporabe CSS-ja v HTML kodi: HTML koda s CSS <s t y l e type= t e x t / c s s > p{ c o l o r : blue ; font weight : bold ; } </s t y l e > Prikaz v brskalniku Testiramo HTML s predlogo CSS! <html> <body> <p>testiramo HTML s </body> </html> predlogo CSS!</p> CSS predlog ni potrebno definirati znotraj HTML dokumenta, vendar jih lahko zapišemo v ločen dokument in jih nato v HTML dokumentu uporabimo. 9.2 Opis aplikacije Izdelana spletna aplikacija išče konkretne rešitve Postovega korespodenčnega problema. Ideja je preprosta: najprej se zgenerirajo vse permutacije vnešenih sklopov s ponavljanjem do predpisane zgornje meje, pri čemer vnešeni sklop nastopa vsaj enkrat. Nato pa se za vsako permutacijo preveri, ali kakšna izmed teh permutacij porodi rešitev. Uporabnik vnese množico sklopov. Poleg tega lahko omeji prostor potencialnih rešitev tako, da določi zgornjo mejo dolžine zaporedja sklopov. Če je vnešena zgornja meja manjša kot je število vnešenih sklopov ali pa zgornja meja ni vnešena, je privzeta zgornja meja enaka številu vnešenih sklopov. Nato uporabnik pritisne gumb za iskanje. Aplikacija na ekranu izpiše, ali ima vnešena množica sklopov rešitev v tej določeni dolžini ali ne. V primeru, da ima vnešena množica sklopov rešitev, se konkretna rešitev izpiše na ekran. Potrebno je poudariti, da se sklopi v rešitvi lahko ponavljajo. Pri iskanju rešitve spletna aplikacija razlikuje med malimi in velikimi črkami. 9.3 Navodila za uporabo 9.3.1 Splošna navodila Spletno aplikacijo najdemo na spletnem naslovu http://hrast.pef.uni-lj.si/~rogaclu/ index.php. Priporočena je uporaba brskalnika Google Chrome, ki ga je mogoče prenesti s spletne strani [23]. Ob odprtju povezave se prikaže začetna stran, kot prikazuje slika 9.1. 41

Slika 9.1: Začetna stran spletne aplikacije. V glavnem okviru imamo možnost dveh vnosnih polj. Pri prvem vnosu vnesemo množico sklopov na naslednji način: sklope ločimo med seboj po vrsticah, zgornjo in spodnjo besedo pa ločimo s presledkom. Torej, če hočemo vnesti množico sklopov M P KP = { [ ] 1, 111 [ 10111 10 ] [ ] } 10,, 0 jo vnesemo takole 1 111 10111 10 10 0. Drugo vnosno polje je namenjeno določitvi največje zgornje meje, kot je opisano v podpoglavju 9.2. V spodnjem delu okvirja najdemo gumb IŠČI, s katerim nato aplikacija začne iskati konkretno rešitev za vpisano množico sklopov in določeno zgornjo mejo. Na spletni strani lahko ob okviru zgoraj desno opazimo tudi gumb?, ki je namenjen predstavitvi osnovnih informacij o tej spletni aplikaciji. V primeru, ko aplikacija najde rešitev, kot prikazuje slika 9.2, se nam izpiše vnešeno množica sklopov, konkretno rešitev in permutacijo rešitve. Aplikacija nam preko gumba puščica dol omogoča lokalni prenos zapisa rešitve v obliki pdf. Če aplikacija ne najde rešitve za vnešeno množico, se izpiše, da ni rešitve. 42

Slika 9.2: Aplikacija najde rešitev. 9.3.2 Lokalna uporaba spletne aplikacije na operacijskem sistemu Windows Izdelana spletna aplikacija seveda zahteva dostop do spleta, vendar nam je lahko zaradi težav, na primer s strežnikom, ta dostop onemogočen. V tem razdelku bomo spoznali, kako lahko uporabimo aplikacijo na lokalnem računalniku. Za lokalno uporabo spletne aplikacije je potrebno namestiti program XAMPP, ki si ga lahko prenesemo s spletnega naslova [24]. Potrebno je izbrati pravilni namestitveni paket, ki pripada našemu operacijskemu sistemu. XAMPP namesti paket LAMP, ki označuje odprtokodno programsko opremo in skupaj tvorita popolnoma delujoč spletni strežnik. Običajno je potrebno ročno zagnati strežnik preko dolgega zaporedja ukazov, vendar to XAMPP naredi namesto nas. Zaženemo program XAMPP Control Panel in kliknemo tipko Start pri modulu strežnika Apache, kot prikazuje slika 9.3. Slika 9.3: Programsko okno programa XAMPP. 43

Spletne dokumente prenesemo v mapo htdocs, ki je v namestitveni mapi programa XAMPP. Nato odpremo brskalnik, vtipkamo spletni naslov localhost/ime_dokumenta.php in odpre se nam željena spletna stran. Ko zaključimo z uporabo spletne strani, zapremo brskalnik in v programu XAMPP Control Panel pri modulu Apache kliknemo tipko Stop ter zapremo program. 9.4 Koda Oglejmo si opis programske kode spletne aplikacije, ki je za lažje razumevanje prikazana na sliki 9.4. V tem razdelku izhajamo iz spletnega naslova [25]. Slika 9.4: Shematski prikaz programske kode. Spletna aplikacija je sestavljena iz treh glavnih funkcij: MnozicaSklopov, PotencialneResitve in PreveriPKP. V nadaljevanju jih bomo natančneje opisali. Uporabnik preko vnosne vrstice vnese množico sklopov in zgornjo mejo. Vnešeno množico sklopov nato kot parameter podamo funkciji MnozicaSklopov. Parameter si predstavljamo kot en dolg niz (s presledki), ki ga s funkcijo MnozicaSklopov razdelimo v dvodimenzionalno tabelo. PHP ima za tako razdelitev niza vgrajeno funkcijo explode. Med izvajanjem funkcija MnozicaSklopov sproti preverja, ali je katera od celic dvodimenzionalne tabele prazna. V primeru, da je katera od celic prazna (vnos ni bil pravilen), se iskanje konkretne rešitve Postovega korespodenčnega problema ustavi. Ko pripravimo množico sklopov za obdelavo, pride na vrsto rekurzivna funkcija PotencialneResitve. S to funkcijo generiramo vse permutacije s ponavljanjem do določene zgornje meje. Elementi permutacij so kar naravna števila od ena do števila sklopov. Te permutacije hranimo v enodimenzionalni tabeli, kjer vsebina celice predstavlja natanko eno permutacijo. Sedaj imamo pripravljeno množico sklopov in tabelo potrebnih permutacij. S funkcijo PreveriPKP za dano množico sklopov in vsako permutacijo preverimo, ali smo našli konkretno rešitev. Ob procesiranju posebej zapisujemo celotno zgornjo in spodnjo besedo, ki ju sestavljamo glede na permutacijo, in sicer simbol za simbolom. Simbol v permutaciji predstavlja zaporedni sklop v množici sklopov. 44