-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtor.tex
2063 lines (1884 loc) · 107 KB
/
tor.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\documentclass[10pt,a4paper,oneside]{book}
%Hello there. Don't know what to do?
%Search for the %? or \fixme and fix/add stuff.
%Check zapiski 2007, your notes and your memory and fix/add stuff
%kul knjige imajo quote na začetku poglavij
%
%lol, windows newline bug poje to vrsto na začetku včasih :P
%\documentclass[10pt,a4paper,oneside]{book}
\usepackage[slovene]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[fleqn]{amsmath}%fleqn - levo zamaknjene enačbe
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{makeidx}
\usepackage{graphicx}
\usepackage[x11names, rgb]{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,automata,snakes,arrows,shapes,decorations,positioning,shapes.arrows,chains,shadows}
%\usepackage{nag}
%poglej torstyle.sty
\usepackage{torstyle}
\hypersetup{pdftitle={Teoreticne osnove racunalnistva}}
\begin{document}
\begin{titlepage}
\begin{center}
\ \\[1cm]
{\Huge\bf Teoreti\v cne osnove ra\v cunalni\v stva}\\[1cm]
{\huge \today}\ \\[1.55cm]
%{\LARGE Zapiski predavanj 2010/2011}\\[15pt]%Odkar sem dodal kontekstno-odvisne in linearne, to ni več samo to :P
\begin{tikzpicture}[scale=1.35, very thick, circ/.style={thin}]%?tole ful upočasni pdflatex%, decorate, decoration={snake, amplitude=0.75pt}}]
\draw [rounded corners=10pt,fill=black!3] (-5.4cm,-5.4cm) rectangle (5.4cm,4.0cm);
\node at (4.5cm,3.3cm) {\Large $\mathcal{P}(\Sigma^*)$};%sva šla vprašat... ker \Sigma^* znajo že RJ opisat, samo ne vseh možnih ;)
%\draw[circ] (0cm,0cm) circle (5cm);
%\node at (0,4cm) {\large\bf \nameref{chap:Turingovi jeziki}};
\draw[circ,fill=white] (0cm,-0.8cm) circle (4cm);
\node at (0,2cm) {\large\bf \nameref{chap:Turingovi jeziki}};
%\node at (0,2cm) {\large\bf \nameref{chap:Kontekstno-odvisni jeziki}};
\draw[circ,fill=white] (0cm,-1.6cm) circle (3cm);
\node at (0,0cm) {\large\bf \nameref{chap:Kontekstno-neodvisni jeziki}};
\draw[circ,fill=white] (0cm,-2.4cm) circle (2cm);
\node at (0,-2cm) {\large\bf \nameref{chap:Regularni jeziki}};
%turingovi jeziki
\node (Lu) [fill=black,inner sep=1pt,shape=circle] at (-2.6cm,1.25cm) {};
\node at (Lu) [below=1pt] {$L_U$};
%neturingovi jeziki
\node (Ld) [fill=black,inner sep=1pt,shape=circle] at (2.5cm,3.3cm) {};
\node at (Ld) [below=1pt] {$L_d$};
\node (Lh) [fill=black,inner sep=1pt,shape=circle] at (4.5cm,1.5cm) {};
\node at (Lh) [below=1pt] {$L_h$};
\node (Lnu) [fill=black,inner sep=1pt,shape=circle] at (-4.6cm,-1.75cm) {};
\node at (Lnu) [below=1pt] {$L_{\overline{U}}$};
\node (Leq) [fill=black,inner sep=1pt,shape=circle] at (-3.0cm,-4.5cm) {};
\node at (Leq) [below=1pt] {$L_{eq}$};
\end{tikzpicture}
\vfill
\parbox{7.5cm}{
\begin{center}
\includegraphics[width=0.15\textwidth]{./by-nc-sa}\\[6pt]
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
\end{center}
}
\end{center}
\end{titlepage}
\tableofcontents
\pagebreak
%--------------------------------TOR1--------------------------------------
\include{poglavja/Uvod}
\include{poglavja/RegularniJeziki}
%\include{poglavja/LinearniJeziki}
\include{poglavja/KontekstnoNeodvisniJeziki}
%\include{poglavja/KontekstnoOdvisniJeziki}
%--------------------------------TOR2--------------------------------------
\chap{Turingovi jeziki}
\sect{Zgodovina}
%I've got 23 problems, but a bitch ain't one. -Hilbert, 1900
%\br
Leta 1900 je Nemški matematik David Hilbert objavil seznam triindvajsetih nerešenih problemov v matematiki. Eden izmed Hilbertovih problemov (deseti po vrsti), je vprašanje, ali obstaja postopek, po katerem ugotovimo rešljivost poljubne Diofantske enačbe -- torej, ali lahko ugotovimo, če ima polinom s celoštevilskimi koeficienti $P(x_1, x_2, \dots, x_n)=0$, celoštevilsko rešitev.
%?več zgodovine tu :)
Kljub temu, da je Emil Post že leta 1944 slutil, da je problem nerešljiv, je to dokončno dokazal rus Jurij Matijaševič šele leta 1970 v svojem doktorskem delu. Med reševanjem problema pa so se matematiki že prej začeli ukvarjati s formalizacijo pojma postopka oz. algoritma. Intuitivna definicija tega se glasi nekako tako:
\Def{Algoritem je zaporedje ukazov, s katerimi se v končnem številu korakov opravi neka naloga.}
Pri tem pa ostaja še kar nekaj vprašanj, npr.:
\begin{items}
\item Kakšni naj bodo ukazi?
\begin{items}
\item Osnovni - algoritem ima veliko korakov
\item Kompleksni - prezapleteni ukazi so že sami algoritmi
\end{items}
\item Koliko ukazov naj bo?
\begin{items}
\item Končno - ali je s končno množico res mogoče rešiti vsako nalogo?
\item Neskončno - kakšen izvajalec ukazov je sposoben izvršiti neskončno različnih ukazov?
\end{items}
\item So ukazi zvezni ali diskretni?
\item V kakšnem pomnilniku so ukazi shranjeni?
\begin{items}%?verjetno ista vprašanja kot pri št. ukazov?
\item Končnem - ali s končnim zaporedjem ukazov res lahko mogoče rešimo vsako nalogo?
\item Neskončnem - ali je to praktično uporaben model pomnilnika?
\end{items}
\end{items}
Nekateri zgodnji poskusi formalizacije pojma algoritma so:%? zgodovinsko zaporedje, letnice, imena modelov, moar info
\begin{items}
\item Rekurzivne funkcije (Kurt Gödel, Stephen Kleene)
\item Splošne rekurzivne funkcije (Jacques Herbrand, Kurt Gödel)
\item Algoritmi Markova (Andrey Markov, ml.) %sin Markova http://en.wikipedia.org/wiki/Andrey_Markov_(Soviet_mathematician)
\item Produkcijski sistem (Emil Post) %? je to http://en.wikipedia.org/wiki/Tag_system? 1943?
\item Lambda račun (Alonso Church, 1936)
\item Turingov stroj (Alan Turing, 1936)
\end{items}
\pagebreak
\sect{Turingovi stroji}
Turingov stroj se je uveljavil kot uporaben in preprost model računanja, ki zna izračunati vse kar se izračunati da (pod pogojem, da Church-Turingova teza drži). Alan Turing je svoj stroj izpeljal iz razmišljanja o tem, kako človek rešuje miselne probleme na papir. Pri tem je izbral tri sestavne dele:
\begin{items}
\item Nadzorno enoto (glava)
\item Čitalno okno (roka in vid)
\item Trak (papir)
\end{items}
V postopku formalizacije, pa je zaradi večje preprostosti, zahteval še, da je stroj sestavljen iz končno mnogo elementov, ter da deluje v diskretnih korakih.%?končno mnogo elementov? na kaj to cilja?
\ \\
\begin{center}
\begin{tikzturing}
\node [on chain=trak] {Trak};
\foreach \x in {1,2,...,5} {
\node [cell] {$A_{\x}$};
}
\node [cell] {\ ...\ \ };
\node (Ai) [cell, selected] {$A_i$};
\node [cell] {\ ...\ \ };
\node [cell] {$A_n$};
\node [cell] {\color{gray}$B$};
\node [cell] {\color{gray}$B$};
\node [cell] {\ ...\ \ };
\node [cell, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (110bp, 70bp) [head, minimum height=1.4cm, minimum width=3cm] {Nadzorna enota};
\draw (ne.south) -- (110bp, 25bp) -- (137.5bp, 25bp) [->] to (Ai.north);
\node [below] at (Ai.south) {Čitalno okno};
\end{tikzturing}
\end{center}
\Def{Turingov stroj je definiran kot sedmerka $M=\langle Q, \Sigma, \Gamma, \delta, q_0, B, F \rangle $, kjer je:
\begin{items}
\item $Q$ končna množica stanj
\item $\Sigma$ končna množica vhodnih simbolov, $Q \cap \Sigma = \emptyset$
\item $\Gamma$ končna množica tračnih simbolov, $\Sigma \subset \Gamma$
\item $\delta$ funkcija prehodov: $Q \times \Gamma \rightarrow Q \times \Gamma \times \{L,D\}$,\\ kjer $L$ in $D$ označujeta premik levo ali desno
\item $q_0$ začetno stanje, $q_0 \in Q$
\item $B$ prazen simbol, $B \in \Gamma$
\item $F$ množica končnih stanj, $F \subseteq Q$
\end{items}}
Stroj deluje tako, da v vsakem koraku opravi naslednje:
\begin{items}
\item preide v neko stanje
\item zapiše nov simbol v celico, ki je pod oknom
\item okno premakne eno celico levo ali desno
\end{items}
\subsect{Trenutni opis}
\Def{$TO = \Gamma^* \times Q \times \Gamma^*$ je množica vseh trenutnih opisov.\\
Nek trenutni opis $\langle \alpha_1, q, \alpha_2 \rangle$, ali krajše $\alpha_1\ q\ \alpha_2$ opisuje konfiguracijo Turingovega stroja.
\br
\begin{center}
\begin{tikzturing}
\node [cell, minimum width=3.6cm] {$\alpha_1$};
\node (Ai) [cell, selected] {};
\node [cell, minimum width=3cm] {$\alpha_2$\ \ \ };
\node [cell] {\color{gray}$B$};
\node [cell] {\color{gray}$B$};
\node [cell] {\ ...\ \ };
\node [cell, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (40bp, 60bp) [head] {$q$};
\draw (ne.south) -- (40bp, 25bp) -- (60.5bp, 25bp) [->] to (Ai.north);
%\node [below, minimum width=4cm] at (alpha1.south) {$\alpha_1$};
%\node [below, minimum width=4cm] at (alpha2.south) {$\alpha_2$\ \ \ \ };
\end{tikzturing}
\end{center}
\br
Čitalno okno je nad prvim znakom niza $\alpha_2$, iz tega lahko razberemo:
\begin{items}
\item če je $\alpha_1 = \varepsilon$, je okno skrajno levo
\item če je $\alpha_2 = \varepsilon$, je okno nad $B$ in so naprej sami $B$-ji
\end{items}}
\subsect{Relacija $\vdash$}
\Def{Če sta $u,v$ trenutna opisa iz množice $TO$, ter $v$ neposredno sledi iz $u$ v enem koraku Turingovega stroja, tedaj pišemo $u \vdash v$.
\br
Naj bo $x_1 \dots x_{i-1}\ q\ x_i \dots x_n$ trenutni opis:
\begin{items}
\item če je $\delta(q,x_i) = \langle p,Y,D \rangle$:\\
$x_1 \dots x_{i-1}\ q\ x_i \dots x_n \vdash x_1 \dots x_{i-1}\ Y\ p\ x_{i+1} \dots x_n$
\item če je $\delta(q,x_i) = \langle p,Y,L \rangle$:
\begin{items}
\item če je okno na robu ($i=1$), se Turingov stroj ustavi, ker je trak na levi omejen.
\item če okno ni na robu ($i>1$), potem: $x_1 \dots x_{i-2} x_{i-1}\ q\ x_i \dots x_n \vdash x_1 \dots\ x_{i-2} p\ x_{i-1}\ Y\ x_{i+1} \dots x_n$
\end{items}
\end{items}}
Imamo pa tudi posplošeno relacijo $u \vdash^* v$, ki pove, da trenutni opis $v$ sledi iz $u$ v enem ali večih korakih.
\Def{$u \vdash^* v$, če obstaja tako zaporedje $x_i, (i \in [0, 1, \dots, k], k \geq 0)$, da velja $u=x_0, v=x_k$ in $x_0 \vdash x_1 \wedge x_1 \vdash x_2 \wedge \dots \wedge x_{k-1} \vdash x_k$
\br
Torej, trenutni opis $v$ sledi iz $u$, v $k$ korakih Turingovega stroja.}
\sect{Jezik Turingovega stroja}
\Def{Jezik Turingovega stroja je:
\begin{equation*}
L(M) = \{ w\ |\ w \in \Sigma^* \wedge \varepsilon\ q_0\ w \vdash^*\alpha_1\ q_F\ \alpha_2 \wedge \alpha_1,\alpha_2 \in \Gamma^*, q_F \in F \}
\end{equation*}
}
Z besedami to pomeni, da je jezik Turingovega stroja množica besed, ki če jih damo na vhod stroja, povzročijo, da se ta v končno mnogo korakih znajde v končnem stanju.
\ \\
\begin{center}
\begin{tikzturing}
\node (Ai) [cell, selected] {};
\node [cell, minimum width=4cm] {$w$\ \ \ \ \ };
\node [cell] {\color{gray}$B$};
\node [cell] {\color{gray}$B$};
\node [cell] {\ ...\ \ };
\node [cell, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (90bp, 60bp) [head] {$q_0$};
\draw (ne.south) -- (90bp, 25bp) -- (0bp, 25bp) [->] to (Ai.north);
\end{tikzturing}
\br
Začetna konfiguracija Turingovega stroja.
\end{center}
\Def{Jezik $L$ je Turingov jezik, če obstaja Turingov stroj $M$, tak, da je $L = L(M)$.}
\subsect{Ugotavljanje pripadnosti besed Turingovemu jeziku}
Pri vprašanju ali je neka beseda v jeziku, Turingove jezike ločimo na:
\begin{items}
\item Odločljive - obstaja algoritem, s katerim se lahko za poljubno besedo odločimo, ali pripada jeziku.
\item Neodločljive - v splošnem ni algoritma, ki bi za poljubno vhodno besedo z DA ali NE odgovoril na vprašanje pripadnosti.
\begin{items}
\item če je odgovor DA, to ugotovimo v nekem končnem številu korakov.
\item če je odgovor NE, pa ni nujno, da se bo stroj kdaj ustavil.
\end{items}
\end{items}
%?\fixme - vennov diagram beseda w znotraj L kroga... pomojm ne rabmo :P
%?where does this go?
%Terminologija: re (recursively enumerable, Turing recognizable)%?semi-decidable?
%Rekurzivni jezik (decidable)%?where does this go?
\fixme - vennov diagram odločljivi jeziki znotraj Turingovih?
\Primer{Zapiši Turingov stroj, ki sprejema jezik $L=\{0^n 1^n | n \geq 1\}$\\
Skica izvajanja stroja:
\begin{items}
\item $0^{n}1^{n}$ - vhodna beseda
\item $X0^{n-1}1^{n}$ - zamenjamo najbolj levo $0$ z $X$
\item $X0^{n-1}Y1^{n-1}$ - premaknemo okno desno do najbolj leve $1$ in jo zamenjamo z $Y$
\item $XX0^{n-2}Y1^{n-1}$\\
$XX0^{n-2}YY1^{n-2}$ - ponovimo in vidimo, da bomo niz sprejeli, če je prave oblike.
\end{items}
Turingov stroj zapišemo kot $M=\langle Q,\Sigma,\Gamma,\delta,q_0,B,F \rangle$:
\begin{items}
\item $Q=\{ q_0,q_1,q_2,q_3,q_4 \}$
\item $\Sigma = \{ 0,1 \}$
\item $\Gamma = \{ 0,1,B,X,Y \}$
\item $F = \{ q_4 \}$
\item $\delta$ bomo definirali s tabelo
\end{items}
Pomen stanj:
\begin{items}
\item $q_0$ - začetno stanje in stanje pred zamenjavo 0 z X
\item $q_1$ - premikanje desno do 1
\item $q_2$ - zamenjava 1 z Y in premikanje levo do X
\item $q_3$ - najde X in se premik desno
\item $q_4$ - končno stanje
\end{items}
Tabela prehajanja stanj:\\
\begin{center}
\begin{tabular}{ c | c c c c c}
& 0 & 1 & X & Y & B\\ \hline
$q_0$& $\langle q_1,X,D\rangle$ & -- & -- & $\langle q_3,Y,D\rangle$ & --\\
$q_1$& $\langle q_1,0,D\rangle$ & $\langle q_2,Y,L\rangle$ & -- & $\langle q_1,Y,D\rangle$ & --\\
$q_2$& $\langle q_2,0,D\rangle$ & -- & $\langle q_0,X,D\rangle$ & $\langle q_2,Y,L\rangle$ & --\\
$q_3$& -- & -- & -- & $\langle q_3,Y,D\rangle$ & $\langle q_4,B,D\rangle$\\
$q_4$& -- & -- & -- & -- & --\\
\end{tabular}
\end{center}
\br
Izvajanje stroja s trenutnimi opisi:
\[ q_0 0011 \vdash X q_1 011 \vdash X 0 q_1 11 \vdash X q_2 0 Y 1 \vdash \dots \]
}
%?zapiski 2007 imajo tu še nekaj o turingovih jezikih
\subsect{Turingov stroj kot računalnik funkcij}
Imamo Turingov stroj, ki ima na traku neko število ničel, ki predstavljajo pozitivna naravna števila, ločena z enicami:
% \[ 0^{i_1} 1 0^{i_2} 1 \dots 1 0^{i_k} \]
%?skupine ničel so i_1, i_2, ..., kjer so i naravna števila (mjbi i+1 ničel)
\ \\
\begin{center}
\begin{tikzturing}
\node (Ai) [cell, selected] {};
\node [cell, minimum width=2cm] {$0^{i_1}$\ \ \ };
\node [cell] {$1$};
\node [cell, minimum width=1.4cm] {$0^{i_2}$};
\node [cell] {$1$};
\node [cell] {\ ...\ \ };
\node [cell] {$1$};
\node [cell, minimum width=2.6cm] {$0^{i_k}$\ \ \ \ };
\node [cell] {\color{gray}$B$};
\node [cell] {\color{gray}$B$};
\node [cell] {\ ...\ \ };
\node [cell, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (70bp, 60bp) [draw, minimum width=2cm, minimum height=1.2cm] {$q_0$};
\draw (ne.south) -- (70bp, 25bp) -- (0bp, 25bp) [->] to (Ai.north);
\end{tikzturing}
\end{center}
Recimo, da se stroj po nekem številu korakov ustavi in ima na traku skupino ničel $0^m$, na levi in desni strani skupine pa same $B$-je. S tem je stroj morda izračunal neko funkcijo:
\[ f^{(k)}:\mathbb{N}_+^k \rightarrow \mathbb{N}_+ \mbox{\ \ oz. \ \ } f(i_1, i_2, \dots, i_k) = m \]
%?\fixme - slika TS s skupino ničel na traku\br... pomojm ne rabmo :P
Funkcija $f$ ni nujno definirana za vsako $k$-terico iz $\mathbb{N}_+^k$, torej je parcialna funkcija, kadar pa je definirana povsod, pravimo da je totalna. Stroj se pri nedefiniranih $k$-tericah pač na neki točki ustavi in pri tem na traku ne pusti le ene skupine ničel, ali pa se sploh ne ustavi.
Isti turingov stroj hkrati računa več funkcij: $f^{(1)}, f^{(2)}, \dots f^{(k)}$.%?računa ali "lahko računa".. ne štekam ubistvu čist
\subsubsection{Parcialna rekurzivna funkcija}
\Def{Vsaka funkcija $f^{(k)}:\mathbb{N}_+^k \rightarrow \mathbb{N}$, ki jo lahko izračuna nek Turingov stroj, je parcialna rekurzivna funkcija. Če je $f^{(k)}$ definirana za vse $k$-terice, jo imenujemo totalna rekurzivna funkcija (včasih samo rekurzivna funkcija)}
Vse običajne aritmetične funkcije so parcialne ali celo totalne rekurzivne funkcije. V primerih si bomo pogledali nekaj primerov, tu pa jih nekaj naštejmo: $m+n,\ m*n,\ n!,\ 2^n,\ \lceil \log(n) \rceil,\ m^n,\ \dots$.
%so najdl primer, ki ne spada sem z diagonalizacijo
%na začetku so gledali totalne... pa so vidl da morajo parcialne
\begin{primeri}
\item
Ali je $f(m,n)=m+n$ (parcialno) rekurzivna?\\
Skica stroja, ki računa $m+n$:
\begin{items}
\item $0^m 1 0^m$ - vhodna beseda
\item $B0^{m-1} 1 0^m$ - izbriši prvo ničlo
\item $B0^{m+n}$ - premakni se do 1 in jo zamenjaj z 0
\end{items}%?DN naredi cel stroj
\item
Ali je $f(m,n)=m*n$ (parcialno) rekurzivna?\\
Skica stroja, ki računa $m*n$:
\begin{items}
\item $0^m 1 0^n$ - vhodna beseda
\item $0^m 1 0^n 1$ - premakni se na konec in zapiši 1 (ločnica za rezultat)
\item $B 0^{m-1} 1 0^n 1$ - premakni se na začetek in izbriši 0
\item $B 0^{m-1} 1 0^m 1 0^n$ - prekopiraj $n$ ničel za ločnico (in ničle)
\item $B^{m} 1 0^m 1 0^{m*n}$ - ponavljaj tadva koraka, dokler ni več ničel pred prvo 1
\item $B^{m+n+2}0^{m*n}$ - izbriši del, ki ne spada v rezultat
\end{items}%?naredi cel stroj
\end{primeri}
\sect{Razširitve Turingovega stroja}
V tem odseku bomo spoznali nekaj razširitev Turingovega stroja in pokazali da so enako močne kot osnovni model. Poleg tega bomo naredili še pregled alternativnih modelov, za katere se je tudi izkazalo, da so enako močni.%, nato pa si bomo ogledali še nekaj stvari, ki jih Turingov stroj kljub vsemu ne more izračunati.
\Odmakni{Postopek dokazovanja}{Recimo, da je $\mathcal{M}$ razred modelov, za katerega želimo dokazati, da je ekvivalenten razredu Turingovih strojev. Poiskati moramo sistematičen, končen postopek S, ki poljubnemu stroju $M \in \mathcal{M}$ priredi nek Turingov stroj $M'$, ki je sposoben simulirati $M$.
\begin{center}
\begin{tikzpicture}[vert/.style={circle, draw,fill=black, inner sep=1pt}]
\node (l) [vert] at (0.1cm, 0.2cm) {};
\node [below=2pt] at (l.south) {$M$};
\node (r) [vert] at (4.6cm, 0.8cm) {};
\node [below=2pt] at (r.south){$M'$};
\draw (0cm,0cm) ellipse (1.3cm and 1.1cm) node(le) {};
\node at (le) [below=1.2cm] {$\mathcal{M}$};
\draw (4.5cm,0.2cm) ellipse (1.4cm and 1.0cm) node(re) {};
\node at (re) [below=1.1cm] {TS};
\draw [bend left, ->] (l) to node[auto] {S} (r);
\end{tikzpicture}
\end{center}}
\subsect{Nadzorna enota kot pomnilnik}
Vsako stanje stroja je sestavljeno iz dveh delov -- stanja avtomata in shrambe za tračne znake. Novo množico stanj zapišemo kot $Q=K\times\Gamma$, kjer je $K$ stara množica stanj in $\Gamma$ tračna abeceda.
\Primer{Sestavi Turingov stroj za razpoznavanje besed, pri katerih se prvi znak ne ponovi:\\
Stroj $M=\langle Q,\Sigma,\Gamma,\delta,q_0,B,F \rangle$ zapišemo kot:
\begin{items}
\item $M=\langle Q, \{0,1\}, \{0,1,B\}, \delta, \langle q_0, B \rangle, B, F \rangle$
\item $Q=\{ q_0, q_1 \} \times \{0,1,B\} = \{ \langle q_0, 0\rangle , \langle q_0, 1\rangle , \langle q_0, B\rangle , \langle q_1, 0\rangle , \langle q_1, 1\rangle , \langle q_1, B\rangle\} $
\item $F=\{ \langle q_1, B \rangle \}$
\item $\delta$ zapišemo kot:
\begin{items}
\item Shrani prvi znak besede v stanje stroja:\\
$\delta(\langle q_0, B\rangle, 0) = \langle\langle q_1, 0 \rangle, 0, D\rangle$\\
$\delta(\langle q_0, B\rangle, 1) = \langle\langle q_1, 1 \rangle, 1, D\rangle$
\item Premakni okno v desno do prvega znaka, enakega shranjenemu:\\
$\delta(\langle q_1, 0\rangle, 1) = \langle\langle q_1, 0 \rangle, 1, D\rangle$\\
$\delta(\langle q_1, 1\rangle, 0) = \langle\langle q_1, 1 \rangle, 0, D\rangle$
\item Če prebereš $B$, pojdi v končno stanje:\\
$\delta(\langle q_1, 0\rangle, B) = \langle\langle q_1, B \rangle, karkoli \rangle$\\
$\delta(\langle q_1, 1\rangle, B) = \langle\langle q_1, B \rangle, karkoli \rangle$
\item Sicer se ustavi. To dosežemo tako, da ne definiramo prehodov:\\
$\delta(\langle q_1, 0\rangle, 0)$ in $\delta(\langle q_1, 1\rangle, 1)$
\end{items}
\end{items}
}
\subsect{Večsledni trak}
Na traku imamo več kot eno sled, kar pomeni, da s traku beremo $k$-terice tračnih znakov, kar zapišemo kot: $\Gamma=\Gamma_1\times\Gamma_2\times\dots\times\Gamma_k$.
\ \\
\begin{center}
\begin{tikzturing}
\node (Ai) [cell1, selected] {$A1_{0}$};
\node at (0bp,-0.6cm) [cell2, selected] {$A2_{0}$};
\node at (0bp,-1.2cm) [cell3, selected] {$A3_{0}$};
\foreach \x in {1,2,3} {
\node [cell1] {$A1_{\x}$};
\node [cell2] {$A2_{\x}$};
\node [cell3] {$A3_{\x}$};
}
\node [cell1] {\ ...\ \ };
\node [cell2] {\ ...\ \ };
\node [cell3] {\ ...\ \ };
\node [cell1, end] {};
\node [cell2, end] {};
\node [cell3, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (40bp, 60bp) [draw, minimum width=2cm, minimum height=1.2cm] {$q_0$};
\draw (ne.south) -- (40bp, 25bp) -- (0bp, 25bp) [->] to (Ai.north);
\end{tikzturing}
\end{center}
\Primer{Sestavi Turingov stroj, ki preveri, ali je vhodno število praštevilo.\\
Skica stroja:
\begin{items}
\item Trak ima tri sledi:
\begin{items}
\item na prvi sledi je vhodno število
\item na drugi sledi je števec, ki na začetku hrani število 2
\item tretjo sled uporabimo za delovno sled, na začetku je lahko prazna.
\end{items}
\item Stroj deluje tako:
\begin{items}
\item prepiši število s prve sledi na tretjo sled
\item odštevaj število iz druge sledi od števila na tretji sledi
\item če se odštevanje konča z 0, se ustavi (ni praštevilo)
\item sicer število na drugi sledi povečaj za 1
\item če je število na drugi sledi enako tistemu na prvi, sprejmemo (je praštevilo)
\item sicer, ponovimo postopek
\end{items}
\end{items}
}
\subsect{Prestavljanje vsebine traku}
Recimo, da bi s traku radi vzeli nekaj zaporednih znakov tako, kot da bi jih izrezali iz traku in nato trak zlepili nazaj skupaj, izrezane simbole pa bi si pri tem seveda radi nekako zapomnili. Tudi to metodo realiziramo s pomočjo shrambe za tračne simbole v nadzorni enoti, a moramo pri tem paziti, da je funkcija prehodov pravilno napisana.
\br\fixme slika "gube" na traku in slika nadzorne enote
\Primer{Sestavi Turingov stroj, ki premakne vsebino traku za 2 celici v desno.\\
Skica stroja:
\begin{items}
\item $Q$ vsebuje stanja oblike: $\langle q, A_1, A_2 \rangle;\ q \in \{ q_1, q_2 \},\ A_1, A_2 \in \Gamma$
\item $\Gamma$ poleg ostalih znakov, vsebuje še poseben znak $X$, ki označuje izpraznjeno celico na traku
\item $F=\{ q_2 \}$
\item $\delta$ zapišemo kot:
\begin{items}
\item Prva koraka -- zapomni si in izprazni prvi in drugi znak:\\
$\delta(\langle q_1, B, B\rangle, A_1) = \langle\langle q_1, B, A_1 \rangle, X, D \rangle $\\
$\delta(\langle q_1, B, A_1\rangle, A_2) = \langle\langle q_1, A_1, A_2 \rangle, X, D \rangle $
\item Zapomni si nov znak in prvega iz shrambe zapiši na trak:\\
$\delta(\langle q_1, A_i, A_{i+1}\rangle, A_{i+2}) = \langle\langle q_1, A_{i+1}, A_{i+2} \rangle, A_i, D \rangle $
\item Zadnja koraka -- zapiši vsebino shrambe na trak:\\
$\delta(\langle q_1, A_{n-1}, A_{n}\rangle, B) = \langle\langle q_1, A_{n}, B \rangle, A_{n-1}, D \rangle $\\
$\delta(\langle q_1, A_{n}, B\rangle, B) = \langle\langle q_2, B, B \rangle, A_{n}, L \rangle $
\end{items}
\end{items}
}
%?\fixme ... tu je razlagal tisto neizračunljivo funkcijo nad matrikami. btw, @zidar: poglej tor2-dodatno.pdf - tam govori o preroku
\subsect{Podprogrami}
\fixme
%?Imamo neka posebna stanja, ki signalizirajo vhod in izhod iz podprograma%?je tu govoril o dveh strojih?
\subsect{Turingov stroj z dvosmernim trakom}
Imamo Turingov stroj, ki ima trak neomejen v obe smeri. Vhodna beseda je na začetku napisana nekje na traku, okno pa je na prvem znaku besede.
%kako zbrišem črto pri prvem ...?
\begin{center}
\begin{tikzturing}
\node [cell] {\ ...\ \ };
\node [cell] {\color{gray}$B$};
\node [cell] {\color{gray}$B$};
\node (Ai) [cell, selected] {};
\node [cell, minimum width=4cm] {$w$\ \ \ \ \ };
\node [cell] {\color{gray}$B$};
\node [cell] {\color{gray}$B$};
\node [cell] {\ ...\ \ };
\node [cell, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (95bp, 60bp) [draw, minimum width=2cm, minimum height=1.2cm] {$q_0$};
\draw (ne.south) -- (95bp, 25bp) -- (53.5bp, 25bp) [->] to (Ai.north);
\end{tikzturing}
\end{center}
\ \\
Stroj je definiran skoraj enako kot osnovni Turingov stroj, le funkcija prehodov $\delta$ je enostavnejša, saj ni treba skrbeti, kaj se zgodi, če zadanemo levi rob, kot pri običajnem Turingovemu stroju.
\br
\Trditev{Turingov stroj z dvosmernim trakom ni šibkejši od osnovnega Turingovega stroja.}
\Dokaz{Stroj se lahko vede kot da je omejen na levi. Na začetku izvajanja se premaknemo levo, zapišemo poseben znak, ki nam pomeni konec traku. Nato se premaknemo desno in stroj normalno izvajamo.}%to smo delali tudi na vajah - check it
\ \\
\Trditev{Turingov stroj z dvosmernim trakom ni močnejši od osnovnega.}
\Dokaz{Imamo Turingov stroj $M$ z dvosmernim trakom:
\ \\
%kako zbrišem črto pri prvem ...?
\begin{center}
\begin{tikzturing}
\node [cell] {\ ...\ \ };
\foreach \x in {-3,-2,-1} { \node [cell] {$A_{\x}$}; }
\node (Ai) [cell, selected] {$A_{0}$};
\foreach \x in {1,2,3} { \node [cell] {$A_{\x}$}; }
\node [cell] {\ ...\ \ };
\node [cell, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (70bp, 60bp) [draw, minimum width=2cm, minimum height=1.2cm] {$q_0$};
\draw (ne.south) -- (70bp, 25bp) -- (95bp, 25bp) [->] to (Ai.north);
\end{tikzturing}
\end{center}
\ \\
Stroju $M$ priredimo dvosledni Turingov stroj $M'$. Zgornja sled nam bo predstavljala celice od $A_0$ naprej, spodnja pa vse tiste, levo od $A_0$:
\ \\
\begin{center}
\begin{tikzturing}
\node (Ai) [cell1, selected] {$A_{0}$};
\node at (0bp,-0.6cm) [cell2, selected] {\#};
\foreach \x in {1,2,3} {
\node [cell1] {$A_{\x}$};
\node [cell2] {$A_{-\x}$};
}
\node [cell1] {\ ...\ \ };
\node [cell2] {\ ...\ \ };
\node [cell1, end] {};
\node [cell2, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (40bp, 60bp) [draw, minimum width=2cm, minimum height=1.2cm] {$q_0$};
\draw (ne.south) -- (40bp, 25bp) -- (0bp, 25bp) [->] to (Ai.north);
\end{tikzturing}
\end{center}
Stroj $M'$ deluje tako:
\begin{items}
\item naenkrat dela le z eno sledjo
\item ko na drugi sledi vidi \#, zamenja aktivno sled
\item na zgornji sledi dela enako kot $M$
\item na spodnji se obrne smer premikanja
\end{items}
%(tu smo pomojem napisali še 2x isto)
%Formalizacija... ne bomo delal
%Sklep.. sta ekvivalentna - kar izračuna dvosmerni, lahko tudi osnovni.
%Izrek: Za jezik L obstaja TS z dvosmernim trakom, n.t.k., za L obstaja osnovni TS.
%nekdo je vprašal, če je bijekcija, pa je rekel, da ne čist?
}
\subsect{Večtračni Turingov stroj}
Večtračni Turingov stroj ima $k>1$ trakov, ki so neomejeni v obe smeri. Vsak trak ima svoje okno, ki se lahko na vsakem koraku premakne neodvisno od ostalih. Na prvem traku imamo na začetku ponovno vhodno besedo, okno prvega traku pa na prvem znaku vhodne besede. Ostali trakovi so prazni.
\begin{center}
\begin{tikzturing}[cell11/.style={cell1,fill=white}, cell22/.style={cell2,fill=white}]
\node [cell11] {\ ...\ \ };
\node at (0bp,-1.5cm) [cell22] {\ ...\ \ };
\node at (0bp,-3.0cm) [cell3] {\ ...\ \ };
\node (Ai) [cell11, selected] {$w_{0}$};
\node (Ai2) [cell22, selected] {\color{gray}$B$};
\node (Ai3) [cell3, selected] {\color{gray}$B$};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (67bp, 60bp) [draw, minimum width=2cm, minimum height=1.2cm] {$q_0$};
\draw (ne.south) -- (67bp, 25bp) -- (29bp, 25bp) [->] to (Ai.north);
\draw (ne.south) -- (67bp, -20bp) -- (29bp, -20bp) [->] to (Ai2.north);
\draw (ne.south) -- (67bp, -65bp) -- (29bp, -65bp) [->] to (Ai3.north);
\foreach \x in {1,2,3} {
\node [cell11] {$w_{\x}$};
\node [cell22] {\color{gray}$B$};
\node [cell3] {\color{gray}$B$};
}
\node [cell11] {\ ...\ \ };
\node [cell22] {\ ...\ \ };
\node [cell3] {\ ...\ \ };
\node [cell11, end] {};
\node [cell22, end] {};
\node [cell3, end] {};
\end{tikzturing}
\end{center}
\Def{Korak stroja $\delta$ opišemo kot:
\[\delta = Q \times \Gamma^k \rightarrow Q\times(\Gamma\times\{ L,D,- \})^k \]
Na vsakem koraku torej iz trenutnega stanja in tračnega simbola na vsakem traku dobimo neko novo stanje ter za vsak trak neodvisno nov simbol in premik.}
\Trditev{Večtračni Turingov stroj je enako močen kot osnovni model.}
\Dokaz{
\Odmakni{($\Rightarrow$)}{Večtračni Turingov stroj uporabi le prvi trak.}
\Odmakni{($\Leftarrow$)}{Turingovemu stroju $M$ s $k$-trakovi priredimo $2k$-sledni v obe strani neskončni Turingov stroj $M'$.
Za vsak trak stroja $M$ imamo tako dve sledi v $M'$ -- na zgornji sledi je zapisana oznaka $X$, ki pove, kje naj bi bilo okno na tem traku stroja $M$, na spodnji sledi pa je zapisana vsebina tega traku stroja $M$.
\begin{center}
\begin{minipage}[t]{6cm}
\begin{tikzturing}[cell11/.style={cell1,fill=white}]
\node [cell11] {\ ...\ \ };
\node at (0bp,-1.5cm) [cell2] {\ ...\ \ };
\node (Ai) [cell11, selected] {$a$};
\node [cell2] {$c$};
\node (Ai2) [cell2, selected] {$d$};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (50bp, 60bp) [draw, minimum width=2cm, minimum height=1.2cm] {$q$};
\draw (ne.south) -- (50bp, 25bp) -- (29bp, 25bp) [->] to (Ai.north);
\draw (ne.south) -- (50bp, 25bp) -- (57bp, 25bp) [->] to (Ai2.north);
\node [cell11] {$b$};
\node [cell11] {\color{gray}$B$};
\node [cell2] {\color{gray}$B$};
\node [cell11] {\ ...\ \ };
\node [cell2] {\ ...\ \ };
\node [cell11, end] {};
\node [cell2, end] {};
\end{tikzturing}
$k$-tračni stroj $M$
\end{minipage}
\begin{minipage}[t]{6cm}
\begin{tikzturing}
\node [cell1] {\ ...\ \ };
\node at (0bp,-0.6cm) [cell2] {\ ...\ \ };
\node at (0bp,-1.2cm) [cell3] {\ ...\ \ };
\node at (0bp,-1.8cm) [cell4] {\ ...\ \ };
\node [cell1] {$X$}; \node [cell1] {\color{gray}$B$};
\node [cell2] {$a$}; \node [cell2] {$b$};
\node [cell3] {\color{gray}$B$}; \node [cell3] {$X$};
\node [cell4] {$c$}; \node [cell4] {$d$};
\node (Ai) [cell1,selected] {\color{gray}$B$};
\node [cell2,selected] {\color{gray}$B$};
\node [cell3,selected] {\color{gray}$B$};
\node [cell4,selected] {\color{gray}$B$};
\node [cell1] {\ ...\ \ };
\node [cell2] {\ ...\ \ };
\node [cell3] {\ ...\ \ };
\node [cell4] {\ ...\ \ };
\node [cell1, end] {};
\node [cell2, end] {};
\node [cell3, end] {};
\node [cell4, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (60bp, 60bp) [draw, minimum width=2cm, minimum height=1.2cm] {$q$};
\draw (ne.south) -- (60bp, 25bp) -- (85.5bp, 25bp) [->] to (Ai.north);
\end{tikzturing}
$2k$-sledni stroj $M'$
\end{minipage}
\end{center}
\br
Stroj $M'$ torej hrani trenutni položaj na trakovih z dodatno sledjo, ki ima v ustrezni celici zapisan simbol $X$.
\br
Poleg tega pa pri $M'$ potrebujemo še drugačno nadzorno enoto, ki hrani:
\begin{items}
\item Stanje stroja
\item $k$ tračnih simbolov
\item Števec na intervalu $[0,k]$, ki nam pove, koliko simbolov $X$ je še desno od trenutnega položaja okna.
\end{items}
\ \\
Stroj $M'$ simulira en korak stroja $M$ tako da:
\begin{items}
\item Okno pomika v desno
\item Ko na neki sledi naleti na simbol $X$:
\begin{items}
\item V nadzorno enoto shrani simbol iz naslednje sledi
\item Zmanjša števec za 1.
\end{items}
\item Ko števec doseže 0, se začne pomikati v levo
\item Ko naleti na simbol $X$
\begin{items}
\item Zamenja tračni simbol na naslednji sledi, enako kot bi naredil stroj $M$
\item Premakne se levo ali desno, enako kot bi naredil stroj $M$
\item Poveča števec za 1
\end{items}
\item Ko števec doseže $k$, nadzorna enota preide v novo stanje, enako kot bi stroj $M$
\end{items}
\ \\
En korak stroja $M$ torej simuliramo s končno dolgim sprehodom v desno in levo.
}}%konec dokaza
\subsect{Nedeterministični Turingov stroj}
Pri nedeterminističnemu Turingovemu stroju, imamo lahko v določeni konfiguraciji več možnosti, kako bo stroj nadaljeval z delom. Za formalni zapis tega je potrebno spremeniti le funkcijo prehodov $\delta$, ki sedaj slika v množico konfiguracij, namesto v eno samo:\\
\[ \delta:Q\times\Gamma \rightarrow 2^{Q\times\Gamma\times\{ L,D,- \}} \]
\Def{Nedeterministični Turingov stroj sprejme besedo natanko tedaj, kadar obstaja končno zaporedje korakov, po katerem pridemo do končnega stanja.}
\Primer{%nekoliko lame primer... where's the action :)
$\delta(0, a) = \{ \langle q_1, b, L \rangle, \langle q_2, c, D \rangle, \langle q_3, a, L \rangle, \langle q_2, B, L \rangle \}$\\
Stroj bo izbral tisto preslikavo, ki ga vodi k sprejetju vhodne besede. Če to ni mogoče, se bo stroj ali ustavil v nekončnem stanju, ali pa se sploh ne bo ustavil.
}
\Trditev{Nedeterministični Turingov stroj zmore vse kar zmore osnovni Turingov stroj.}
\Dokaz{Funkcija prehodov $\delta$ osnovnega Turingovega stroja je le poseben primer funkcije $\delta$ nedeterminističnega Turingovega stroja.}
\Trditev{Nedeterministični Turingov stroj ni močnejši od osnovnega modela.}
\Dokaz{Simulacija nedeterminističnega Turingovega stroja z osnovnim:\\
%slika
%
% d a
% |-------
% q | o
%
%
\fixme slika\\
Naj bo $M$ nek nedeterministični Turingov stroj in naj ima njegov program v vsaki mmnožici $\delta(q,a)$ največ $r$ možnih potez, kjer je $r$ končno število.\\
Stroju $M$ priredimo osnovni 3-sledni Turingov stroj $M'$, z naslednjimi lastnostmi:
\begin{items}
\item na prvi sledi ima abecedo stroja $M$
\item na drugi sledi generira zaporedje navodil besed nad abecedo $\{1, 2, \dots, r\}$ v leksikografskem vrstnem redu (npr. $r = 3: 1,2,3,11,12,13,\dots)$
\item na tretji sledi simulira stroj $M$, kot da bi ta izbral poteze skladno s tekočimi navodili
\end{items}
Natančneje stroj $M'$ deluje tako:
\begin{items}
\item na drugi sledi sestavi novo, naslednje navodilo
\item prepiše vhodno besedo s prve na tretjo sled
\item na tretji sledi simulira stroj $M$, kot da bi ta izbral svoje poteze skladno s tekočimi navodili.\\
Pri tem:
\begin{items}
\item če $M'$ pride do konca navodila in je tedaj v končnem stanju, vhodno besedo sprejme in konča, kot bi to storil tudi $M$
\item sicer nadaljuje s prvim korakom ali pa se ustavi v končnem stanju
\end{items}
\end{items}
}
\Trditev{Če $M$ sprejme besedo jo sprejme tudi $M'$.}
\Izrek{Za jezik $L$ obstaja nedeterministični Turingov stroj natanko tedaj, ko za $L$ obstaja osnovni Turingov stroj.}
\subsect{Večdimenzionalni Turingov stroj}
Pri tem modelu je trak k-dimenzionalen ($k \geq 2$) in je v vsaki dimenziji neomejen v obe smeri.\\
Za tridimenzionalni Turingov stroj bi to pomenilo, da je celica kocka in se po vsakem koraku stroja premaknemo v eno izmed šestih sosednjih celic.
\subsect{Turingov stroj z več okni}
Nadzorna enota hkrati lahko bere iz večih oken na istem traku.\\
Okna so ves čas enako oddaljena med seboj.
\br
\begin{tikzturing}
\node [cell1, minimum width=2cm] {};
\node (Ai) [cell1,selected] {$A_i$};
\node [cell1, minimum width=1.7cm] {\ ...\ \ };
\node (Ai2) [cell1,selected] {$A_j$};
\node [cell1, minimum width=1cm] {\ ...\ \ };
\node (Ai3) [cell1,selected] {$A_k$};
\node [cell1, minimum width=2cm] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (80bp, 60bp) [draw, minimum width=2cm, minimum height=1.2cm] {$q$};
\draw (ne.south) -- (80bp, 30bp) [->] to (Ai.north);
\draw (ne.south) -- (80bp, 30bp) [->] to (Ai2.north);
\draw (ne.south) -- (80bp, 30bp) [->] to (Ai3.north);
\end{tikzturing}
%-----------------------predavanja 4-------------------------------
%Turing se je zgledoval po človeku
%drugi po funkcijah
%kaj je računanje, izračunljivost, algoritem... na številsko-teoretskih funkcijah f:N->N ... totalne/parcialne
%študirali so totalne f:N->N
%Cilji: storga mat. definicija pojmov s tem da zadosti 2 stvarem:
%zajeti mora vse "izračunljve funkcije" (vse kar si lahko zamislimo kot problem za računanje)
%za vsako tako f, mora biti razviden mehaničen postopek za izračun njenih vrednosti
%(HK,HG,lambda)
%zgledovanje po (naravnem) jeziku
%Postov stroj, Algoritmi Markova
%računanje oz. reševanje mat. problemov je pri človeku preoblikovanje množice besed v drugo (opis problema, v opis rešitve)
\sect{Alternative Turingovemu stroju}
Alternative smo našteli že na začetku poglavja. Tu v uvodu na hitro povejmo malo o tem, prek katerih metafor so različni raziskovalci prišli do svojih modelov. Turing je poskušal formalizirati kako človek rešuje problem na papir, ostali pa so se zgledovali po jeziku (npr. kako iz opisa problema dobiti opis rešitve), ali pa kar po funkcijah.
\subsect{Rekurzivne funkcije (Gödel, Kleene)}
Gödel si je zamislil, da bi iz nekaj osnovnih funkcij z nekaj pravili lahko izpeljal kompleksnejše funkcije. Definiral je: ničelno funkcijo, funkcijo naslednik in projekcijo, ter pravili za sestavljanje: kompozicijo in primitivno rekurzijo.
\br
\fixme začetne in drevo ven%grafek vseh sestavljivih (primitivno rekurzivnih) funkcij \_/
\br
Konstrukcija funkcije opisuje tudi mehanični postopek za izračun vrednosti funkcije tako, da je s tem tudi kandidat za formalni opis pojma algoritma.
\br
Kasneje se je izkazalo, da ta pravila ne zadostujejo, saj obstaja npr. Ackermannova funkcija, ki narašča hitreje od vsake funkcije, ki pripada primitivno rekuzivnim:
\[ A(m,n) =
\left\{
\begin{array}{ccl}
n+1&;& m=0\\
A(m-1,1) &;& m>0 \wedge n=0\\
A(m-1,A(m, n-1)) &;& m>0 \wedge n>0
\end{array}
\right.
\]
\\
Kleene zato doda Gödelovim pravilom še eno pravilo sestavljanja -- minimizacijo oz. $\mu$-operacijo. %to zato, da naredi totalno, čeprov je možno parcialne
\Def{Totalne naravne funkcije $f:N^k\rightarrow N$, ki jih je moč konstruirati iz treh začetnih funkcij, s končno mnogo uporabami treh pravil sestavljanja imenujemo \textbf{rekurzivne funkcije.}
\br
Konstrukcija rekurzivne funkcije $f$ je končno zaporedje $f_1,f_2,\dots,f_L$ in je $f_L=f$, ter je vsaka funkcija $f_i$ na poti, bodisi začetna, bodisi po pravilih sestavljena iz predhodnic v tem zaporedju.%glej grafek
\br
Začetne funkcije:
\begin{items}
\item Ničelna funkcija: $\zeta(n)=0$
\item Naslednik: $\sigma(n)=n+1$
\item Projekcija: $\pi^k_i (n_1, n_2, \dots, n_k)=n_i$
\end{items}
Pravila sestavljanja:
\begin{items}
\item Kompozicija:
\[ g:\mathbb{N}^m \rightarrow \mathbb{N} \]
\[ h_i:\mathbb{N}^n \rightarrow \mathbb{N} \]
\[ f(x_1, x_2, \dots, x_n) = g(h_1(x_1, x_2, \dots, x_n), h_2(x_1, x_2, \dots, x_n), \dots, h_m(x_1, x_2, \dots, x_n)) \]
\item Primitivna rekurzija:
\[ g:\mathbb{N}^n \rightarrow \mathbb{N} \]
\[ h:\mathbb{N}^{n+2} \rightarrow \mathbb{N} \]
\[ f(x_1, x_2, \dots, x_n, 0) = g(x_1, x_2, \dots, x_n) \]
\[ f(x_1, x_2, \dots, x_n, y+1) = h(x_1, x_2, \dots, x_n, y, f(x_1, x_2, \dots, x_n, y)) \]
\item Minimizacija:
\[ g:\mathbb{N}^{n+1} \rightarrow \mathbb{N} \]
\[ f(x_1, x_2, \dots, x_n) = \mu_y (g(x_1, x_2, \dots, x_n, y)) = z\]
Pri tem je $z$ najmanjše število, za katerega velja $g(x_1, x_2, \dots, x_n, z) = 0$. Če tak $z$ ne obstaja je funkcija $f$ tam nedefinirana.
\end{items}
}
%zaenkrat nismo našli Ackermann2, ki bi to pokvarila :)
\Povzetek{Algoritem po Gödel-Kleenu(GK) je ravno konstrukcija rekurzivne funkcije.\\
Računanje po GK je izračun vrednosti funkcije tako, kot jo narekuje njena konstrukcija.\\
Funkcija je izračunljiva po GK, če je rekurzivna.}
\subsect{Splošne rekurzivne funkcije (Herbrand, Gödel)}
Herbrand je razmišljal o tem, kako poljubno naravno funkcijo definirati s sistemom enačb.
\odmakni{Gödelu je pisal}{
\Quote{Recimo, da je $f$ neznana funkcija, $g_1, g_2, \dots, g_m$ pa znane. %mestnost?
Funkcije $f$ in $g_i$ poljubno vstavljamo kot argumente v druge funkcije, nato pa nekatere dobljene izraze izenačimo. Če ima dobljeni sistem natanko eno rešitev za funkcijo $f$, potem je $f$ rekurzivna.}
}
Ta pa je dodal še dve dodatni zahtevi:
\begin{items}
\item Na levi strani enačb se funkcija $f$ ne sme pojaviti kot eden izmed argumentov $f$.%$f$ se sme na levi strani enačb pojaviti v obliki $f(g(...), ..., g_k(...)$ %Herbrand je dovoljeval f(g...f...g), kar je preveč divje
\item Funkcija $f$ naj bo totalna.
\end{items}
\Def{Če se funkcijo $f$ da zapisati na zgoraj zapisani način, je \textbf{splošno rekurzivna}.\\
Sistem označimo z $\varepsilon(f)$ in mu pravimo \textbf{standardni sistem}.
}
Pravila za računanje vrednosti $f(n_1, n_2, \dots, n_k)$ iz $\varepsilon(f)$:
\begin{items}
\item V enačbi vse pojave neke spremenljivke zamenjamo z istim naravnim številom
\item V enačbi pojave funkcije zamenjamo z njeno vrednostjo
\end{items}
\Povzetek{Algoritem po Herbrant-Gödlu(HG) je $\varepsilon(f)$.\\
Računanje po HG je izračun vrednosti funkcije $f(n_1,\dots,n_k)$ iz $\varepsilon(f)$.\\%izr. je, sta rekla... oz je samo Gödel reku... oh, snap :D
Funkcija je izračunljiva po HG, če je splošno rekurzivna.}
\subsect{Netipizirani $\lambda$-račun (Alonso Church)}%1932,1933 Alonso Church
Pri $\lambda$-računu imamo začetni izraz oz. začetni $\lambda$-term, ki opisuje neko funkcijo $f$ in njene argumente $n_1, \dots, n_k$. Cilj računanja je preoblikovati začetni $\lambda$-term v tak končni $\lambda$-term, ki bo opisoval ravno vrednost funkcije $f(n_1, n_2, \dots, n_k)$.
\br
Preoblikovanje dosežemo z uporabo redukcij:
\begin{items}
\item $\alpha$-redukcija preimenuje spremenljivko v $\lambda$-termu,
\item $\beta$-redukcija uporabi neko funkcijo nad njenimi argumenti. %a se da $\lambda$-term makro, ki bo pogledal nazaj in se pravilno sklonil? :D
\end{items}
$t_0 \rightarrow t_1 \rightarrow \dots \rightarrow t_k = f(n_1, n_2, \dots, n_k)$
\Def{funkcija, ki jo je moč predstaviti in računati v $lambda$-računu, je \textbf{$\lambda$-definabilna}}%fo'real!
\begin{comment}
$(\lambda x . x) 3$
$(\lambda x . x x) (\lambda x . x x)$ se zacikla
\end{comment}
\Povzetek{Algoritem po Churchu je $\lambda$-term.\\
Računanje po Churchu je preoblikovanje začetnega $\lambda$-terma v končni $\lambda$-term z redukcijami.\\
Funkcija je izračunljiva po Churchu, če je $\lambda$-definabilna.}
%zgledovanje po jeziku (glej gor)
\subsect{Postov Stroj (Emil Post)}%1936, Post
%podoben turingovemu
%nadzorna enota
%trak s celicami
%okno
%+vrsta z znaki povezana v nadz enoto in iz nadzorne grejo lahko na konec vrste
Model je podoben Turingovemu stroju, z naslednjimi spremembami:
\begin{items}
\item Stroj s traku lahko le bere znake
\item Uporablja posebno vrsto za znake
\end{items}
\begin{tikzturing}
\node [on chain=trak] {Trak};
\foreach \x in {1,2,...,5} {
\node [cell] {$A_{\x}$};
}
\node [cell] {\ ...\ \ };
\node (Ai) [cell, selected] {$A_i$};
\node [cell] {\ ...\ \ };
\node [cell] {$A_n$};
\node [cell] {\color{gray}$B$};
\node [cell] {\color{gray}$B$};
\node [cell] {\ ...\ \ };
\node [cell, end] {};
%?must be a better way, zadnja črta niti ni naravnost
\node (ne) at (110bp, 70bp) [head, minimum height=1.5cm, minimum width=3cm] {Nadzorna enota};
\draw (ne.south) -- (110bp, 25bp) -- (137.5bp, 25bp) [->] to (Ai.north);
\node [below] at (Ai.south) {Čitalno okno};
\node (vrsta) at (200bp, 70bp) [head, minimum height=0.6cm, minimum width=1.2cm] {};
\node (vrsta2) at (vrsta.east) [head, minimum height=0.6cm, minimum width=1.2cm] {};
\draw (ne.east) [<-] to (vrsta.west);
\draw (ne.north) -- (110bp, 110bp) -- (250bp, 110bp) -- (250bp, 70bp) [->] to (vrsta2.east);
\end{tikzturing}
\odmakni{Korak stroja}{Iz celice pod oknom in iz začetka vrste prebere po en znak. Na podlagi teh dveh znakov in stanja premakne okno, nov znak da na konec vrste in preide v novo stanje.}
%iz jezika? how? najprej: graf: opis problema pride v začetno vozlišče, nato po grafu potuje in se spreminja, dokler ne pride v končno stanje - rezultat. besedi se odreže prvi znak in glede na to se izbere pot v grafu, ali spremeni besedo, etc.. stroj to simulira.
%zgleda končen... kaj zdj? trak je končen, vrsta, stanja, ... %i dunno lol
\Povzetek{Algoritem po Postu je program Postovega stroja.\\
Računanje po Postu je izvajanje programa Postovega stroja.\\
Funkcija je izračunljiva po Postu, če njeno vrednost lahko izračuna Postov stroj.}
\subsect{Algoritmi Markova (Andrej Markov ml.)}%194..
Imamo abecedo $\Sigma$, ter končno zaporedje produkcij:\\
\[ x_1 \rightarrow y_1 \]
\[ x_2 \rightarrow y_2 \]
\[ \ \ \ \dots \]
\[ x_n \rightarrow y_n \]
\[ x,y \in \Sigma^* \]%string v string
\\
Produkcija preoblikuje besedo tako, da v besedi nadomesti skrajno levi pojav $x_i$ z $y_i$. %slikca beseda prej potem... x1->y1
Algoritem je zaporedje korakov, ki postopno preoblikuje začetno besedo v končno. V vsakem koraku se trenutna beseda preoblikuje z najbolj levo možno produkcijo.
\Povzetek{Algoritem po Markovu je gramatika.\\
Računanje po Markovu je preoblikovanje vhodne besede z dano gramatiko.\\
Funkcija je izračunljiva po Markovu, če njeno vrednost računa kaka gramatika}
%poudarki: kaj imajo skupnega?
%razumno zmogljivi - končno različnih ukazov, vsak ukaz se izvede v končno korakih / času, v enem koraku se opravi končno veliko dela, učinek ukaza je predvidljiv(tudi nedeterminističnem... mjbi kvantni ne).
%potencialno neskončen spomin brez omejitev dostopa
\subsect{Povzetek modelov}
Vsem omenjenim modelom je skupno, da so razumno zmogljivi:
\begin{items}
\item Končno mnogo ukazov
\item Ukaz se izvede v končnem času
\item Ukaz opravi končno mnogo računanja
\item Učinek ukaza je predvidljiv%tudi pri nedeterminističnem... mogoče pri kvantnih ne
\end{items}
Skupno jim je tudi to, da je pomnilnik potencialno neskončen in brez omejitev dostopa.
\sect{Church-Turingova teza}
Church je postavil domnevo: \Quote{algoritem} $\Longleftrightarrow$ algoritem po Churchu ($\lambda$-račun)\\%lol, kar sm js reku je algoritem :P glej sigma pri Churchu... Gödel ga je nekoliko zavrnil, vmes turing neodvisno do podobnega
Turing je postavil domnevo: \Quote{algoritem} $\Longleftrightarrow$ algoritem po Turingu (Turingovi stroji)
\br
\textbf{Church-Turingova teza} pravi, da je \Quote{algoritem} opis postopka reševanja nekega problema na Turingovem stroju, ali na kateremkoli izmed ekvivalentnih modelov.%bolj točno program turing stroja in turing zato, ker je najbl cute
%-----------------------predavanja 5-------------------------------
\begin{comment}
%mislm, da smo vglavnem ponavljali
\br
Kaj je doprinos Church-Turingove teze?
%%1
algoritem%oblaček
%<---> ni dokazano ampak vseen puščica
\fixme - krog... alg, kot so ga opisali (in okrog napisani T<=>P<=>GK<=>HG<=>M)
"algoritem" <---> program TS%okvir
%----
računanje%oblaček
%<--->
\fixme - krog... računanje, kot so ga opisali...% in okrog napisani T<=>P<=>GK<=>HG<=>M
"računanje" <---> delovanje TS%okvir