-
Notifications
You must be signed in to change notification settings - Fork 1
/
turing.tex
executable file
·1525 lines (1328 loc) · 122 KB
/
turing.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
\chapter{Turing-izračunljivost}\label{ch:Turing}
%\section{Zašto nam treba još jedan model?}
Uveli smo dva modela izračunljivosti brojevnih funkcija --- RAM-izračunljivost i parcijalnu rekurzivnost --- i dokazali da su ekvivalentni, usprkos bitno različitim pristupima (imperativnom odnosno funkcijskom) definiciji algoritma. To je dobar argument za Church--\!Turingovu tezu, da su izračunljive funkcije iste u svim modelima --- odnosno u modernijem obliku, da su sve programske paradigme jednako snažne. Ipak, pritom su zanemarena dva aspekta izračunljivosti.
% \subsection{Elementarne operacije}
Prvi je izračunljivost funkcija koje nisu brojevne. Rekli smo u uvodnom poglavlju, i opravdali to mnogo puta kasnije --- skup $\N$ je idealan za matematički tretman izračunljivosti, ali nije baš vjeran onom što se događa u praksi. Osnovna razlika je u konačnosti odnosno beskonačnosti skupova relevantnih za izračunavanje.
Primjerice, u RAM-modelu, skup mogućih stanja pojedinog registra je beskonačan. Često je problematično shvaćanje beskonačnosti kao "jako mnogo, pa još malo više". Zapravo, bliže definiciji beskonačnosti bilo bi "jako mnogo, pa onda još beskonačno više" --- ma koliko velik konačni skup uzeli od beskonačnog skupa, ostatak je jednako velik kao da nismo uzeli ništa.
Konkretno, lako se zavarati primjerima u kojima u RAM-registrima stoje brojevi poput $0$, $150$ ili $2^{257}$, i misliti da su RAM-registri nešto kao obični procesorski registri, samo "malo veći". Kodiranje pokazuje koliko je to daleko od istine: u RAM-registar možemo staviti i brojeve poput broja $e_0$ iz primjera~\ref{pr:Qflatkod}, koji ima $579\,690\,725\,279$ \emph{znamenaka}! Štoviše, takva procedura nije ništa neuobičajeno; ona odgovara prirodnom postupku računanja $\f{univ}(\kr{2,4},e_0)$, odnosno konstrukciji rezultata $Q^\flat$-izračunavanja s $(2,4)$, na univerzalnom RAM-stroju (dobivenom kompiliranjem simboličke definicije funkcije $\f{univ}$).
Stvarna računala, naravno, takve složene strukture (zamislimo $e_0$ kao \emph{bytecode}, neku vrstu strojnog koda) ne kodiraju pomoću prirodnih brojeva, već preko nizova bitova, bajtova ili većih procesorskih \emph{riječi}. Ključno je da je skup $\Gamma$ svih stanja pravog procesorskog registra \emph{konačan}. Način na koji se onda reprezentira potencijalna beskonačnost ulaznih podataka (što moramo, jer jedino beskonačni skupovi imaju netrivijalnu teoriju izračunljivosti), kao i međurezultata u izračunavanju, je kroz neograničenost same memorije, odnosno broja memorijskih ćelija koje sadrže po jedan element iz $\Gamma$.
I ovdje vrijedi univerzalni princip da na konačnim skupovima možemo dopustiti bilo kakve transformacije kao elementarne korake, reprezentirajući ih tablicama --- dok s beskonačnim skupovima moramo biti oprezni, ograničavajući transformacije samo na one izračunljive. Kako su ti beskonačni skupovi u pravilu trivijalno izomorfni s $\N$, kao osnovne korake dopuštamo samo prijelaz na sljedeći odnosno prethodni (ako već nije~$0$) prirodni broj.
Zato smo na konfiguracijama RAM-stroja dozvoljavali samo one prijelaze kod kojih se stanje pojedinog registra mijenja za najviše $1$ u svakom koraku; dok smo za stanje programskog brojača dozvoljavali skokove na proizvoljnu legalnu vrijednost --- upravo jer legalnih vrijednosti programskog brojača za fiksni RAM-stroj ima konačno mnogo. Također, osnovna ideja od koje dolazi i ime RAM-stroja, \emph{random access}, znači da njegova "memorijska sabirnica" može adresirati proizvoljni registar u jednom koraku --- što možemo upravo jer adres\=a relevantnih registara za fiksni RAM-algoritam ima konačno mnogo.
Ako želimo beskonačnost prikazati ne kroz veličinu sadržaja pojedinog registra nego kroz broj ćelija potrebnih da se zapiše podatak, zapravo imamo "transponirani" model: na pojedinoj ćeliji (jednom kad dođemo do nje) ćemo moći napraviti proizvoljnu transformaciju u jednom koraku, jer je skup $\Gamma$ mogućih stanja pojedine ćelije konačan --- ali pristup do pojedine ćelije više neće moći biti \emph{random access}, već ćemo u jednom koraku samo moći adresu trenutno promatrane ćelije povećati ili smanjiti (ako nije $0$) za jedan. To je \emph{jezični model} izračunavanja, tako nazvan jer odgovara onom kako (barem zapadni) jezici funkcioniraju: od konačnog broja slova u abecedi nizanjem možemo dobiti proizvoljno komplicirane riječi, rečenice i tekstove. Da bismo povećali izražajnost, ne uvodimo nova slova, već pišemo dulje rečenice.
Možda ovdje treba objasniti kako moderna računala postižu \emph{random access} i na potencijalno neograničenoj memoriji. Objašnjenje je jednostavno: varaju. Njihova memorija \emph{nije} potencijalno neograničena, jer ovisi o veličini adresnog prostora. Jedno $64$-bitno računalo, koliko god mu virtualne memorije dali, ne može adresirati više od $2^{64}$ bajtova. To varanje u stvarnom svijetu prolazi jer s trenutnom tehnologijom ne možemo uopće sastaviti funkcionalnu memoriju od $2^{64}$ bajtova (što je više od osamnaest milijuna terabajta), ali za $32$-bitna računala to ograničenje (na $4\,GiB$) je bilo vrlo stvarno i nezgodno, i uostalom jedan od glavnih razloga za prijelaz na $64$-bitnu arhitekturu.
Sličan primjer koji je nedavno došao do granice svojih mogućnosti je internetski protokol IPv4, ilustrativan jer daje uvid u to kako se takvi problemi mogu riješiti iteriranjem adresiranja: NAT (\emph{Network Address Translation}) pokazuje da ako se u jednom koraku (DNS) može adresirati $t=2^{32}$ računala, u dva se koraka (DNS + \emph{router}) može u idealnom slučaju adresirati $t^2=2^{64}$ računala. Više nam vjerojatno neće nikada trebati jer ćemo u međuvremenu prijeći na IPv6, ali u $n$ koraka mogli bismo adresirati $t^n$ računala, zamišljajući generaliziranu IP-adresu kao $n$-znamenkasti broj u bazi $t$ --- ili $32n$-znamenkasti broj u bazi $2$. Jedina razlika kod jezičnog modela je u tome što umjesto binarnog zapisa adrese korisimo unarni, u kojem su elementarne operacije samo inkrement i dekrement (koji ostavlja nulu fiksnom).
Iako je unarni zapis eksponencijalno lošiji od binarnog (i svih ostalih pozicijskih) zapisa --- broj koji u bazama $2$, $3$, $4$,~\ldots\ ima nekoliko desetaka znamenaka, zapisan unarno može imati milijarde milijardi milijardi~\ldots\ "znamenaka" --- opet, to je samo razlika u složenosti, odnosno u performansama algoritma, ne u samom postojanju algoritma, i kao takva neće nam biti važna. Ono što nam jest važno je da u jezičnom modelu adresiranje pojedine ćelije zahtijeva netrivijalne algoritme, a bilo kakva promjena sadržaja ćelije je elementarna operacija --- upravo suprotno od RAM-modela.
%\subsection{Računanje bez računala}
Drugi aspekt koji smo u potpunosti zanemarili u brojevnom modelu je povijesni. Danas, kad smo na svakom koraku okruženi računalima, a većina n\=as jedno nosi u džepu, lako je zaboraviti da računala ne postoje oduvijek. Zapravo, u upotrebljivom obliku postoje tek nekoliko desetaka godina. S druge strane, algoritmi postoje već milenijima: Euklidov algoritam nastao je prije modernog brojenja godina, a neki babilonski algoritmi potječu sa samih početaka pisane povijesti. Od kakve je koristi algoritam ako nema računala na kojem se može izvršavati?
Naravno, algoritme su izvršavali ljudi. Iako ljudski mozak po svojoj prirodi nije savršen supstrat za doslovno slijeđenje instrukcija kroz višeznamenkaste brojeve koraka, moderno obrazovanje svjedoči da se može tome na\-u\-či\-ti. Doista, rješavanje većine školskih matematičkih zadataka se može svesti na provođenje nekog algoritma. Mnoge takve zadatke računala rješavaju brže i točnije od ljudi, što se vidi kroz uspjeh aplikacija kao što je \texttt{photomath}. Iako su ljudi bolji u pronalaženju (logičkih, analogijskih ili asocijativnih) veza među pojmovima, potreba za rješavanjem problema iz stvarnog života koji se mogu precizno klasificirati uvjetovala je pronalazak mnogih algoritama daleko prije izuma računala. Motivacija je uvijek bila ista: optimizacija i specijalizacija ljudskog rada. Jedan čovjek može osmisliti algoritam, koji poslije milijuni ljudi mogu provoditi i tako rješavati stvarne probleme, ne razumijevajući nužno zašto algoritam funkcionira. No da bi to uspjelo, koraci algoritma moraju biti takvi da njegovo provođenje ne zahtijeva nikakav angažman pored onog specificiranog algoritmom --- niti ikakvo vanjsko znanje osim poznavanja ulaznih podataka, i nekoliko elementarnih vještina za koje smatramo da su svojstvene svim radno sposobnim ljudima: čitanje i pisanje simbola iz fiksnog konačnog skupa te odlučivanje na osnovi pročitanog.
Britanski matematičar Alan Mathison Turing prvi je uspješno formalizirao taj koncept. U svom članku~\cite{turing}, prije više od 80 godina i svakako prije nastanka digitalnih elektroničkih računala, Turing govori o ljudima koji računaju decimale nekih konkretno zadanih realnih brojeva --- za što danas znamo da je vrlo slično računanju vrijednosti nekih konkretno zadanih brojevnih funkcija. Iako je i prije tog članka bilo pokušaja formalizacije algoritma, Turingov se ističe po tome što detaljno motivira svoje definicije, koristeći tada poznate činjenice vezane uz ljudsku percepciju i kogniciju. Čovjekov fizički rad za vrijeme provođenja algoritma, i misaona stanja kroz koja prolazi, nisu samo incidentni dio opisa algoritma --- oni su u tom članku suštinski ugrađeni u definiciju. Tako možemo biti sigurni da doista modeliramo ono što se događa u stvarnom svijetu kad čovjek provodi algoritam, a ne matematičku apstrakciju kao što je primjerice $\lambda$-račun.
%\subsection{Turingov stroj}
Ako modeliramo ljude, odakle onda Turingovi \emph{strojevi}? Turing je bio svjestan fenomena da je lako pomisliti kako opisujemo postupak koji ne zahtijeva nikakvo eksterno znanje, a da to zapravo nije istina. Razumijevanje napisanog ili izgovorenog jezika, prepoznavanje objekata na slikama, pa čak i osnove socijalnog ponašanja, vještine su koje smo toliko duboko internalizirali da nam se čine elementarnima --- a zapravo pretpostavljaju ogromne količine znanja o svijetu koji nas okružuje. Jednostavni primjer: rečenice hrvatskog jezika "Ana i Marija su sestre."\ i "Ana i Marija su majke."\ imaju potpuno istu sintaksnu strukturu, ali fundamentalno različitu semantiku, za čiju je konstrukciju potrebno netrivijalno znanje o ljudskoj biologiji (mogu biti sestre jedna drugoj, ali ne mogu biti majke jedna drugoj) --- a ipak nam se svaka od te dvije semantike nametne sasvim prirodno čitajući odgovarajuću rečenicu, i uopće ne razmišljamo kako bi moglo biti drugačije, sve dok ih ne vidimo jednu pored druge.
Da bi svoje čitatelje uvjerio kako njegove elementarne operacije doista ne zahtijevaju nikakvo implicitno pretpostavljeno znanje, Turing je paralelno opisao i zamišljeni, idealizirani, \emph{stroj} koji može provoditi te operacije. Taj stroj, odnosno njegovu matematičku formalizaciju (neki detalji su kasnije promijenjeni radi lakšeg razumijevanja) danas nazivamo Turingovim strojem. Ipak, treba razumjeti da "ove operacije su toliko elementarne da bi ih mogao provoditi i mehanički stroj" nije poziv na konstrukciju stvarnog stroja, već apel na intuiciju da smo osnovni opis algoritma lišili svega suvišnog.
%\section{Osnovni pojmovi i primjer Turing-izračunavanja}
\section{Izračunljivost jezičnih funkcija}\label{sec:tikp}
U literaturi postoje brojne varijante Turingova stroja --- mi slijedimo~\cite{sipser}, uz male modifikacije kako bismo lakše dokazivali teoreme. Za početak ponovimo definicije.
Ulazna abeceda, ili samo \emph{abeceda}, je konačan neprazan skup. Obično je označavamo sa $\Sigma$ i smatramo fiksnom. Njene elemente zovemo \emph{znakovima} --- ne\-od\-re\-đe\-ne znakove (znakovne varijable) pišemo malim grčkim slovima s početka alfabeta ($\alpha$, $\beta$, $\gamma$), dok konkretne znakove pišemo u fontu fiksne širine: $\t a$, $\t b$, $\t 0$, $\t 1$. \emph{Riječ} (nad $\Sigma$) je bilo koji konačan niz znakova, najčešće označen slovom $w$, $v$ ili $u$. Riječi pišemo konkatenacijom (nizanjem) znakova: recimo, riječ $(\t0,\t1,\t1)$ pišemo kao $\t{011}$. Dakle, skup svih riječi je skup $\Sigma^*$ svih konačnih nizova znakova. Duljinu riječi $w$ označavamo s $\dulj{w}$. Prazni niz (duljine $0$) zovemo \emph{praznom riječju} i označavamo s $\varepsilon$. \emph{Jezik} (nad $\Sigma$) je bilo koji podskup od $\Sigma^*$. \emph{Jezična funkcija} (nad $\Sigma$) je bilo koja parcijalna funkcija $\varphi:\Sigma^*\rightharpoonup\Sigma^*$.
\begin{napomena}[{name=[abeceda je dio identiteta jezične funkcije]}]
Kao i mjesnost kod brojevnih funkcija i relacija, tako i abecedu kod jezika i jezičnih funkcija smatramo dijelom njihova identiteta; preslikavanje nad $\{\t a,\t b\}$ koje riječi pridružuje njen reverz (obrnuto čitanu riječ), različito je od preslikavanja nad $\{\t a,\t c\}$ zadanog istim pravilom. Ili, jezik svih riječi koje se sastoje samo od znakova $\t a$ i $\t b$ je različit kao jezik nad $\{\t a,\t b,\t c\}$ i kao jezik nad $\{\t a,\t b,\t d\}$ --- iako se u ovom slučaju radi o skupu s istim elementima. Motivacija je slična kao u slučaju praznih relacija: komplementi su različiti, a i karakteristične funkcije tih jezika su različite (jer imaju različite domene).
\end{napomena}
\begin{definicija}[{name=[Turingov stroj]}]
Neka je $\Sigma$ abeceda. \emph{Turingov stroj} (nad $\Sigma$) je matematički (idealizirani) stroj, obično zapisan kao uređena sedmorka $\mathcal T=(Q,\Sigma,\Gamma,\bl,\delta,q_0,q_z)$, koji sadrži:
\begin{itemize}
\item konačnu \emph{radnu abecedu} $\mspace{1mu}\Gamma\supset\Sigma$, s istaknutim elementom $\bl\in\Gamma\setminus\Sigma$ (\emph{praznina});
\item konačni skup \emph{stanja} $Q$, s elementima $q_0\in Q$ (\emph{početno} stanje) i $q_z\in Q$ (\emph{završno} stanje);
\item konačnu \emph{funkciju prijelaza} $\delta:(Q\setminus\{q_z\})\times\Gamma\to Q\times\Gamma\times\{-1,1\}$.\qedhere
\end{itemize}
\end{definicija}
Umjesto registara, Turingov stroj ima \emph{ćelije} (također adresirane prirodnim brojevima), svaka od kojih u svakom trenutku izračunavanja sadrži proizvoljni element od $\Gamma$. Kao što su kod RAM-stroja na početku izračunavanja svi registri osim ulaznih bili inicijalizirani na $0$, tako će kod Turingova stroja sve ćelije osim ulaznih biti inicijalizirane na $\bl$. Po analogiji s $\N_+=\N\setminus\{0\}$ označimo $\Gamma_+:=\Gamma\setminus\{\bl\}$.
\begin{definicija}[{name=[Turing-konfiguracije i prijelazi među njima]}]
Neka je $\mathcal T=(Q,\Sigma,\Gamma,\bl,\delta,q_0,q_z)$ Turingov stroj. \emph{Konfiguracija} od $\mathcal T$ je bilo koja uređena trojka $(q,n,t)\in Q\times\N\times\Gamma^\N$, takva da je niz $t$ skoro svuda $\bl$ (odnosno, $t^{-\mspace{-2mu}1}[\Gamma_+]$ je konačan skup). Komponente konfiguracije zovu se redom \emph{stanje}, \emph{pozicija} i \emph{traka}. Konfiguracija je \emph{završna} ako joj je stanje završno ($q_z$). \emph{Početna konfiguracija} s ulazom $w=\alpha_0\alpha_1\dotsm\alpha_{\dulj{w}-1}\in\Sigma^*$ je trojka $(q_0,0,w\bl\ldots)$, čija je traka definirana s $(w\bl\ldots)_i:=(\text{$\alpha_i$ ako je $i<\dulj w$, a inače $\bl$})$.%\begin{smallcases}
%\alpha_i,&i<\dulj{w}\\
%\,\bl\,,&\text{inače}
%\end{smallcases}$.
Za konfiguracije $c=(q,n,t)$ i $d=(q',n',t')$ Turingova stroja $\mathcal T$ kažemo da $c$ \emph{prelazi} u $d$, pišući $c\leadsto d$, ako je $c$ završna i $c=d$ (pišemo $c\!\lcirclearrowleft$), ili uz oznake $\delta(q,t_n)=:(p,\beta,d)$ vrijedi $q'=p$, $n'=\max\,\{n+d,0\}$, $t'_n=\beta$ te $t'_i=t_i$ za sve $i\in\N\setminus\{n\}$.
\end{definicija}
Traku možemo zamisliti kao s jedne strane ograničen, a s druge strane neograničen, niz ćelija, u kojem su od nekog mjesta nadalje samo prazne ćelije (one u kojima piše praznina). Ulaz za Turingov stroj je riječ nad $\Sigma$, koja se na početku izračunavanja zapiše na lijevi kraj trake redom (ostatak trake je prazan). U svakom koraku, funkcija prijelaza trenutno stanje i sadržaj trenutne ćelije preslikava u novo stanje, novi znak trenutne ćelije te pomak ulijevo ili udesno na susjednu ćeliju, koja time postaje trenutna u idućem koraku (pomak ulijevo od početne ćelije rezultira ostajanjem na mjestu). To se događa dok konfiguracija ne postane završna, i tada, ako je traka oblika $v\bl\ldots$ za neku riječ $v\in\Sigma^*$, kažemo da je $v$ izlaz Turingova stroja s ulazom $w$.
\begin{lema}[{name=[determinističnost Turingovih strojeva]}]\label{lm:Turingdet}
Svaka konfiguracija Turingova stroja prelazi u točno jednu konfiguraciju.% tog stroja.
\end{lema}
\begin{proof}
Neka je $\mathcal T$ Turingov stroj te $c=(q,n,t)$ proizvoljna njegova konfiguracija. Ako je $q=q_z$, tada $c\leadsto c$, i ni u koju drugu konfiguraciju jer $\delta$ nije definirana u $(q_z,t_n)$. Ako pak $c$ nije završna, postoje jedinstveni $p$, $\beta$ i $d$ takvi da je $\delta(q,t_n)=(p,\beta,d)$, koji jednoznačno (zajedno s $q$, $n$ i $t$) određuju $q':=p$, $n':=\max\,\{n+d,0\}$ i niz $t':=\bigl(\begin{smallcases}\beta,&j=n\\t(j),&\text{inače}\end{smallcases}\!\bigl)_{j\in\N}$ takve da $c\leadsto(q',n',t')$.
\end{proof}
\begin{definicija}[{name=[Turing-izračunljiva jezična funkcija]}]\label{def:Tcomputefi}
Neka je $\Sigma$ abeceda, neka je $w\in\Sigma^*$ riječ te neka je $\mathcal T$ Turingov stroj nad~$\Sigma$. \emph{$\mathcal T$\!-izračunavanje s $w$} je niz $(c_n)_{n\in\N}$ konfiguracija od $\mathcal T$, takav da je $c_0$ početna konfiguracija s ulazom $w$, a za svaki $i\in\N$, $c_i\leadsto c_{i+1}$. Kažemo da to izračunavanje \emph{stane} ako postoji $n_0\in\N$ takav da je $c_{n_0}$ završna konfiguracija.
Neka je $\varphi$ jezična funkcija nad $\Sigma$. Kažemo da $\mathcal T$ \emph{\!računa} $\varphi$ ako za sve $w\in\Sigma^*$ vrijedi:
\begin{itemize}
\item Ako je $w\in\dom\varphi$, tada $\mathcal T$\!-izračunavanje s $w$ stane i završna konfiguracija mu je oblika $\bigl(q_z,n,\varphi(w)\bl\ldots\bigr)$ za neki $n\in\N$ (pozicija nije bitna).
\item Ako $w\notin\dom\varphi$, tada $\mathcal T$\!-izračunavanje s $w$ ne stane.
\end{itemize}
Jezična funkcija $\varphi$ je \emph{Turing-izračunljiva} ako postoji Turingov stroj koji je računa.
\end{definicija}
Kao i za RAM-model, mogli bismo dokazati da za svaki Turingov stroj $\mathcal T$ i njegov ulaz $w$ postoji jedinstveno $\mathcal T$\!-izračunavanje s $w$, ali ne i da svaki Turingov stroj računa neku jezičnu funkciju. Traka u završnoj konfiguraciji ne mora biti oblika $v\bl\ldots$ za $v\in\Sigma^*$: može sadržavati znakove iz $\Gamma_+\!\setminus\Sigma$, ili sadržavati neki znak iz $\Sigma$ nakon prve praznine. Za takve "patološke" Turingove strojeve nećemo reći da računaju ikakvu funkciju --- zapravo ih nećemo uopće promatrati, ali ako želimo iskazati neku tvrdnju univerzalno po svim Turingovim strojevima, dobro je imati na umu da i takvi postoje.
%\subsection{Primjer Turing-izračunavanja}
\begin{primjer}[{name=[funkcija koja riječi parne duljine preslikava u prvu polovicu]}]\label{pr:pola}
Nad $\Sigma:=\{\t a,\t b\}$ promotrimo funkciju $\varphi_h:\Sigma^*\rightharpoonup\Sigma^*$, čija je domena skup svih riječi parne duljine, a $\varphi_h(\alpha_1\alpha_2\dotsm\alpha_{2k}):=\alpha_1\alpha_2\dotsm\alpha_k$ (prva polovica riječi).
Primjerice, za $w_1:=\t{aababa}$ vrijedi $\dulj{w_1}=6$, pa je $w_1\in\dom{\varphi_h}$\! te $\varphi_h(w_1)=\t{aab}$.
S druge strane, za $w_2:=\t{bbb}$ vrijedi $\dulj{w_2}=3$, pa $w_2\notin\dom{\varphi_h}$.
Funkcija $\varphi_h$ je Turing-izračunljiva: računa je Turingov stroj
\begin{equation}
\mathcal T_h:=(\{\textsc a,\textsc b,\textsc c,\textsc d,\textsc e,\textsc f\},\Sigma,\{\bl,\t a,\t b,\t c,\t d\},\bl,\delta_h,\textsc a,\textsc e)\text,
\end{equation}
čija je funkcija prijelaza (kao konačna funkcija) zadana tablicom
\begin{equation}\label{eq:deltapola}
\begin{array}{c|ccccc}
\delta_h &\bl &\t a &\t b &\t c &\t d \\\hline
\textsc a&(\textsc e,\bl,+1)&(\textsc b,\t c,+1)&(\textsc b,\t d,+1)&(\textsc f,\t c,-1)&(\textsc f,\t d,-1)\\
\textsc b&(\textsc c,\bl,-1)&(\textsc b,\t a,+1)&(\textsc b,\t b,+1)&(\textsc f,\t c,-1)&(\textsc f,\t d,-1)\\
\textsc c&(\textsc f,\bl,-1)&(\textsc d,\bl ,-1)&(\textsc d,\bl ,-1)&(\textsc f,\t c,-1)&(\textsc f,\t d,-1)\\
\textsc d&(\textsc f,\bl,-1)&(\textsc d,\t a,-1)&(\textsc d,\t b,-1)&(\textsc a,\t a,+1)&(\textsc a,\t b,+1)\\
\textsc f&(\textsc f,\bl,-1)&(\textsc f,\t a,-1)&(\textsc f,\t b,-1)&(\textsc f,\t c,-1)&(\textsc f,\t d,-1)
\end{array}\text.
\end{equation}
Kao što vidimo, takav način zadavanja Turingova stroja nije naročito čitljiv --- zato se obično crtaju dijagrami. Recimo, $\mathcal T_h$ bismo mogli prikazati dijagramom
\begin{equation}
\begin{tikzpicture}[baseline=(D)]\label{dia:Th}
\node[state,initial] (A) {$\textsc a$};
\node[state,right of=A] (B) {$\textsc b$};
\node[state,below of=B] (C) {$\textsc c$};
\node[state,left of=C] (D) {$\textsc d$};
\node[state,accepting,above left of=D] (E) {$\textsc e$};
\draw
(A) edge[below] node{\bl} (E)
(A) edge node[above]{\t a:\t c} node[below]{\t b:\t d} (B)
(B) edge[loop right] node{$\Sigma$} (B)
(B) edge[dashed,right] node{\bl} (C)
(C) edge[dashed] node[above]{\t a:\bl} node[below]{\t b:\bl} (D)
(D) edge[right] node[align=center]{\t c:\t a\\\t d:\t b} (A)
(D) edge[dashed,loop left] node{$\Sigma$} (D)
;
\end{tikzpicture}\text.
\end{equation}
Recimo ponešto o konvencijama pri crtanju takvih dijagrama. Crtamo konačni usmjereni graf, čiji su vrhovi stanja, a bridovi su prijelazi. Opće pravilo je da se prijelaz $\delta(p,\alpha)=(q,\beta,d)$ prikazuje kao strelica od vrha $p$ prema vrhu $q$, na kojoj piše $\alpha\mathord:\beta$. Strelicu crtamo kao punu ako je $d=1$ (pomak udesno), a kao iscrtkanu ako je $d=-1$ (pomak ulijevo).
Više prijelaza s istim $p$, $q$ i $d$ prikazujemo strelicom s više oznaka $\alpha_1\mathord:\beta_1,\dotsc,\alpha_k\mathord:\beta_k$. Ako se znak ne mijenja ($\alpha=\beta$), umjesto $\alpha\!:\!\alpha$ pišemo samo $\alpha$. Oznaku za skup $S\subseteq\Gamma$ možemo napisati na brid umjesto pojedinih elemenata (kao što smo na dijagramu učinili sa $\Sigma$).
Početno stanje označavamo "strelicom niotkud" --- kako je na dijagramu označeno stanje $\textsc a$. Završno stanje označavamo dvostrukim krugom --- kako je na dijagramu označeno stanje $\textsc e$. I još jedno pravilo koje bitno povećava preglednost dijagrama: ne pišemo stanja ni prijelaze koji više ne mogu voditi do završnog stanja. Običaj je prilikom konstrukcije Turingova stroja imati jedno stanje $q_x$ (za $\mathcal T_h$ to je $\textsc f$), takvo da $\delta$ svaku "nemoguću situaciju" $(q,\alpha)$ preslika u $(q_x,\alpha,-1)$. Specijalno to vrijedi i za $q=q_x$ (za sve $\alpha\in\Gamma$) pa Turingov stroj, ako se ikad nađe u nekoj od tih nedozvoljenih konfiguracija, više nikada neće stati.
Efektivno, to je "stanje greške" koje ne moramo (kao ni prijelaze prema njemu) crtati na dijagramu: podrazumijevamo da riječi za koje se dogodi neka od tih "nemogućih situacija" nisu u domeni funkcije koju Turingov stroj računa. Važno je da ne mora vrijediti obrat: Turingov stroj ne mora nikada ući u stanje $q_x$, a da ipak nikada ne stane. Možemo to usporediti s instrukcijom RAM-stroja $i.\;\goto\;i$ --- ako $\textsc{pc}$ ikad postane $i$, RAM-stroj sigurno ne stane, ali može ne stati i na druge načine.
Konfiguracije Turingova stroja u konkretnom izračunavanju obično se označavaju skraćeno: ispod trenutno čitanog znaka napišemo trenutno stanje, odnosno umjesto $\bigl(q,n,(t_m)_{m\in\N}\bigr)$ pišemo $t_0t_1\ldots\smash{\underset{q}{t_n}}t_{n+1}\ldots$ --- u takvom zapisu ne pišemo (ali podrazumijevamo) $\bl\ldots$ na kraju.
Koristeći tu notaciju, početna konfiguracija $\mathcal T_h$ s ulazom $\t{abaa}$ je $\underset{\textsc a}{\t a}\t{baa}$. \\
Tada je $\mathcal T_h$-izračunavanje s $\t{abaa}$
\begin{multline}
\underset{\textsc a}{\t a}\t{baa}\leadsto
\t c\underset{\textsc b}{\t b}\t{aa}\leadsto
\t{cb}\underset{\textsc b}{\t a}\t a\leadsto
\t{cba}\underset{\textsc b}{\t a}\leadsto
\t{cbaa}\underset{\textsc b }{\bl}\leadsto
\t{cba}\underset{\textsc c}{\t a}\leadsto
\t{cb}\underset{\textsc d}{\t a}\leadsto
\t{c}\underset{\textsc d }{\t b}\t{a}\leadsto
\underset{\textsc d}{\t c }\t{ba}\leadsto\\
\leadsto\t{a}\underset{\textsc a}{\t b}\t{a}\leadsto
\t{ad}\underset{\textsc b}{\t a}\leadsto
\t{ada}\underset{\textsc b}{\bl}\leadsto
\t{ad}\underset{\textsc c}{\t a}\leadsto
\t{a}\underset{\textsc d}{\t d}\leadsto
\t{ab}\underset{\textsc a}{\bl}\leadsto
\t{ab}\bl\underset{\textsc e}{\bl}\lcirclearrowleft\!\text,
\end{multline}
iz čega se vidi izlazni podatak $\t{ab}=\varphi_h(\t{abaa})$. S druge strane, $\mathcal T_h$-izračunavanje s $\t{aba}$
\begin{multline}
\underset{\textsc a}{\t a}\t{ba}\leadsto
\t{c}\underset{\textsc b}{\t b}\t{a}\leadsto
\t{cb}\underset{\textsc b }{\t a}\leadsto
\t{cba}\underset{\textsc b}{\bl}\leadsto
\t{cb}\underset{\textsc c}{\t a}\leadsto
\t{c}\underset{\textsc d}{\t b}\leadsto
\underset{\textsc d}{\t c}\t{b}\leadsto
\t{a}\underset{\textsc a}{\t b}\leadsto
\t{ad}\underset{\textsc b}{\bl}\leadsto
\t{a}\underset{\textsc c}{\t d}\leadsto
\t{}\underset{\textsc f}{\t a}\t d\leadsto
\t{}\underset{\textsc f}{\t a}\t d\leadsto\dotsb%\;\text,
\end{multline}
očito ne stane, što je u skladu s tim da $\t{aba}\notin\dom{\varphi_h}$ (jer je $\dulj{\t{aba}}=3$ neparan broj).
\end{primjer}
%\section{Prateće funkcije jezičnih funkcija}%\label{sec:tikp}
\subsection{Prateće funkcije}
Kao što je već najavljeno, cilj je pokazati ekvivalentnost Turing-modela s RAM-modelom i funkcijskim modelom izračunljivosti. Za početak ćemo koristeći pristup sličan onome iz poglavlja~\ref{ch:univ} dokazati da su Turing-izračunljive jezične funkcije "parcijalno rekurzivne".
Prvo moramo precizirati što to znači. Neka je $\Sigma$ abeceda i $\varphi$ jezična funkcija nad njom. Očito $\varphi$ ne možemo dobiti kompozicijom, primitivnom rekurzijom i minimizacijom iz inicijalnih (brojevnih) funkcija. I da smislimo neke "inicijalne jezične funkcije", kompozicija je jasna (čak jednostavnija nego u brojevnom slučaju, jer su sve funkcije jednomjesne), ali kako definirati primitivnu rekurziju kad sljedbenik riječi nije jedinstven? Kako definirati minimizaciju kad kanonski leksikografski uređaj na $\Sigma^*$ nije dobar uređaj? Kako uopće definirati izračunljive jezike ("relacije") kad karakteristična funkcija jezika nije ni brojevna ni jezična funkcija?
Sve su to problemi o kojima smo već govorili, ponajviše u uvodu; no sada znamo dovoljno o kodiranju da nas to ne treba previše obeshrabriti. Kodirat ćemo $\Sigma^*$ nekom funkcijom $\sigma:=\N\Sigma^*$ (po uzoru na kodiranje $\N^*$ označavamo $\kr w:=\sigma(w)$) te ćemo pomoću tog kodiranja definirati prateću funkciju $\N\varphi=\sigma\circ\varphi\circ\sigma^{\,-1}$, za koju znamo što znači da je parcijalno rekurzivna.
Štoviše, pazit ćemo da $\sigma$ bude \emph{bijekcija} između $\Sigma^*$ i $\N$, tako da će prateće funkcije totalnih funkcija biti opet totalne funkcije. Onda će i \emph{rekurzivne} jezične funkcije biti dobro definirane --- kao totalne izračunljive jezične funkcije, odnosno one čije su prateće funkcije rekurzivne.
%\subsection{Kodiranje znakova i riječi}\label{sec:kSigma}
Prvo kodirajmo abecedu $\Sigma$. Kako je to konačan skup iskoristit ćemo \texttt{enum}-tehniku, kao što smo napravili kod kodiranja tipova instrukcija RAM-stroja~\eqref{eq:enumIns}. Ovdje počinjemo brojiti od $1$ (želimo $0\nin\im{\N\Sigma}$) iz tehničkog razloga koji će uskoro biti jasan.
Mali filozofski problem je u tome što su elementi od $\Sigma$ "apstraktni znakovi" bez ikakve imanentne semantike i međusobnog odnosa, tako da ne možemo fiksirati jedan poredak kao što smo to učinili za tipove RAM-instrukcija. Ipak, za svaku konkretnu abecedu moći ćemo fiksirati kodiranje (\emph{encoding}), a za apstraktne abecede moći ćemo univerzalno kvantificirati tvrdnje u obliku "Za svako kodiranje od $\Sigma$~\ldots", podrazumijevajući ("Zermelov teorem za konačne skupove") da kodiranje \emph{postoji}. U praksi, znakovi će obično biti dio standarda Unikod, pa ih u nedostatku pametnijeg kriterija možemo poredati po rednim brojevima u Unikodu.
\begin{definicija}[{name=[kodiranje abecede]}]
Neka je $\Sigma$ abeceda. Označimo $b:=\card\Sigma$. %(taj broj zovemo \emph{baza} abecede $\Sigma$, iz razloga koji će uskoro postati jasan).
\emph{Kodiranje} od $\Sigma$ je bilo koja bijekcija $\N\Sigma:\Sigma\leftrightarrow[1\mspace{-1mu}\dd b]$.
\end{definicija}
% \subsection{Pomaknute baze i kodiranje riječi}
Sada bismo mogli kao u definiciji~\ref{def:kodProg} kodirati riječi kao kodove konačnih nizova kodova njihovih znakova --- ali to ne bi bilo bijektivno. Osim toga, kodovi RAM-instrukcija mogli su biti proizvoljno veliki, dok za fiksnu abecedu kodovi znakova mogu biti najviše $b$ --- što sugerira da nam je dovoljno jednostavnije kodiranje.
Najprirodnije kodiranje ograničenih nizova, toliko prirodno da možda nismo ni svjesni kako ga koristimo (za $b=10$) svaki put kad čitamo i pišemo višeznamenkaste brojeve, je \textbf{zapis u bazi} $b$. Problem su početne nule ($\mspace{1mu}(001121)_3=(1121)_3$), što smo riješili početkom kodiranja znakova od $1$, ali smo zato dobili uključenu gornju granicu. Možemo li doista imati zna\-men\-ku~$b$ u bazi $b$? Drugi problem su jednočlane abecede: obični pozicijski brojevni sustavi definiraju se samo za baze $b\ge2$. Postoji i unarni zapis, ali on nije pozicijski --- ili jest?
Zapravo, unarni zapis sasvim odgovara uobičajenom brojevnom zapisu u bazi $b$ za $b=1$: recimo, $(1111)_1=1\cdot1^3+1\cdot1^2+1\cdot1^1+1\cdot1^0=4$, i jedini problem je uključena gornja granica --- u bazi $1$ imamo znamenku $1$. Ali zato nemamo znamenku $0$, i ne smijemo je imati ako želimo jedinstvenost zapisa --- no to upravo rješava prvi problem: ne možemo imati nule na početku ako ih nemamo uopće.
\begin{definicija}[{name=[zapis broja u pomaknutoj bazi]}]
Neka je $b\in\N_+$, $n\in\N$ te $z_0,z_1,\dotsc,z_{n-1}\in[1\mspace{-1mu}\dd b]$. Zapis u \emph{pomaknutoj bazi} $b$ je %zapis
\begin{equation}\label{eq:pomakbaza}
(z_{n-1}\dotsm\mspace{2mu} z_0)_b:=\sum\nolimits_{i<n}z_i\cdot b^i\text,
\end{equation}
dakle isti kao obični zapis u bazi $b$, samo sa znamenkama iz $[1\mspace{-1mu}\dd b]$ umjesto iz $[0\dd b\rangle$.
\end{definicija}
\begin{lema}[{name=[egzistencija i jedinstvenost zapisa u pomaknutoj bazi]}]\label{lm:pomakbaza}
Za svaki $b\in\N_+$, svaki $x\in\N$ ima jedinstveni zapis u pomaknutoj bazi $b$.
\end{lema}
\begin{proof}
Dokaz egzistencije je isti kao i za običnu bazu $b$: uzastopno dijelimo $x$ s $b$ dok ne dobijemo nulu pa ostatke tih dijeljenja zapišemo obrnutim redom. Jedina razlika je što ovdje ostatci moraju biti između $1$ i $b$: ako $x$ nije djeljiv s $b$ ništa se ne mijenja, a ako jest smanjimo količnik za $1$. Recimo, $18$ podijeljeno s $3$ je $5$ i pomaknuti ostatak $3$. Pomaknuti ostatak je primitivno rekurzivna operacija, po primitivno rekurzivnoj verziji teorema o grananju.
\begin{equation}
\f{mod}'(x,b):=\begin{cases}
b,&b\mid x\\
x\bmod b,&\text{inače}
\end{cases}
\end{equation}
Za dokaz jedinstvenosti treba vidjeti da brojevi različitih duljina zapisa, kao i oni iste duljine zapisa koji se u nekoj znamenci razlikuju, moraju biti različiti. Obje te tvrdnje slijede iz
\begin{multline}
\label{eq:injNSz}
(tz_{m-1}z_{m-2}\dotsm z_1z_0)_b=
t\cdot b^m+z_{m-1}\cdot b^{m-1}+z_{m-2}\cdot b^{m-2}+\dotsb
+z_1\cdot b+z_0\le{}\\{}\le
t\cdot b^m+b\cdot b^{m-1}+b\cdot b^{m-2}+\dotsb+b\cdot b+b<
t\cdot b^m+b^m+1\cdot b^{m-1}+\dotsb+1\cdot b^2+1\cdot b+1
\le{}\\{}\le
(t+1)b^m+z_{m-1}'\cdot b^{m-1}+\dotsb
+z_2'\cdot b^2+z_1'\cdot b^1+z_0'\cdot b^0=
\bigl((t+1)z_{m-1}'\dotsm z_2'z_1'z_0'\bigr)_b
\end{multline}
--- prva za $t:=0$, a druga za $t:=(\text{prva znamenka slijeva u kojoj se zapisi razlikuju})$. %\\ Sama stroga nejednakost u~\eqref{eq:injNSz} dobije se iz
%\begin{multline}
%\end{multline}
To po tranzitivnosti zapravo znači da smo zapise poredali po duljini, a zapise iste duljine leksikografski (tzv\!.\ \emph{shortlex ordering}).
\end{proof}
\begin{primjer}[{name=[\emph{shortlex ordering} riječi nad dvočlanom abecedom]}]
\emph{Shortlex ordering} $\{\t a,\t b\}^*$ je: $\underset{0}{\varepsilon}$,
$\underset{1}{\t a}$,
$\underset{2}{\t b}$,
$\underset{3}{\t{aa}}$,
$\underset{4}{\t{ab}}$,
$\underset{5}{\t{ba}}$,
$\underset{6}{\t{bb}}$,
$\underset{7}{\t{aaa}}$,
$\underset{8}{\t{aab}}$,
$\underset{9}{\t{aba}}$,~\ldots.
\end{primjer}
\begin{definicija}[{name=[kodiranje riječi]}]
Neka je $\Sigma$ abeceda te $\N\Sigma$ njeno kodiranje.
Definiramo kodiranje skupa $\Sigma^*$ svih riječi nad $\Sigma$, s
\begin{equation}\label{eq:kodNSz}
\N\Sigma^*(w):=\kr{\alpha_{n-1}\dotsm\alpha_0}:=\bigl(\N\Sigma(\alpha_{n-1}\mspace{-1mu})\dotsm\mspace{1mu}\N\Sigma(\alpha_0)\bigr)_{b}=\sum\nolimits_{i<n}\N\Sigma(\alpha_i)\cdot b^i\text,
\end{equation}
za svaku riječ $w=\alpha_{n-1}\dotsm\alpha_0\in\Sigma^*$ (uz oznake $n:=\dulj{w}$ i $b:=\card\Sigma$).
\end{definicija}
\begin{primjer}[{name=[prateća funkcija jezične funkcije]}]
U primjeru~\ref{pr:pola} uveli smo abecedu $\Sigma=\{\t a,\t b\}$ i riječ $w_1=\t{aababa}$ nad njom. Za tu abecedu je $b=2$; fiksirajmo kodiranje $\N\Sigma(\t a):=1$, $\N\Sigma(\t b):=2$. Tada je $\kr{w_1}=(112121)_2=73$.
Također je $w_1\in\dom{\varphi_h}$, pa je $73\in\dom{\N\varphi_h}$; a iz $\varphi_h(w_1)=\t{aab}$ vidimo $\N\varphi_h(73)=\kr{\t{aab}}=(112)_2=8$.
Za broj $153$ pretvaranje u pomaknutu bazu $2$ daje
$\begin{smallmatrix}
153 & 76 & 37 & 18 & 8 & 3 & 1\\
1 & 2 & 1 & 2 & 2 & 1 & 1
\end{smallmatrix}$, dakle $153=(1122121)_2=\kr{\t{aabbaba}}$. Jer je $\dulj{\t{aabbaba}}=7$ neparan broj, $\t{aabbaba}\notin\dom{\varphi_h}$, pa $153\notin\dom{\N\varphi_h}$.
\end{primjer}
Za dekodiranje trebamo, analogno propoziciji~\ref{prop:lhpartprn}, duljinu zapisa te ekstrakciju pojedine znamenke u zadanoj pomaknutoj bazi. %Ipak, prvo to napravimo za obične zapise u bazi, jer je jednostavnije a trebat će nam. Nakon toga ćemo vidjeti što treba promijeniti za zapis u pomaknutoj bazi.
\begin{lema}[{name=[rad sa zapisima u pomaknutoj bazi]}]\label{lm:ldcpprn}
% Možda: umjesto specifikacije napraviti definiciju s točkicom (b=0->b=1)
Postoje primitivno rekurzivne funkcije $\f{slh}^2$, $\f{sdigit}^3$, $\f{sconcat}^3$ i $\f{sprefix}^3$,\newline takve da za sve $b\in\N_+$, za sve $m,n\in\N$ vrijedi:
\begin{labeling}{$\f{sconcat}(m,n,b)$}
\item[$\f{slh}(n,b)$] je duljina zapisa broja $n$ u pomaknutoj bazi $b$. \item[$\f{sdigit}(n,i,b)$] za $i<\f{slh}(n,b)$, je vrijednost $i$-te znamenke zapisa broja $n$ u pomaknutoj bazi $b$, gdje brojimo od nule slijeva.
\item[$\f{sconcat}(m,n,b)$] je broj čiji se zapis u pomaknutoj bazi $b$ dobije konkatenacijom istih takvih zapisa za $m$ i $n$ redom. Pišemo ga i kao $m\conc bn$.
\item[$\f{sprefix}(n,i,b)$] za $i\le\f{slh}(n,b)$, je broj čiji je zapis u pomaknutoj bazi $b$ prefiks (početak) duljine $i$ istog takvog zapisa broja $n$.
\end{labeling}
\end{lema}
%Za fiksni $b$, $\f{sconcat}(m,n,b)$ još pišemo $m\conc b n$, a $\f{Prefix}(m,n,b)$ pišemo $m\preceq_b n$.
\noindent\begin{align}
\label{eq:deflh}
\f{slh}(n,b)&:=(\mu t\le n)\big(\!
\textstyle\sum_{i\le t}\!b^i>n
\big)\\
\label{eq:defconcat}
\f{sconcat}(m,n,b)&:=m\conc bn:=m\cdot b^{\,\f{slh}(n,b)}+n\\
\label{eq:defprefix}
\f{sprefix}(n,i,b)&:=(\mu m\le n)(\exists t\le n)\bigl(n=m\conc bt\land\f{slh}(m,b)=i\bigr)\\
\label{eq:defdigit}
\f{sdigit}(n,i,b)&:=\f{mod}'\bigl(\f{sprefix}\bigl(n,\f{Sc}(i),b\bigr),b\bigr)
\end{align}
\begin{proof}
Za $\f{slh}$, treba uočiti da zapis\=a duljine $i$ ima točno $b^i$. Dakle, samo trebamo zbrajati takve brojeve dok ne prijeđemo $n$. Očito je $\f{slh}(n,b)\le n$.~\eqref{eq:deflh}
Za konkatenaciju, $m$ pomaknemo udesno za duljinu od $n$, i pribrojimo $n$.~\eqref{eq:defconcat}
Pomoću konkatenacije možemo dobiti $\f{sprefix}$: prefiks je ono što se može konkatenirati s nečim tako da se dobije početni zapis $n$. Očito su dijelovi manji ili jednaki $n$.~\eqref{eq:defprefix} %I ovdje: podriječ ima manji kod.
Sada možemo napisati i $\f{sdigit}$: to je zadnja znamenka onog prefiksa čija je duljina za jedan veća od pozicije znamenke.~\eqref{eq:defdigit}
%Sve te funkcije su primitivno rekurzivne, koristeći dosadašnje rezultate.
\end{proof}
\begin{propozicija}[{name=[bijektivnost kodiranja riječi]}]\label{pp:bijkr}
Neka je $\Sigma$ abeceda s kodiranjem $\N\Sigma$.
Tada je $\N\Sigma^*$ bijekcija između $\Sigma^*$ i $\N$.
\end{propozicija}
\begin{proof}
Označimo $b:=\card\Sigma$. Ako je $w\ne w'$ za $w,w'\in\Sigma^*$, tada su $w$ i $w'$ ili različitih duljina (pa je $\f{slh}(\kr w,b)\ne\f{slh}(\kr{w'},b)$), ili su jednake duljine ali se na nekom mjestu razlikuju (pa je $\f{sdigit}(\kr w,i,b)\ne\f{sdigit}(\kr{w'},i,b)$ za neki $i$).
U svakom slučaju $\kr w\ne\kr{w'}$, pa je $\N\Sigma^*$ injekcija.
Za surjektivnost, neka je $x\in\N$ proizvoljan. Prema lemi~\ref{lm:pomakbaza}, postoje znamenke $\vec z\in[1\mspace{-1mu}\dd b]^*$ takve da je $x=(\vec z)_b$. Ako sad za svaku $z_i$ označimo $\alpha_i:=\N\Sigma^{-\mspace{-2mu}1}(z_i)\in\Sigma$, riječ $\vec\alpha$ sastavljena od tih znakova ima upravo kod $x$.
\end{proof}
%Sada možemo formalno dokazati da Turing-izračunljivost jezične funkcije povlači parcijalnu rekurzivnost njene prateće funkcije.
\begin{definicija}[{name=[prateća funkcija jezične funkcije]}]\label{def:kodfi}
Neka je $\Sigma$ abeceda, $\N\Sigma$ njeno kodiranje te $\varphi:\Sigma^*\rightharpoonup\Sigma^*$ jezična funkcija nad njom. \emph{Prateća funkcija} od $\varphi$ je brojevna funkcija $\N\varphi$ s domenom $\N\Sigma^*[\dom\varphi]$, zadana s
\begin{equation}\label{eq:kodfidef}
\N\varphi(\kr{w}):\simeq\kr{\varphi(w)}\text.
\end{equation}
Kako je svaki prirodni broj kod jedinstvene riječi iz $\Sigma^*$, definicija je dobra.
\end{definicija}
\subsection{Kodiranje stanja, trake i funkcije prijelaza}
Kroz čitavu ovu točku imat ćemo fiksiranu abecedu $\Sigma_0$, njeno kodiranje $\N\Sigma_0$ uz oznaku $b':=\card\Sigma_0$, Turing-izračunljivu jezičnu funkciju $\varphi_0$ nad $\Sigma_0$ te fiksni Turingov stroj $\mathcal T_0=(Q_0,\Sigma_0,\Gamma_0,\bl,\delta_0,q_0,q_z)$ koji je računa. Cilj će nam biti, kodirajući komponente i izračunavanje stroja $\mathcal T_0$, dokazati da je $\N\varphi_0$ parcijalno rekurzivna funkcija. To je slično pristupu u poglavlju~\ref{ch:univ}, samo je jednostavnije jer ne moramo pisati interpreter za proizvoljni RAM-program zadan kodom, već samo "ručno" prevesti jedan konkretni Turingov stroj $\mathcal T_0$ u funkcijski jezik.
%\subsection{Kodiranje stanja, radne abecede i trake}
Prvo kodirajmo skup $Q_0$. Kako se radi o konačnom skupu, možemo jednostavno staviti $a:=\card Q_0$ i fiksirati bijekciju $\N Q_0:Q_0\leftrightarrow[0\dd a\rangle$. Za konstruktor trebamo samo fiksirati kod početnog stanja --- prirodnim se čini definirati $\N Q_0(q_0):=0$ --- a što se komponenata tiče, sve što trebamo je usporedba s $q_z$, što ćemo dobiti ako i njegov kod bude fiksni broj --- recimo, $\N Q_0(q_z):=1$.
Hm, hoće li onda $\N Q_0$ biti dobro definirana: što ako je $q_0=q_z$? Definicija Turingova stroja ne sprečava tu mogućnost.
Ipak, $q_0\ne q_z$ smijemo pretpostaviti bez smanjenja općenitosti.
\begin{lema}[{name=[možemo pretpostaviti $q_0\ne q_z$]}]\label{lm:bsomp-q0neqz}
Za svaki Turingov stroj $\mathcal T$ koji računa neku jezičnu funkciju $\varphi$, postoji \emph{ekvivalentni} (računa istu funkciju $\varphi$) Turingov stroj $\mathcal T'$, kojem se početno i završno stanje razlikuju.
\end{lema}
\begin{proof}
Ako već u $\mathcal T$ vrijedi $q_0\ne q_z$, stavimo $\mathcal T':=\mathcal T$. Inače vrijedi $q_0=q_z$ i tvrdimo da je tada $\varphi$ identiteta na $\Sigma^*$. Doista, za svaku riječ $w\in\Sigma^*$, početna konfiguracija stroja $\mathcal T$ s ulazom $w$, $(q_0,0,w\bl\ldots)=(q_z,0,w\bl\ldots)$, ujedno je i završna konfiguracija, pa izračunavanje uvijek stane ($\varphi$ je totalna) i iz završnog oblika trake čitamo $\varphi(w)=w$.
Dakle, sad samo trebamo konstruirati Turingov stroj s različitim početnim i za\-vrš\-nim stanjem, koji računa identitetu. Jedan takav je
\begin{align}
\mathcal T'&:=(\{0,1\},\Sigma,\Sigma\cup\{\bl\},\bl,\delta',0,1)\text,\\
%\shortintertext{gdje je}
\delta'(0,\alpha)&:=(1,\alpha,1)\text{ za sve $\alpha\in\Sigma\cup\{\bl\}$.}
\end{align}
Tada za svaku $w\in\Sigma^*$, $\mathcal T'$\!-izračunavanje s $w$ je $(0,0,w\bl\ldots)\leadsto(1,1,w\bl\ldots)\lcirclearrowleft$, odakle je izlazni podatak opet $w$, odnosno $\mathcal T'$ računa identitetu.
\end{proof}
Slično možemo kodirati i $\Gamma_0$ --- ali kako već imamo kodiranje skupa $\Sigma_0\subset\Gamma_0$, želimo da znakovi ulazne abecede imaju iste kodove. Stoga označimo $b:=\card\Gamma_0$ i proširimo bijekciju $\N\Sigma_0:\Sigma_0\leftrightarrow[1\mspace{-1mu}\dd b']$ do bijekcije $\N\Gamma_0:\Gamma_0\leftrightarrow[0\dd b\rangle$, tako da $\bl$ preslikamo u $0$, a ostale elemente iz $\Gamma_0\!\setminus\Sigma_0$ bijektivno u skup $\langle b'\dd b\rangle$.
Ovaj put smo upotrijebili nulu, kao $\N\Gamma_0(\bl)$. To opravdava frazu "traka je s konačnim nosačem" (praznine su kodirane nulama, pa ne-nul\=a ima konačno mnogo), a bit će esencijalno i za kodiranje trake. Naime, sada imamo sličan problem kao sa stanjem registara RAM-stroja: da bismo kodirali proizvoljnu traku, moramo nekako skupiti kodove beskonačno mnogo ćelija, ali takve da su svi osim konačno mnogo njih jednaki~$0$. Alternativno, želimo "kodiranje" konačnih nizova, ali takvo da dodavanje nule na kraj ne promijeni kod.
U slučaju RAM-registara to smo riješili rastavom na prim-faktore, odnosno malom modifikacijom kodiranja $\N^*$ --- umjesto od $1$, eksponenti su išli od $0$. Možemo li ovdje naći neku malu modifikaciju kodiranja $\Sigma^*$ (zapis u bazi) da dobijemo analogni rezultat?
Možemo, i slična ideja funkcionira: kontraprimjer za injektivnost preslikavanja koje broji znakove od $0$ bit će upravo putokaz kako treba napisati kodiranje trake. Umjesto od $1$, znamenke će ići od $0$. Tamo smo rekli da je $(001121)_3=(1121)_3=43$, no to upravo znači da je broj $43$ prirodno gledati kao kod trake $\t{abaa\bl\bl\bl\ldots}=\t{abaa\bl\ldots}$ --- drugim riječima, ovdje imamo \textbf{obični zapis u (ne pomaknutoj$\mspace{1mu}$) bazi $b$}.
\begin{definicija}[{name=[kodiranje trake Turingova stroja]}]
Za proizvoljnu traku $t:\N\to\Gamma_0$ (koja je skoro svuda $\bl$), definiramo \emph{kod trake} \begin{equation}
\knk{t}=\knk{t_0t_1t_2\ldots\bl\bl\ldots}:=\sum_{i\in\N}\N\Gamma_0(t_i)\cdot b^i\text{, gdje je $b:=\card\Gamma_0$.}
\end{equation}
%(Usporedite s~\eqref{eq:defkreg}.)
Zbog konačnosti nosača i činjenice da je $\N\Gamma_0(\mspace{0.5mu}\bl)=0$, samo konačno mnogo članova tog "reda potencija" bit će pozitivno, pa je suma dobro definirana.
\end{definicija}
S ovom idejom postoje dvije smetnje pri konstrukciji početne konfiguracije. Prvo, \textbf{moramo promijeniti bazu} iz $\card\Sigma_0=b'$ u $\card\Gamma_0=b$, jer na traci se mogu naći i znakovi s većim kodovima, kao i praznina (\textbf{uvijek je $b>b'$}, zbog $\Gamma\supset\Sigma$). Drugo, u zapadnom svijetu pišemo riječi slijeva nadesno (i tako doživljavamo traku), ali smo zapis brojeva preuzeli iz arapskog jezika koji se piše u suprotnom smjeru. Zato dodavanje nule \emph{slijeva} u zapis broja u bazi $b$ odgovara dodavanju prazne ćelije \emph{zdesna} pri pomaku udesno od zadnje posjećene ćelije.
Računarci s iskustvom mrežnog programiranja znaju za taj problem. Radi se o \emph{byteorder}-dilemi, sasvim analognoj upravo opisanom problemu, iz sličnih razloga. Većina modernih procesora pamti višebajtne podatke tako da na početnoj adresi podatka stoji najmanje značajni bajt, jer se jedino tako postiže neovisnost o veličini ćelije %se na taj način semantika \emph{casta} pokazivača podudara sa semantikom \emph{casta} pokazanih vrijednosti. Nakon \texttt{int x=0x61626364;}, izraz \texttt{(char)x} ima vrijednost \texttt{0x64}, pa bi se moglo očekivati da i \texttt{*(char*)\&x} ima istu vrijednost. (Gledano s druge strane,
(nakon \texttt{y=25;} na adresi \texttt{\&y} je bajt $25$, neovisno o tome je li varijabla \texttt y tipa \texttt{char}, \texttt{int} ili \texttt{long~long}), što pojednostavljuje računanje. %kojeg je \texttt y tipa.) %No to je jedino moguće ako se \texttt x stavlja na adrese $[p\dd p+\texttt{sizeof x}\rangle$ tako da se na adresu $p$ stavi bajt \texttt{0x64}, na adresu $p+1$ bajt \texttt{0x63} (za \emph{cast} u \texttt{short}),~\ldots, odnosno "obrnutim" redom (\emph{little-endian}).
No taj redoslijed (\emph{little-endian}) je obrnut u odnosu na to kako smo navikli pisati brojeve u dekadskom zapisu --- i kako smo uostalom napisali taj broj (\t2 pa onda \t5) u naredbi koja inicijalizira \texttt y. To posebno dolazi do izražaja pri mrežnom programiranju: standardi propisuju da se višebajtni brojevi preko mreže prenose redoslijedom \emph{big-endian}, kako bi bilo lakše pratiti što se događa u slučaju greške. Zato mnoge standardne biblioteke imaju funkcije (\texttt{ntoh}/\texttt{hton}) za pretvaranje redoslijeda bajtova iz mrežnog (čitljivijeg) u procesorski (operativniji) i obrnuto. Mi ćemo napraviti slično, usput prenoseći zapis iz jedne baze u drugu.
\begin{lema}[{name=[primitivna rekurzivnost \emph{input\slash output} sustava trake]}]\label{lm:recodeprn}
Postoji primitivno rekurzivna funkcija $\f{Recode}^3$ takva da za svaku riječ $w\in\Sigma_0^*$ vrijede jednakosti
\begin{align}
\SwapAboveDisplaySkip
\label{eq:recodein}\f{Recode}\bigl(\kr w,b',b\bigr)&=\knk{w\bl\ldots}\text,\\
\label{eq:recodeout}\f{Recode}\bigl(\knk{w\bl\ldots},b,b'\bigr)&=\kr w\text.
\end{align}
\end{lema}
\begin{proof}
Kao što smo već rekli, $\f{Recode}(n,b_1,b_2)$ samo treba ekstrahirati znamenke od $n$ u bazi $b_1$ te ih slagati obrnutim redom u bazi $b_2$. Kako je $w\in\Sigma_0^*$, u zapisu nema znamenke $0$, pa
možemo koristiti funkcije $\f{slh}$ i $\f{sdigit}$ bez obzira na to je li baza $b_1$ pomaknuta.
\begin{equation}
\f{Recode}(n,b_1,b_2):=\quad\sum_{\mathclap{i\,<\,\f{slh}(n,b_1\mspace{-1mu})}}\f{sdigit}(n,i,b_1\mspace{-1mu})\cdot{b_2}^i
\end{equation}
Neka je $w=\alpha_0\alpha_1\dotsm\alpha_{l-1}\in\Sigma^*$ proizvoljna ($l:=\dulj{w}$). Tada, ako označimo $n:=\kr w$, vrijedi $\f{slh}(n,b')=l$ i $d_i:=\f{sdigit}(n,i,b')=\N\Sigma_0(\alpha_i)=\N\Gamma_0(\alpha_i)$ za sve $i<l$. Iz toga
\begin{equation}
\f{Recode}(n,b',b)=\sum_{i<l}d_i\cdot b^i=\sum_{i=0}^{l-1}\N\Gamma_0(\alpha_i)\cdot b^i=\knk{w\bl\ldots}\text,
\end{equation}
i analogno~\eqref{eq:recodeout}. Ključno je bilo da se $\N\Sigma_0$ i $\N\Gamma_0$ podudaraju na svim znakovima $\alpha\in\Sigma_0$.
Primitivna rekurzivnost slijedi iz lema~\ref{lm:sumprodrek} i~\ref{lm:ldcpprn} te primjera~\ref{pr:addmulpow}.
\end{proof}
\begin{primjer}[{name=[korištenje \emph{input\slash output} sustava trake]}]
Neka je $\Sigma:=\{\t a,\t b,\t c\}\subset\Gamma:=\{\bl,\t a,\t b,\t c,\t A,\t B,\t C\}$, neka je kodiranje zadano redom kojim su znakovi napisani, i neka je $w:=\t{bbc}$. Tada je $\kr w=(223)_3=27$ te $\knk{w\bl\ldots}=(322)_7=163$, dakle $\f{Recode}(27,3,7)=163$ i $\f{Recode}(163,7,3)=27$.
\end{primjer}
%\subsection{Kodiranje funkcije prijelaza}
Na redu je kodiranje funkcije prijelaza $\delta_0$. Mogli bismo se zabrinuti, znajući koliko kodiranje funkcija može biti komplicirano (sjetite se indeksa). Ali $\delta_0$ je \emph{konačna} funkcija (\emph{lookup table}), pa zapravo neće biti problema.
Prvo, $\delta_0$ je funkcija s dva ulaza i tri izlaza, tako da je zapravo kodiramo kroz tri dvomjesne koordinatne funkcije (napomena~\ref{nap:brip}). Drugo, već imamo kodiranja za ulaze i prva dva izlaza, $\N Q_0:Q_0\leftrightarrow[0\dd a\rangle$ i $\N\Gamma_0:\Gamma_0\leftrightarrow[0\dd b\rangle$, samo još trebamo kodirati pomake. Kako oni već jesu "numerički" u $\mathbb Z$, najlakše ih je samo povećati za $1$ da upadnu u $\N$, tako da "pomak ulijevo" $-1$ kodiramo brojem $0$, a "pomak udesno" $1$ kodiramo brojem $2$.
\begin{lema}[{name=[primitivna rekurzivnost funkcije prijelaza]}]\label{lm:newssdprn}
Postoje primitivno rekurzivne funkcije $\f{newstate}$, $\f{newsymbol}$ i $\f{direction}$ koje preslikavaju $\bigl(\N Q_0(q),\N\Gamma_0(\gamma)\bigr)$ redom u $\N Q_0(q')$, $\N\Gamma_0(\gamma')$ i $1+d$, gdje je
$(q',\gamma',d):=\begin{smallcases}
\delta_0(q,\gamma),& q\ne\mspace{1mu} q_z\\
(q,\gamma,0),&\text{inače}\end{smallcases}\!$.
\end{lema}
\begin{proof}
Za proizvoljni par $(k,g)\in[0\dd a\rangle\times[0\dd b\rangle$, ako je $k\ne 1$ označimo $(q',\gamma',d):=\delta_0\bigl(\N Q_0^{-\mspace{-2mu}1}(k),\N\Gamma_0^{-\mspace{-2mu}1}(g)\bigr)$ te definirajmo $\f{newstate}(k,g):=\N Q_0(q')$, $\f{newsymbol}(k,g):=\N\Gamma_0(\gamma')$ i $\f{direction}(k,g):=1+d$. Također, za $k=1$, za svaki $g\in[0\dd b\rangle$, dodefinirajmo $\f{newstate}(1,g):=\f{direction}(1,g):=1$ i $\f{newsymbol}(1,g):=g$.
Koliko god to komplicirana pravila bila, njima definirane funkcije su konačne (sve tri imaju domenu $[0\dd a\rangle\times[0\dd b\rangle$ s $ab$ elemenata), pa prema korolaru~\ref{kor:kon0} za svaku od njih postoji primitivno rekurzivna funkcija koja se s njom podudara na $[0\dd a\rangle\times[0\dd b\rangle$ (proširenje nulom). Sada je iz definicije tih triju funkcija jasno da vrijedi tvrdnja leme (sjetimo se, $1=\N Q_0(q_z)$, a $[0\dd a\rangle$ i $[0\dd b\rangle$ su slike od $\N Q_0$ i $\N\Gamma_0$ redom).
\end{proof}
\begin{primjer}[{name=[kodirana tablica prijelaza]}]\label{pr:polatable}
U primjeru~\ref{pr:pola} smo vidjeli funkciju prijelaza $\delta_h$, definiranu s~\eqref{eq:deltapola}. \\ Ako stanja i znakove kodiramo kao
%\begin{equation}
$
\begin{array}{r|cccccc}
Q_h& \textsc a& \textsc b& \textsc c& \textsc d& \textsc e& \textsc f \\\hline
\N Q_h& 0 & 3 & 4 & 5 & 1 & 2
\end{array}\text{ i }
\begin{array}{r|cc|ccc}
\Gamma_h& \t a & \t b & \t c & \t d & \bl \\\hline
\N\Gamma_h & 1 & 2 & 3 & 4 & 0
\end{array}
$,\\
%\end{equation}
tada su funkcije $\f{newstate}$, $\f{newsymbol}$ i $\f{direction}$ redom zadane tablicama
\begin{equation}
\begin{array}{r|ccccccc}
%\f{newstate}
&0&1&2&3&4&5&\cdots\\\hline
0& 1 & 3 & 3 & 2 & 2 & \multicolumn{1}{|c}{0} & \cdots\\
1& 1 & 1 & 1 & 1 & 1 & \multicolumn{1}{|c}{0} & \cdots\\
2& 2 & 2 & 2 & 2 & 2 & \multicolumn{1}{|c}{0} & \cdots\\
3& 4 & 3 & 3 & 2 & 2 & \multicolumn{1}{|c}{0} & \cdots\\
4& 2 & 5 & 5 & 2 & 2 & \multicolumn{1}{|c}{0} & \cdots\\
5& 2 & 5 & 5 & 0 & 0 & \multicolumn{1}{|c}{0} & \cdots\\ \cline{2-6}
6& 0 & 0 & 0 & 0 & 0 & 0 & \cdots\\
\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\ddots
\end{array}\;\text,\;\;
\begin{array}{r|ccccccc}
%\f{newsymbol}
&0&1&2&3&4&5&\cdots\\\hline
0& 0 & 3 & 4 & 3 & 4 & \multicolumn{1}{|c}{0} & \cdots\\
1& 0 & 1 & 2 & 3 & 4 & \multicolumn{1}{|c}{0} & \cdots\\
2& 0 & 1 & 2 & 3 & 4 & \multicolumn{1}{|c}{0} & \cdots\\
3& 0 & 1 & 2 & 3 & 4 & \multicolumn{1}{|c}{0} & \cdots\\
4& 0 & 0 & 0 & 3 & 4 & \multicolumn{1}{|c}{0} & \cdots\\
5& 0 & 1 & 2 & 1 & 2 & \multicolumn{1}{|c}{0} & \cdots\\ \cline{2-6}
6& 0 & 0 & 0 & 0 & 0 & 0 & \cdots\\
\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\ddots
\end{array}\;\text{ i }\;\;
%\end{equation}
%\begin{equation}
%\label{eq:directiontable}
\begin{array}{r|ccccccc}
%\f{direction}
&0&1&2&3&4&5&\cdots\\\hline
0& 2 & 2 & 2 & 0 & 0 & \multicolumn{1}{|c}{0} & \cdots\\
1& 1 & 1 & 1 & 1 & 1 & \multicolumn{1}{|c}{0} & \cdots\\
2& 0 & 0 & 0 & 0 & 0 & \multicolumn{1}{|c}{0} & \cdots\\
3& 0 & 2 & 2 & 0 & 0 & \multicolumn{1}{|c}{0} & \cdots\\
4& 0 & 0 & 0 & 0 & 0 & \multicolumn{1}{|c}{0} & \cdots\\
5& 0 & 0 & 0 & 2 & 2 & \multicolumn{1}{|c}{0} & \cdots\\ \cline{2-6}
6& 0 & 0 & 0 & 0 & 0 & 0 & \cdots\\
\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\ddots
\end{array}\text.\!\!\!\qedhere
\end{equation}
\end{primjer}
\subsection{Kodiranje Turing-izračunavanja}
Upravo dokazana lema~\ref{lm:newssdprn} donekle je analogna lemi~\ref{lm:NextRegCountprn}. Vrijeme je za analogon leme~\ref{lm:RegCountprn}. Za razliku od tih lema, koje su definirale \emph{uniformne} funkcije što su primale RAM-program kao argument, ove će se odnositi na fiksni Turingov stroj $\mathcal T_0$ --- jer je tako lakše, a ne treba nam puna općenitost; sve što će nam kasnije trebati su \emph{neki} indeksi izračunljivih funkcija, a njih smo dobili s RAM-strojevima.
\begin{lema}[{name=[primitivna rekurzivnost $\mathcal T_0$-izračunavanja]}]\label{lm:StateHeadTapeprn}
%Postoje primitivno rekurzivne dvomjesne funkcije $\f{State}$, $\f{Position}$ i $\f{Tape}$, takve da za svaku riječ $w\in\Sigma_0^*$, za svaki $n\in\N$, njihove vrijednosti u $(\kr w,n)$ kodiraju stanje, poziciju i traku konfiguracije Turingova stroja $\mathcal T_0$ nakon $n$ koraka izračunavanja s $w$.
Funkcije definirane sa
\begin{equation}
\f{State}(\kr w,n):=\N Q_0(q_n)\text,\quad
\f{Position}(\kr w,n):=p_n\text,\quad
\f{Tape}(\kr w,n):=\knk{t_n}\text,
\end{equation}
gdje je $\bigl((q_n,p_n,t_n)\bigr)_{n\in\N}$
$\mathcal T_0$-izračunavanje s $w$,
primitivno su rekurzivne.
\end{lema}
\begin{proof}
Kao i u dokazu leme~\ref{lm:RegCountprn}, upotrijebit ćemo simultanu primitivnu rekurziju. Za inicijalizaciju trebamo funkcije $\f G_1$, $\f G_2$ i $\f G_3$, koje daju vrijednosti traženih funkcija za $n=0$. Stanje počinje od $q_0$ kodiranog nulom, pozicija počinje od nule (lijevi rub), a traka počinje od $w\bl\ldots$, čiji kod se iz $x=\kr w$ može dobiti primjenom funkcije $\f{Recode}$.
\begin{equation}
\f G_1(x):=\f G_2(x):=0\text,\qquad
\f G_3(x):=\f{Recode}(x,b',b)\text.
\end{equation}
Dakle, $\f G_1=\f G_2=\f Z$ (inicijalna), a $\f G_3$ je primitivno rekurzivna po lemi~\ref{lm:recodeprn} i propoziciji~\ref{prop:konst}.
Za korak, trebamo funkcije $\f H_1$, $\f H_2$ i $\f H_3$, od kojih svaka prima po pet argumenata: kod riječi s kojom se računa $x=\kr w$, broj dosad napravljenih koraka izračunavanja $n$, kod prethodnog stanja $q=\N Q_0(q_n)$, prethodnu poziciju $p=p_n$ i kod prethodne trake $t=\knk{t_n}$. Redom trebaju vratiti $\N Q_0(q_{n+1})$, $p_{n+1}$ i $\knk{t_{n+1}\mspace{-2mu}}$. U tome će nam pomoći funkcije iz leme~\ref{lm:newssdprn}, ali na čemu ih pozvati? Prvi argument je kod trenutnog stanja $q$, a drugi je kod trenutno čitanog znaka $g$, koji možemo dobiti kao vrijednost znamenke od $t$ mjesne vrijednosti $b^p$. Ovdje ne možemo koristiti $\f{sdigit}$ jer se na traci mogu nalaziti i praznine, a i jer se mjesne vrijednosti broje zdesna u zapisu --- ali standardni postupak za ekstrakciju znamenke~\eqref{eq:exznamb} funkcionira.
Sada $\f H_1$ samo treba vratiti $\f{newstate}(q,g)$. $\f H_2$ treba vratiti $p$ pomaknut za $\f{direction}(q,g)$, ali za jedan manje jer smo pomake za $d$ kodirali s $d+1$. $\f H_3$ je najkompliciranija: treba $p$-tu znamenku u zapisu $t$ u bazi $b$ zamijeniti znamenkom vrijednosti $\f{newsymbol}(q,g)$. To radimo tako da od $t$ oduzmemo trenutnu mjesnu vrijednost te znamenke $g\cdot b^p$ pa dodamo mjesnu vrijednost nove. Dakle, primitivno rekurzivne funkcije
\begin{align}
\f H_1(x,n,q,p,t)&:=\f{newstate}(q,g)\text,\\
\f H_2(x,n,q,p,t)&:=\f{pd}\bigl(p+\f{direction}(q,g)\bigr)\text,\\
\f H_3(x,n,q,p,t)&:=t\dotminus g\cdot b^p+\f{newsymbol}(q,g)\cdot b^p\text,\\
\label{eq:exznamb}\text{uz pokratu }g&:=t\div b^p\bmod b\text,
\end{align}
zadovoljavaju specifikaciju s početka odlomka. Sada su $\f{State}$, $\f{Position}$ i $\f{Tape}$ definirane simultanom primitivnom rekurzijom iz $\f G_1$, $\f G_2$, $\f G_3$, $\f H_1$, $\f H_2$ i $\f H_3$, pa su primitivno rekurzivne po propoziciji~\ref{prop:simultrek}. Tvrdnju leme sada dokazujemo matematičkom indukcijom po $n$, sasvim analogno kao u RAM-modelu.
Za $n=0$, početno stanje je $q_0$, pa je $\f{State}(x,0)=\f G_1(x)=\f Z(x)=0=\N Q_0(q_0)$ doista njegov kod. Početna pozicija je $0=\f Z(x)=\f G_2(x)=\f{Position}(x,0)$. Početna traka je $w\bl\ldots$, čiji kod $\knk{w\bl\ldots}$ je prema~\eqref{eq:recodein} jednak $\f{Recode}(\kr w,b',b)=G_3(\kr w)=\f{Tape}(\kr w,0)$.
Sada pretpostavimo da je nakon $k$ koraka, $q:=\f{State}(\kr w,k)$ kod stanja, $p:=\f{Position}(\kr w,k)$ pozicija, a $t:=\f{Tape}(\kr w,k)$ kod trake stroja. Ako je ta konfiguracija završna, tada je $q=\N Q_0(q_z)=1$, pa prema definicijama iz leme~\ref{lm:newssdprn} vrijedi $\f{newstate}(q,g)=\f{direction}(q,g)=1$ i $\f{newsymbol}(q,g)=g$. Tada $\f H_1$ daje $q$, $\f H_2$ daje $\f{pd}(p+1)=\f{pd}\bigl(\f{Sc}(p)\bigr)=p$, a $\f H_3$ daje $t\dotminus g\cdot b^p+g\cdot b^p=t$ (jer je $g=t\div b^p\bmod b\le t\div b^p\le\frac{t}{b^p}$, pa je $g\cdot b^p\le t$, odnosno $\dotminus$ je zapravo $-$). Dakle $\f{State}(\kr w,k+1)=\f{State}(\kr w,k)$, i slično za $\f{Position}$ i $\f{Tape}$, odnosno završna konfiguracija ostaje ista, kao što i treba.
Ako ta konfiguracija nije završna, tad je $q\in[0\dd a\rangle\setminus\{1\}$, pa su vrijednosti $\f{newstate}$, $\f{newsymbol}$ i $\f{direction}$ zadane preko funkcije $\delta_0$ te predstavljaju upravo novo stanje, novi znak na trenutnoj poziciji i pomak na novu poziciju. Recimo, ako s $g$ označimo kod trenutno čitanog znaka, a s $d$ treću komponentu odgovarajuće vrijednosti $\delta_0(q,g)$, tada je $\f{direction}(q,g)=d+1$, pa je
\begin{multline}
\f{Position}(\kr w,k+1)=\f H_2\bigl(\kr w,k,\f{State}(\kr w,k),\f{Position}(\kr w, k),\f{Tape}(\kr w,k)\bigr)=\\
=\f H_2(\kr w,k,q,p,t)=
\f{pd}\bigl(p+\f{direction}(q,g)\bigr)=\f{pd}(p+d+1)=\\
=\max\,\{p+d+1-1,0\}=\max\,\{\f{Position}(\kr w,k)+d,0\}\text.
\end{multline}
Slično se dobiju i odgovarajuće vrijednosti za $\f{State}(\kr w,k+1)$ i $\f{Tape}(\kr w,k+1)$.
\end{proof}
%\subsection{Prepoznavanje završne konfiguracije i čitanje rezultata}
Pomoću funkcije $\f{State}^2$ možemo prepoznati završnu konfiguraciju --- u njoj će vrijednost te funkcije biti jednaka $\N Q_0(q_z)=1$. Štoviše, ako $\mathcal T_0$-izračunavanje s $w$ stane, tada je broj koraka nakon kojeg se to dogodi upravo najmanji broj za koji vrijedi ta jednakost. (Nemamo probleme kao u primjeru~\ref{pr:Final'}, jer nam je Turingov stroj fiksan i ne prenosimo ga kao kod, a svaki prirodni broj je kod neke riječi iz $\Sigma_0^*$.)
\begin{lema}[{name=[parcijalna rekurzivnost brojenja koraka do zaustavljanja]}]\label{lm:stopprek}
Funkcija $\f{stop}^1$\!, definirana sa
\begin{equation}
\f{stop}(\kr w):\simeq\text{"broj koraka nakon kojeg $\mathcal T_0$-izračunavanje s $w$ stane",}
\end{equation}
parcijalno je rekurzivna (s domenom $\dom{\f{stop}}=\dom{\N\varphi_0}=\{\kr w\mid w\in\dom{\varphi_0}\}=:\kr{\dom{\varphi_0}}$).
\end{lema}
\begin{proof}
Tvrdimo da je
\begin{equation}\label{eq:stopdef}
\f{stop}(x)\simeq\mu n\bigl(\f{State}(x,n)=1\bigr)
\end{equation}
dobivena minimizacijom primitivno rekurzivne relacije.
Neka je $x\in\N$ proizvoljan i označimo $w:=(\N\Sigma_0^*)^{-\mspace{-2mu}1}(x)$. Ako je $w\in\dom{\varphi_0}$, tada po definiciji~\ref{def:Tcomputefi} $\mathcal T_0$-izračunavanje s $w$ stane --- označimo s $n_0:=\f{stop}(x)$ broj koraka nakon kojeg se to dogodi. Prema lemi~\ref{lm:StateHeadTapeprn} vrijedi $\f{State}(x,n_0)=\N Q_0(q_z)=1$, ali isto tako za sve $n<n_0$ vrijedi $\f{State}(x,n)\ne 1$ --- jer stanje još nije završno, a $\N Q_0$ je injekcija. Dakle $n_0$ je jednak $\mu n\bigl(\f{State}(x,n)=1\bigr)$.
Ako pak $w\notin\dom{\varphi_0}$, tada $\mathcal T_0$-izračunavanje s $w$ ne stane, pa ne postoji $n\in\N$ takav da vrijedi $\f{State}(x,n)=1$ (opet, jer je $\N Q_0$ injekcija) te izraz $\mu n\bigl(\f{State}(x,n)=1\bigr)$ nema vrijednost, baš kao ni $\f{stop}(x)$.
\end{proof}
%Sada napokon možemo dokazati teorem zbog kojeg smo sve ovo radili.
\begin{teorem}[{name=[parcijalna rekurzivnost pratećih Turing-izračunljivih funkcija]}]\label{tm:tikp}
Neka je $\Sigma_0$ abeceda, $\N\Sigma_0$ njeno kodiranje te $\varphi_0$ Turing-izračunljiva funkcija nad njom. Tada je prateća funkcija $\N\varphi_0$ parcijalno rekurzivna.
\end{teorem}
\begin{proof}
Po pretpostavci, postoji Turingov stroj $\mathcal T_0=(Q_0,\Sigma_0,\Gamma_0,\bl,\delta_0,q_0,q_z)$ koji računa $\varphi_0$. Označimo $b':=\card\Sigma_0$ i $b:=\card\Gamma_0$. Primjenjujući na taj $\mathcal T_0$ sve što smo napravili u ovoj točki (kodiramo mu stanja, radnu abecedu u skladu s $\N\Sigma_0$, traku, funkciju prijelaza te izračunavanje s proizvoljnom riječju), dobijemo (među ostalim) funkcije $\f{Recode}$, $\f{Tape}$ i $\f{stop}$, sa svojstvima iz odgovarajućih lema. Tvrdimo da je
\begin{equation}\label{eq:kodfiprek}
\N\varphi_0(x)\simeq
\f{Recode}\bigl(\f{Tape}\bigl(x,\f{stop}(x)\bigr),b,b'\bigr)\text,
\end{equation}
pa je $\N\varphi_0$ parcijalno rekurzivna kao kompozicija takvih. Sama parcijalna jednakost~\eqref{eq:kodfiprek} je zapravo~\eqref{eq:kodfidef} iz definicije~\ref{def:kodfi}, samo izrečena u "izračunljivom obliku". Za svaki $x\in\N$ imamo dva slučaja ovisno o tome je li $w:=(\N\Sigma_0^*)^{-\mspace{-2mu}1}(x)\in\dom{\varphi_0}$.
Ako nije, tada $\N\varphi_0(x)$ nema vrijednost, a niti desna strana od~\eqref{eq:kodfiprek} nema vrijednost --- $\mathcal T_0$ računa $\varphi_0$, pa $w\notin\dom{\varphi_0}$ znači da $\mathcal T_0$-izračunavanje s $w$ ne stane. Tada $x\notin\dom{\f{stop}}$ prema lemi~\ref{lm:stopprek}, a onda po korolaru~\ref{kor:comptot} također $x$ nije ni u domeni desne strane.
Ako je pak $w\in\dom{\varphi_0}$, tada $\mathcal T_0$-izračunavanje s $w$ stane, a prema lemi~\ref{lm:stopprek} to se dogodi nakon $s:=\f{stop}(\kr w)=\f{stop}(x)$ koraka. Prema lemi~\ref{lm:StateHeadTapeprn}, kod trake završne konfiguracije je onda $t:=\f{Tape}(x,s)$, što je $\knk{\varphi_0(w)\bl\ldots}$ jer $\mathcal T_0$ računa $\varphi_0$. Sada je prema~\eqref{eq:recodeout} $\f{Recode}(t,b,b')=\kr{\varphi_0(w)}$, kao što i treba biti.
\end{proof}
\section{Pretvorba RAM-stroja u Turingov stroj}\label{sec:RAM>Turing}
Dokažimo sada obrat teorema~\ref{tm:tikp}. Za parcijalno rekurzivne funkcije imamo kompajler u RAM-strojeve, koji možemo iskoristiti i za kompiliranje u Turingove strojeve. U modernom računarstvu, dolaskom nove arhitekture često ne moramo iznova kompilirati izvorni kod. Ako već imamo kod na sličnoj razini (RAM-program), možemo ga neposredno prevesti ("transpilirati") u kompilirani kod za drugu arhitekturu. To ćemo učiniti ovdje.
Kroz čitavu ovu točku imat ćemo fiksiranu abecedu $\Sigma_0$, njeno kodiranje $\N\Sigma_0$, kodiranje $\sigma=\kr{\cdots}=\N\Sigma_0^*$ zapisom u pomaknutoj bazi $b=\card\Sigma_0$, jezičnu funkciju $\varphi_0$ nad $\Sigma_0$ takvu da je $\N\varphi_0\in\mathscr Comp_1$ te fiksni RAM-algoritam $P_0^1$ koji računa $\N\varphi_0$.
Cilj će nam biti konstruirati Turingov stroj $\mathcal T_0$ koji računa $\varphi_0$, tako da primi ulaz $w$ na traci, kodira ga u $x:=\kr w$, od toga konstruira početnu konfiguraciju RAM-stroja $\mathcal S_0$ s programom $P_0$ i ulazom $x$ ("\hspace{0.1pt}stavi $x$ u $\reg{\mspace{-1mu}1}\mspace{-2mu}$") te simulira redom korake $P_0$-izračunavanja s $x$. Ako\slash kad $\mathcal S_0$ uđe u završnu konfiguraciju $c$, $\mathcal T_0$ će sadržaj $y:=c(\reg0)$ "dekodirati" u riječ $v:=\varphi_0(w)$, obrisati ostatke izračunavanja s trake i premjestiti $v$ na početak. Ako se to nikad ne dogodi, $\mathcal T_0$ će vječno simulirati rad $\mathcal S_0$, odnosno nikad neće otići u završno stanje --- što i treba da bi računao $\varphi_0$, jer činjenica da $P_0$-izračunavanje s $\kr w$ ne stane znači da $w\notin\dom{\varphi_0}$. Efektivno, definiciju prateće funkcije smo "izvrnuli" iznutra van: $\N\varphi_0=\sigma\circ\varphi_0\circ\sigma^{\,-\!1}$ znači $\varphi_0=\sigma^{\,-\!1}\mspace{-2mu}\circ\N\varphi_0\circ\sigma$.
Stroj $\mathcal T_0$ ćemo konstruirati u pet dijelova (\emph{fragmenata}), koji provode razne faze opisanog postupka simulacije stroja $\mathcal S_0$. Da bismo ga opisali, potrebno je precizirati njegova stanja, radnu abecedu $\Gamma$ te prijelaze.
Stanja ćemo uvoditi implicitno i postepeno, specificiranjem funkcije $\delta$. Dodat ćemo još jedno stanje, stanje greške $q_x$, uz standardnu konvenciju da za bilo koji par $(q,\alpha)$ na kojem nismo eksplicitno definirali $\delta$, vrijedi $\delta(q,\alpha):=(q_x,\alpha,-1)$. To je samo birokratski detalj da bi $\delta$ bila totalna, jer $\mathcal T_0$ nikada neće otići u stanje $q_x$: jedini način da računa beskonačno dugo bit će da odgovarajuće $P_0$-izračunavanje ne stane.
U radnoj abecedi se očito moraju nalaziti svi znakovi iz $\Sigma_0$, kodirani po $\N\Sigma_0$ brojevima iz $[1\mspace{-1mu}\dd b]$. Za svaki $t\in[1\mspace{-1mu}\dd b]$ označimo s $\alpha_t:={\N\Sigma_0}^{-\mspace{-2mu}1}(t)$ odgovarajuću "znamenku". % označit ćemo s $\alpha_t$. Njima predstavljamo "znamenke" od $1$ do $b$ u pomaknutoj bazi $b$.
Za demarkaciju upotrijebljenog dijela trake koristimo graničnik~$\t\$$. Separator~$\t\#$ odvaja dio za ulaz od dijela za računanje (simulaciju). Traka će pri početku rada izgledati otprilike kao $\t\$\bl^*v\t\#u\bl\ldots$, a pri njegovu kraju kao $\t\$v\bl^*u\t\$\bl\ldots$, gdje je $v\in\Sigma_0^*$ dio za ulaz odnosno izlaz, a $u\in(B^m)^*$ dio za reprezentaciju konfiguracije od $\mathcal S_0$. Dakle
%\begin{equation}
$\Gamma:=\Sigma_0\dcup\{\t\$,\t\#\}\dcup B^m$,
%\end{equation}
gdje je $B^m$ skup koji ćemo kasnije definirati --- taj skup sadržavat će i prazninu $\bl$.
%\subsection{Inicijalizacija RAM-stroja}
Cilj prve faze je pomaknuti riječ za jednu ćeliju desno, stavivši graničnik na početak. %dovesti traku u oblik $\t\$w\bl\ldots$, tako da možemo početi kodirati. Kako je traka na početku $w\bl\ldots$, moramo pomaknuti riječ za jednu ćeliju udesno.
\begin{lema}[{name=[prvi fragment transpiliranog stroja]}]\label{lm:faza1}
Postoji fragment Turingova stroja koji prevodi početnu konfiguraciju\\ $\underset{n_{\t\$}}{w}=(n_{\t\$},0,w\bl\ldots)$ u konfiguraciju $\t\$w\underset{\mathclap{n_\bl}}{\bl}=(n_\bl,\dulj{w}+1,\t\$w\bl\ldots)$.
\vspace{-6pt}
\end{lema}
\begin{proof}
Obično se takav pomak radi s desnog kraja, jer inače moramo izvan trake pamtiti znakove koje prenosimo. No sjetimo se uvoda: za Turingov stroj pomaci su teški a pamćenje znakova lagano --- jer je $\Gamma$ konačan, znakove možemo pamtiti u stanjima stroja. Imat ćemo po jedno stanje $n_\alpha$ za prijenos svakog znaka $\alpha\in\Sigma_0\dcup\{\t\$,\bl\}$. %te još dva posebna stanja $n_{\t\$}$ i $n_{\bl}$. %Možemo standardno otići na kraj trake pa pomicati znak po znak udesno%Standardni način da se to napravi je otići na kraj riječi, pa pomicati slova s kraja redom za po jedno mjesto udesno. To možemo i na Turingovu stroju (pokušajte!), ali možemo i jednostavnije: obrisat ćemo prvi znak (zamijeniti ga s $\t\$$) i \emph{zapamtiti ga} u stanju stroja ---
Tada, ako u stanju $n_\alpha$ čitamo znak $\beta$, zamjenjujemo ga s $\alpha$ i pamtimo u stanju $n_\beta$~\eqref{d:10}. To objašnjava i zašto je početno stanje $n_{\t\$}$. Nakon što pročitamo i pomaknemo čitavu riječ, nađemo se u stanju $n_{\bl}$ na prvoj praznini nakon nje. %Zamijenimo je s \t\# i pomaknemo se ulijevo~\eqref{d:12}.
\end{proof}
\begin{primjer}[{name=[prvi fragment transpiliranog stroja]}]
Za $\Sigma_0:=\{\t a,\t b\}$, prvi fragment je prikazan dijagramom
\begin{equation}
\begin{tikzpicture}[baseline=(q0)]\label{dia:T1}
\clip (-1,-2.53) rectangle (5.3,2.16);
\node[state,initial] (q0) {$n_{\t\$}$};
\node[state] (na) [above right=0.25 and 1.5 of q0] (na) {$n_{\t a}$};
\node[state,below right=0.25 and 1.5 of q0] (nb) {$n_{\t b}$};
\node[state,below right=0.25 and 1.5 of na] (q1) {$n_{\bl}$};
%\node[state,right of=q1] (q2) {$q_0$};
\draw
(q0) edge node[xshift=-5,yshift=8] {\t a:\t\$} (na)
(q0) edge node[xshift=-3,yshift=-9] {\t b:\t\$} (nb)
(na) edge[loop above] node[below left=0.2]{\t a} (na)
(nb) edge[loop below] node[above right=0.2]{\t b} (nb)
(na) edge node[above=0.1]{\bl:\t a} (q1)
(nb) edge[below] node{\bl:\t b} (q1)
(nb) edge[bend left=15] node[left]{\t a:\t b} (na)
(na) edge[bend left=15] node[right]{\t b:\t a} (nb)
(q0) edge[bend right=90,looseness=1.5] node[above left=0.4 and 1.8]{\bl:\t\$} (q1)
%(q1) edge[dashed] node[above]{\bl:\t\#} (q2)
;
\end{tikzpicture}\text.
\end{equation}
Za ulaz \t{aab} izračunavanje počinje s
$\underset{\mathclap{n_{\t\$}}}{\t a}\t{ab}\leadsto\t\$\underset{\mathclap{n_{\t a}}}{\t a}\t b\leadsto\t{\$a}\underset{\mathclap{n_{\t a}}}{\t b}\leadsto\t{\$aa}\underset{\mathclap{n_{\t b}}}{\bl}\leadsto\t{\$aab}\underset{\mathclap{n_{\bl}}}{\bl}%\leadsto\t{\$aa}\underset{\mathclap{q_0}}{\t b}\t\#
$.
\end{primjer}
\vspace{-0.5em}
\begin{equation}
\label{d:10}\tag{$\delta$1}
\delta(n_\alpha,\beta):=(n_{\beta},\alpha,1)\text{, za sve }\alpha\in\Sigma_0\dcup\{\t\$\}\text{, }\beta\in\Sigma_0\dcup\{\bl\}\\
\end{equation}
Sljedeći korak je konstruirati početnu konfiguraciju od $\mathcal S_0$, desno od separatora \t\# na poziciji $\dulj{w}+1$. Znamo da to mora biti element od $(B^m)^*$, pa pokušajmo s unarnim kodiranjem: cilj nam je na kraj riječi staviti \t\# te $r_1^{\kr w}$ za jedan konkretni element $r_1\in B^m$. %Što je točno $r_1$ (i čitav $B^m$), reći ćemo u idućoj točki.%, ali zasad ga samo tretiramo kao zasebni znak (baš kao \bl).
\begin{lema}[{name=[drugi fragment transpiliranog stroja]}]\label{lm:faza2}
Postoji fragment Turingova stroja koji prevodi konfiguraciju\newline $\T{$\t\$w$}{n_\bl}{\bl}{}=(n_\bl,\dulj w+1,\t\$w\bl\ldots)$ u konfiguraciju $\t\$\bl^{\dulj w}\t\#\underset{\mathclap{p_0}}{r_1}^{\!\kr w}=(p_0,\dulj w+2,\t\$\bl^{\dulj w}\t\#r_1{}^{\!\kr w}\bl\ldots)$.
\end{lema}
\vspace{-1em}
\noindent\begin{gather*}
\label{d:20}\tag{$\delta$2a}\delta(n_{\bl},\bl):=(q_0,\t\#,-1)\\
\label{d:21}\tag{$\delta$2b}\delta(q_0,\alpha_t):=(q_1,\alpha_{t-1},1)\text{, za sve }t\in[2\dd b]\\
\label{d:22}\tag{$\delta$2c}\delta(q_1,\alpha):=(q_1,\alpha,1)\text{, za sve }\alpha\in\Sigma_0\mathbin{\dcup}\{\t\#,r_1\}\\
\label{d:23}\tag{$\delta$2d}\delta(q_1,\bl):=(q_0,r_1,-1)\\
\label{d:24}\tag{$\delta$2e}\delta(q_0,\gamma):=(q_0,\gamma,-1)\text{, za }\gamma\in\{\t\#,r_1\}\\
\label{d:25}\tag{$\delta$2f}\delta(q_0,\alpha_1):=(q_0,\alpha_b,-1)\\
\label{d:26}\tag{$\delta$2g}\delta(q_0,\gamma):=(q_2,\gamma,1)\text{, za }\gamma\in\{\t\$,\bl\}\\
\label{d:27}\tag{$\delta$2h}\delta(q_2,\alpha_b):=(q_1,\bl,1)\\
\label{d:28}\tag{$\delta$2i}\delta(q_2,\t\#):=(p_0,\t\#,1)
\end{gather*}
\begin{proof}
%To je pretvorba zapisa između različitih pomaknutih baza:
Prvo postavimo separator na trenutnu poziciju~\eqref{d:20}. Zatim broj $x:=\kr w$ čitamo u pomaknutoj bazi~$b$ pomoću znamenaka $\alpha_t,t\in[1\mspace{-1mu}\dd b]$ te pišemo unarno (u pomaknutoj bazi~$1$) pomoću znamenke~$r_1$. To se može riješiti tako da "dekrementiramo" $w$, za svaki uspješni dekrement dodajući po jedan $r_1$ na kraj.
Zapis u pomaknutoj bazi dekrementiramo slično kao i zapis u običnoj bazi. Ako zadnji znak nije $\alpha_1$, smanjimo njegov kod za $1$~\eqref{d:21} i odemo desno~\eqref{d:22} do prvog razmaka, koji zamijenimo s $r_1$~\eqref{d:23} i vraćamo se ponovo lijevo~\eqref{d:24}. Ako naiđemo na $\alpha_1$, zamijenimo ga "najvećom znamenkom" $\alpha_b$ i nastavljamo smanjivati dalje lijevo~\eqref{d:25}. Ako smanjujući dođemo do lijevog ruba broja~\eqref{d:26}, prvu znamenku mu obrišemo~\eqref{d:27}. %Ako smo ostali bez znamenaka, gotovi smo:
Na kraju odemo desno iza separatora, u stanje $p_0$~\eqref{d:28}.
Za dokaz da to stvarno dovede do željene konfiguracije dovoljno je primijetiti da se nakon svakog prolaza lijevo-desno nađemo ponovo u stanju $q_0$, s pozicijom pri desnom kraju trake oblika $\t\$\bl^{\dulj w-\dulj{w'}}w'\t\#r_1^{\kr w-\kr{w'}}$. Na početku je to istina jer je $w=w'$ i još nemamo nijedan $r_1$, u svakom koraku ostaje istina jer se dekrementom $\kr{w'}$ smanjuje za $1$ dok se broj znakova $r_1$ povećava za $1$, a na kraju onda moramo imati $\t\$\bl^{\dulj w}\t\#r_1^{\kr w}$, jer je tada $w'=\varepsilon$ s kodom $\kr{\varepsilon}=0$.
\end{proof}
\begin{primjer}[{name=[drugi fragment transpiliranog stroja]}]
Za $\Sigma_0:=\{\t a,\t b,\t c,\t d\}$, drugi fragment je prikazan dijagramom
\begin{equation}
\begin{tikzpicture}[baseline=(q4)]\label{dia:T2}
%\clip (-1,-2.53) rectangle (8.5,2.16);
\node[state] (q2) {$q_0$};
\node[state,below of=q2] (q3) {$q_1$};
\node[state,below right=0.75 and 2 of q2] (q4) {$q_2$};
\node[state,right of=q4] (p0) {$p_0$};
\node[state,left of=q2] (nb) {$n_\bl$};
\draw
(q2) edge node[left,align=left] {\t d:\t c\\\t c:\t b\\\t b:\t a} (q3)
(q2) edge[dashed, loop right] node[right]{$\t\#,r_1,\t a$:\t d} (q2)
(q2) edge node[below,xshift=-5,yshift=4]{$\t\$,\bl$} (q4)
(q3) edge[loop left] node[left]{$\t\#,r_1,\Sigma_0$} (q3)
(q3) edge[dashed,bend left=60] node[left]{\bl:$r_1$} (q2)
(q4) edge node[below,xshift=3]{\t d:\bl} (q3)
(q4) edge node[above]{\t\#} (p0)
(nb) edge[dashed] node[above] {\bl:\t\#} (q2)
;
\end{tikzpicture}\;\text.
\end{equation}
Za riječ $\t{aab}$ imamo šetnju kroz konfiguracije (pišemo samo neke od njih):
\begin{multline*}
\T{\$aab}{n_\bl}{\bl}{}\leadsto
\T{\$aa}{q_0}{b}{\#}\leadsto
\T{\$aaa}{q_1}{\#}{}\leadsto
\T{\$aaa\#}{q_1}{\bl}{}\leadsto
\T{\$aaa}{q_0}{\#}{\t{$r_1$}}\leadsto^4
%\T{\$aa}{q_0}{a}{\#\t{$r_1$}}\leadsto
%\T{\$a}{q_0}{a}{d\#\t{$r_1$}}\leadsto
%\T{\$}{q_0}{a}{dd\#\t{$r_1$}}\leadsto{}\\
%{}\leadsto
\T{}{q_0}{\$}{ddd\#\t{$r_1$}}\leadsto
\T{\$}{q_2}{d}{dd\#\t{$r_1$}}\leadsto
\T{\$\bl}{q_1}{d}{d\#\t{$r_1$}}\leadsto^4{}\\{}\leadsto^4
\T{\$\bl dd\#\t{$r_1$}}{q_1}{\bl}{}\leadsto
\T{\$\bl dd\#}{q_0}{\t{$r_1$}}{\t{$r_1$}}\leadsto^2
%\T{\$\bl dd}{q_0}{\#}{\t{$r_1r_1$}}\leadsto
%{}\leadsto
\T{\$\bl d}{q_0}{d}{\#\t{$r_1^2$}}\leadsto
\T{\$\bl dc}{q_1}{\#}{\t{$r_1^2$}}\leadsto^3
\T{\$\bl dc\#\t{$r_1^2$}}{q_1}{\bl}{}
\leadsto^4\T{\$\bl d}{q_0}{c}{\#\t{$r_1^3$}}\leadsto^*
\T{\$\bl d}{q_0}{b}{\#\t{$r_1^4$}}\leadsto^*{}\\
{}\leadsto^*\T{\$\bl d}{q_0}{a}{\#\t{$r_1^5$}}\leadsto^*%{}\\
%{}\leadsto^*
\T{\$\bl c}{q_0}{d}{\#\t{$r_1^6$}}\leadsto^*
\T{\$\bl c}{q_0}{a}{\#\t{$r_1^9$}}\leadsto^*
\T{\$\bl b}{q_0}{a}{\#\t{$r_1^{13}$}}
\leadsto^*
\T{\$\bl a}{q_0}{a}{\#\t{$r_1^{17}$}}\leadsto^*
\T{\$\bl\bl}{q_0}{d}{\#\t{$r_1^{18}$}}\leadsto^*
\T{\$\bl\bl}{q_0}{a}{\#\t{$r_1^{21}$}}\leadsto{}\\
{}\leadsto
\T{\$\bl}{q_0}{\bl}{d\#\t{$r_1^{21}$}}\leadsto
\T{\$\bl\bl}{q_2}{d}{\#\t{$r_1^{21}$}}\leadsto
\T{\$\bl\bl\bl}{q_1}{\#}{\t{$r_1^{21}$}}
\leadsto^*
\T{\$\bl\bl\bl\#\t{$r_1^{21}$}}{q_1}{\bl}{}\leadsto^*
\T{\$\bl\bl}{q_0}{\bl}{\#\t{$r_1^{22}$}}\leadsto
\T{\$\bl\bl\bl}{q_2}{\#}{\t{$r_1^{22}$}}\leadsto%{}\\
%{}\leadsto
\T{\$\bl\bl\bl\#}{p_0}{\t{$r_1^{22}$}}{}\text,
\end{multline*}
što je točno kako treba biti jer je $b=4$, pa je $\kr{\t{aab}}=(112)_4=22$. "Invarijanta petlje" zadovoljena je u svim istaknutim konfiguracijama gdje se $q_0$ nalazi ispod zadnjeg znaka prije separatora: npr.\ za $\t{\$\bl cd\#$r_1^6$}$ je $w'=\t{cd}$, čiji je kod $\kr{\mspace{-1mu}\t{cd}}=(34)_4=16$, a $\kr w-\kr{w'}=22-16=6$.
\end{primjer}
%I to je to. Spremni smo za simulaciju $P_0$-izračunavanja s $\kr w$.
\subsection{Registri kao tragovi trake}
Vrijeme je da opišemo kako ćemo točno reprezentirati konfiguraciju RAM-stroja $\mathcal S_0$ na traci. Zapravo, vrijednost programskog brojača je jedna od konačno mnogo njih i na njoj su dopuštene proizvoljne transformacije, pa ju je bolje prikazati kroz stanje stroja. Na traci će stajati samo stanje registara --- i to samo onih relevantnih. U tu svrhu, označimo s $m:=m_{P_0^1}=\max\,\{m_{P_0},2\}$ širinu algoritma $P_0^1$; tada znamo da je dovoljno pratiti prvih $m$ registara.
Kako to najbolje učiniti? Kao što smo rekli na početku ovog poglavlja, jezični model je "transponirani" brojevni model: u jezičnom modelu broj ćelija nije ograničen, ali broj mogućih sadržaja svake ćelije jest, dok je u brojevnom modelu obrnuto. To znači da možemo stanje relevantnih (prvih $m$) registara prikazati kao riječ nad "abecedom $m$-bitnih procesorskih riječi"
\begin{equation}
\renewcommand{\arraystretch}{0.1}
B^m:=\prod_{i<m}\{\t\textopenbullet,\t\textbullet\}=\bigl\{\left[\begin{array}{@{}l@{}}\beta_0\\[0mm]
%\MTFlushSpaceAbove
\vdotswithin{\beta}\\[1mm]
\beta_{m-1}\end{array}\right]\bigm|(\forall i<m)(\beta_i\in\{\t\textopenbullet,\t\textbullet\})\bigr\}\text,
\end{equation}
tako da se dio trake desno od separatora sastoji od $m$ "redaka" (\emph{tragova}), u svakom od kojih piše $\t\textbullet^t\t\textopenbullet\dotsm$, gdje je $t$ sadržaj odgovarajućeg registra. U tom kontekstu, $B^m$ je "prostor stupaca" sa svim ($2^m$ njih) stupcima znakova $\t\textbullet$ i $\t\textopenbullet$ visine $m$. Recimo,
\begin{equation}\label{eq:B4}
\renewcommand{\arraystretch}{0.1}
B^4:=\biggl\{
\begin{array}{c}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet
\end{array},
\begin{array}{c}
\t\textbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet
\end{array},
\begin{array}{c}
\t\textopenbullet\\
\t\textbullet\\
\t\textopenbullet\\
\t\textopenbullet
\end{array},
\begin{array}{c}
\t\textbullet\\
\t\textbullet\\
\t\textopenbullet\\
\t\textopenbullet
\end{array},
\begin{array}{c}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textbullet\\
\t\textopenbullet
\end{array},
\begin{array}{c}
\t\textbullet\\
\t\textopenbullet\\
\t\textbullet\\
\t\textopenbullet
\end{array},
\begin{array}{c}
\t\textopenbullet\\
\t\textbullet\\
\t\textbullet\\
\t\textopenbullet
\end{array},
\begin{array}{c}
\t\textbullet\\
\t\textbullet\\
\t\textbullet\\
\t\textopenbullet
\end{array},
\begin{array}{c}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textbullet
\end{array},
\begin{array}{c}
\t\textbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textbullet
\end{array},
\begin{array}{c}
\t\textopenbullet\\
\t\textbullet\\
\t\textopenbullet\\
\t\textbullet
\end{array},
\begin{array}{c}
\t\textbullet\\
\t\textbullet\\
\t\textopenbullet\\
\t\textbullet
\end{array},
\begin{array}{c}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textbullet\\
\t\textbullet
\end{array},
\begin{array}{c}
\t\textbullet\\
\t\textopenbullet\\
\t\textbullet\\
\t\textbullet
\end{array},
\begin{array}{c}
\t\textopenbullet\\
\t\textbullet\\
\t\textbullet\\
\t\textbullet
\end{array},
\begin{array}{c}
\t\textbullet\\
\t\textbullet\\
\t\textbullet\\
\t\textbullet
\end{array}
\biggr\}\text.
\end{equation}
Konkretno, ako (za $m=4$) u nekom trenutku imamo konfiguraciju $(1,4,0,5,0,0,\dotsc\mspace{-1mu})$, uz $\dulj w=7$, na traci će biti
\begin{equation}\label{eq:bitmap}
\renewcommand{\arraystretch}{0.1}
\t{\$\bl\bl\bl\bl\bl\bl\bl\#}\begin{array}{@{}c@{}}
\t\textbullet\\
\t\textbullet\\
\t\textopenbullet\\
\t\textbullet
\end{array}
\begin{array}{@{}c@{}}
\t\textopenbullet\\
\t\textbullet\\
\t\textopenbullet\\
\t\textbullet
\end{array}
\begin{array}{@{}c@{}}
\t\textopenbullet\\
\t\textbullet\\
\t\textopenbullet\\
\t\textbullet
\end{array}
\begin{array}{@{}c@{}}
\t\textopenbullet\\
\t\textbullet\\
\t\textopenbullet\\
\t\textbullet
\end{array}
\begin{array}{@{}c@{}}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textbullet
\end{array}
\begin{array}{@{}c@{}}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet
\end{array}
\begin{array}{@{}c@{}}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet
\end{array}
\begin{array}{@{}c@{}}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet
\end{array}
\begin{array}{@{}c@{}}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet
\end{array}
\begin{array}{@{}c@{}}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet
\end{array}\dotsm\text,
\end{equation}
iz čega vidimo dvije stvari. Prvo, $\bl$ mora biti prvi element naveden u $B^m$, koji ima sve kružiće prazne. Tako postižemo da traka bude prazna od nekog mjesta nadalje (konkretno, maksimum svih $m$ vrijednosti u registrima), odnosno da bude s konačnim nosačem. Drugo, naš znak $r_1$, koji smo upotrijebili da postavimo $\reg1$ na ulaznu vrijednost $\kr w$, je treći element u $B^m$, napisan transponirano kao $(\t{\textopenbullet\textbullet\textopenbullet}^{m-2})^\intercal$. Stupčano,
\begin{equation}
\renewcommand{\arraystretch}{0.1}
\bl\,:=\begin{array}{c}
\t\textopenbullet\\
\t\textopenbullet\\
\t\textopenbullet\\[0mm]
%\MTFlushSpaceAbove
\vdotswithin{\t\textopenbullet}\\[1mm]
\t\textopenbullet
\end{array}\text{,\qquad}
r_1:=\begin{array}{c}
\t\textopenbullet\\
\t\textbullet\\
\t\textopenbullet\\[0mm]
%\MTFlushSpaceAbove
\vdotswithin{\t\textopenbullet}\\[1mm]
\t\textopenbullet
\end{array}\text.
\end{equation}
\begin{primjer}[{name=[dodavanje znaka na kraj riječi]}]\label{pr:+a}
Nad abecedom $\Sigma:=\{\t a,\t b\}$ kodiranom s $\{\t a\mapsto1,\t b\mapsto2\}$ pogledajmo jezičnu funkciju "dopisivanje \t a zdesna", $\varphi_{\t a}(w):=w\t a$. Baza je $b=2$, pa je prateća funkcija $\N\varphi_{\t a}(\kr w)=\kr{w\t a}=\kr w\conc2\kr{\t a}=\kr w\cdot2^{\,\f{slh}(\kr{\t a},2)}+\kr{\t a}=2^{\dulj{\t a}}\cdot\kr w+1$, odnosno $\N\varphi_{\t a}(x)=2x+1$. Očito je $\N\varphi_{\t a}\in\mathscr Comp_1$: računa je jednostavni RAM-program
\begin{align}
\SwapAboveDisplaySkip\label{eq:+aprog}
P_{\t a}:=\begin{prog}
0.&\incr0\\
1.&\decr14\\
2.&\incr0\\
3.&\goto\;0
\end{prog}
\end{align}
širine $m=2$. Za ulaznu riječ $\t{ab}$ je $\kr{\t{ab}}=(\mspace{-0.5mu}12)_2=4$, pa je konfiguracija Turingova stroja kroz faze (početna, nakon prve faze i nakon druge faze)
\begin{equation}\label{eq:+afaze}
\renewcommand{\arraystretch}{0.1}
\T{}{n_{\t\$}}{a}{b}\leadsto^*
\T{\$ab}{n_\bl}{\bl}{}\leadsto^*
\T{\$\boo\boo\#}{\mund{p_0}}{\boi}{\boi\boi\boi}\,\text{.\qedhere}
\end{equation}
%te smo spremni za početak simulacije.
\end{primjer}
Rekli smo da ćemo vrijednost programskog brojača držati u stanju stroja --- i to je već učinjeno kroz supskript stanja $p_0$: ta nula znači da je \textsc{pc} upravo postao $0$. Općenito, za $P_0$ duljine $n:=n_{P_0}$ imat ćemo stanja $p_i,i\in[0\dd n]$, pri čemu će ulazak u stanje $p_n$ značiti završetak $P_0$-izračunavanja.
\begin{definicija}[{name=[$m$-reprezentacija RAM-konfiguracije]}]
Neka je $P^1$ RAM-algoritam širine $m$ te $c=(r_0,r_1,\dots,r_{m-1},0,0,\dots,pc)$ konfiguracija RAM-stroja s programom $P$. Tada je \emph{$m$-reprezentacija} od $c$ konfiguracija Turingova stroja sa stanjem $p_{pc}$, trakom oblika $\t\$\bl^k\t\#v\bl\dots$ i pozicijom većom od $k$ --- pri čemu je $v$ riječ nad $B^m$ u čijem $i$-tom tragu piše $\t\textbullet^{r_i}\t\textopenbullet^{\dulj v-r_i}$, za sve $i\in[0\dd m\rangle$.
%Za $k,m,n\in\N$ takve da je $m\ge 2$, za proizvoljnu RAM-konfiguraciju $c$ sa svojstvima $c(\reg j)=0$ za sve $j\ge m$ i $c(\textsc{pc})\le n$, \emph{reprezentacija} je Turing-konfiguracija
%\begin{equation}
%Turing_{kmn}(c):=\biggl(p_{c(\textsc{pc})},k+2,\t\$\bl^k\t\#\!\left[\begin{array}{@{}l@{}}
%\renewcommand{\arraystretch}{0.1}
%\t\textbullet^{c(\reg0)}\t\textopenbullet\dotsm\\
%\t\textbullet^{c(\reg1)}\t\textopenbullet\dotsm
%\MTFlushSpaceBelow
%\vdotswithin{\text\textbullet}
%\MTFlushSpaceBelow
%\t\textbullet^{c(\reg{m-1})}\t\textopenbullet\dotsm
%\end{array}\right.\biggr)\text{.\;\qedhere}
%\end{equation}
\end{definicija}
Recimo,~\eqref{eq:bitmap} je primjer trake $4$-reprezentacije konfiguracije $(1,4,0,5,0,0,\dots\mspace{-1mu})$. Također, zadnja konfiguracija u~\eqref{eq:+afaze} je $2$-reprezentacija početne konfiguracije RAM-stroja s programom $P_{\t a}$ iz~\eqref{eq:+aprog}, s ulazom \t{ab}.
Ipak, stanja $p_i$ nisu dovoljna za izvršavanje RAM-instrukcija: za svaki $i<n$ imamo još jedno stanje $s_i$, koje tome služi. Stanje $p_i$ je "pripremno stanje" za $s_i$, s jedinim zadatkom fiksiranja pozicije odmah nakon znaka $\t\#$.
%\begin{lema}[{name=[{treći fragment transpiliranog stroja, priprema za instrukciju}]}]\label{lm:pi>si}
%Za svaki $i\in[0\dd n\rangle$, postoji fragment Turingova stroja koji prevodi bilo koju konfiguraciju oblika $(p_i,t,\t\$\bl^k\,\t\#v\bl\ldots)$, gdje su $v\in(B^m)^*$ i $t>k\in\N$, u konfiguraciju $(s_i,k+2,\t\$\bl^k\,\t\#v\bl\ldots)$.
%\end{lema}
%\begin{proof}