Języki, automaty i obliczenia/Wykład 12: Języki kontekstowe i automat liniowo ograniczony. Maszyna Turinga: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Matiunreal (dyskusja | edycje)
m Zastępowanie tekstu – „,...,” na „,\ldots,”
 
(Nie pokazano 51 wersji utworzonych przez 7 użytkowników)
Linia 6: Linia 6:
też najogólniejszy model obliczeń, a mianowicie maszynę Turinga.
też najogólniejszy model obliczeń, a mianowicie maszynę Turinga.


==1. Języki kontekstowe==
==Języki kontekstowe==


Języki kontekstowe to kolejna rodzina języków w hierarchii Chomsky'ego. Rozszerza ona
Języki kontekstowe to kolejna rodzina języków w hierarchii Chomsky'ego. Rozszerza ona
Linia 19: Linia 19:
zastosowania tej rodziny języków formalnych nie są powszechne
zastosowania tej rodziny języków formalnych nie są powszechne
oraz to, że dowody dla przedstawionych poniżej twierdzeń
oraz to, że dowody dla przedstawionych poniżej twierdzeń
są mocno techniczne postanowiliśmy  zrezygnować z rygorystycznej  prezentacji tego materiału
są mocno techniczne, postanowiliśmy  zrezygnować z rygorystycznej  prezentacji tego materiału i pominąć dowody. Zainteresowany Student może je znaleźć w literaturze wskazanej
i pominąć dowody. Zainteresowany Student może je znaleźć w literaturze wskazanej
do tego przedmiotu.
do tego przedmiotu.


{{definicja|1.1||
{{definicja|1.1||
Gramatykę  <math>\displaystyle G=(V_{N},V_{T},v_{0},P) </math>  nazywamy rozszerzającą,
Gramatykę  <math>G=(V_{N},V_{T},v_{0},P)</math>  nazywamy rozszerzającą,
jeśli każde prawo jest postaci  <math>\displaystyle x\rightarrow y </math> , gdzie  <math>\displaystyle x,y\in (V_{N}\cup V_{T})^{*} </math>  i spełniona
jeśli każde prawo jest postaci  <math>x\rightarrow y</math> , gdzie  <math>x,y\in (V_{N}\cup V_{T})^{*}</math>  i spełniona
jest nierówność  <math>\displaystyle \mid x\mid \leqslant \mid y\mid   </math>  lub jest to prawo  <math>\displaystyle v_{0}\rightarrow 1 </math>  
jest nierówność  <math>\mid x\mid \leqslant \mid y\mid</math>  lub jest to prawo  <math>v_{0}\rightarrow 1</math>  
i wtedy  <math>\displaystyle v_{0} </math>  nie występuje  po prawej stronie w żadnej produkcji z  <math>\displaystyle P </math> .
i wtedy  <math>v_{0}</math>  nie występuje  po prawej stronie w żadnej produkcji z  <math>P</math> .


}}
}}
Linia 36: Linia 35:
{{kotwica|prz.1|}}{{twierdzenie|1.1||
{{kotwica|prz.1|}}{{twierdzenie|1.1||


Dla dowolnej gramatyki  <math>\displaystyle G=(V_{N},V_{T},v_{0},P) </math>  rozszerzającej  istnieje
Dla dowolnej gramatyki  <math>G=(V_{N},V_{T},v_{0},P)</math>  rozszerzającej  istnieje
równoważna gramatyka kontekstowa.
równoważna gramatyka kontekstowa.


Linia 44: Linia 43:


{{definicja|1.2||
{{definicja|1.2||
Gramatyką z markerem końca  <math>\displaystyle \sharp   </math>  nazywamy
Gramatyką z markerem końca  <math>\sharp</math>  nazywamy
gramatykę  <math>\displaystyle G_{\sharp }=(V_{N}\cup \{\sharp \},V_{T},v_{0},P) </math>  taką, że
gramatykę  <math>G_{\sharp }=(V_{N}\cup \{\sharp \},V_{T},v_{0},P)</math>  taką, że
<math>\displaystyle \sharp \notin V_{N}\cup V_{T} </math>  oraz prawa są postaci:  <math>\displaystyle u\rightarrow v </math>  
<math>\sharp \notin V_{N}\cup V_{T}</math>  oraz prawa są postaci:  <math>u\rightarrow v</math>  
,  <math>\displaystyle \sharp u\rightarrow \sharp v </math>  lub  <math>\displaystyle u\sharp \rightarrow v\sharp   </math> ,
,  <math>\sharp u\rightarrow \sharp v</math>  lub  <math>u\sharp \rightarrow v\sharp</math> ,
gdzie  <math>\displaystyle u,v\in (V_{N}\cup V_{T})^{*} </math>  i w słowie  <math>\displaystyle u </math>  występuje co najmniej
gdzie  <math>u,v\in (V_{N}\cup V_{T})^{*}</math>  i w słowie  <math>u</math>  występuje co najmniej
jeden symbol nieterminalny z  <math>\displaystyle V_{N} </math> .
jeden symbol nieterminalny z  <math>V_{N}</math> .
Językiem generowanym przez tę gramatykę
Językiem generowanym przez tę gramatykę
nazywamy zbiór
nazywamy zbiór


<center><math>\displaystyle L(G_{\sharp })=\{w\in V_{T}^{*}:\: \sharp v_{0}\sharp \mapsto^{*}\sharp w\sharp \}. </math></center>
<center><math>L(G_{\sharp })=\{w\in V_{T}^{*}:\ : \sharp v_{0}\sharp \mapsto^{*}\sharp w\sharp \}</math></center>


}}
}}


Gramatyka z markerem końca  <math>\displaystyle G_{\sharp } </math>  jest kontekstowa (typu  <math>\displaystyle 1 </math> ), jeśli
Gramatyka z markerem końca  <math>G_{\sharp }</math>  jest kontekstowa (typu  <math>1</math> ), jeśli
jej prawa
jej prawa
po wymazaniu markera  <math>\displaystyle \sharp   </math>  spełniają warunki gramatyki rozszerzającej.
po wymazaniu markera  <math>\sharp</math>  spełniają warunki gramatyki rozszerzającej.
Oczywiście dla dowolnej gramatyki kontekstowej istnieje równoważna gramatyka
Oczywiście dla dowolnej gramatyki kontekstowej istnieje równoważna gramatyka
kontekstowa z markerem końca. Prawdziwe jest również następujące twierdzenie:
kontekstowa z markerem końca. Prawdziwe jest również następujące twierdzenie:
Linia 71: Linia 70:


{{dowod|||
{{dowod|||
Niech  <math>\displaystyle G_{\sharp }=(V_{N}\cup \{\sharp \},V_{T},v_{0},P) </math>  będzie dowolną
Niech  <math>G_{\sharp }=(V_{N}\cup \{\sharp \},V_{T},v_{0},P)</math>  będzie dowolną
gramatyką kontekstową z markerem końca. Zakładamy, bez ograniczania ogólności
gramatyką kontekstową z markerem końca. Zakładamy, bez ograniczania ogólności
rozważań, że w&nbsp;zbiorze  <math>\displaystyle P </math>  nie występuje prawo  <math>\displaystyle v_{0}\rightarrow 1 </math>  
rozważań, że w&nbsp;zbiorze  <math>P</math>  nie występuje prawo  <math>v_{0}\rightarrow 1</math>  
(po wymazaniu markera  <math>\displaystyle \sharp   </math> ). Dla każdego symbolu  <math>\displaystyle x </math>  ze zbioru
(po wymazaniu markera  <math>\sharp</math> ). Dla każdego symbolu  <math>x</math>  ze zbioru
<math>\displaystyle V=V_{N}\cup V_{T} </math>  określamy trzy symbole  <math>\displaystyle \, ^{\sharp }x,x^{\sharp },^{\: \sharp }x^{\sharp } </math>  
<math>V=V_{N}\cup V_{T}</math>  określamy trzy symbole  <math>\, ^{\sharp }x,x^{\sharp },^{\ : \sharp }x^{\sharp }</math>  
oraz oznaczamy odpowiednio przez  <math>\displaystyle \, ^{\sharp }V,V^{\sharp },^{\sharp }V^{\sharp } </math>  
oraz oznaczamy odpowiednio przez  <math>\, ^{\sharp }V,V^{\sharp },^{\sharp }V^{\sharp }</math>  
zbiory tych symboli.  Dla  <math>\displaystyle u=u_{1}...u_{k} </math>  
zbiory tych symboli.  Dla  <math>u=u_{1}...u_{k}</math>  
takiego, że  <math>\displaystyle k\geqslant 1 </math>  i  <math>\displaystyle u_{i}\in V </math>  dla  <math>\displaystyle i=1,...,k </math>  wprowadzamy także następujące oznaczenia:
takiego, że  <math>k\geqslant 1</math>  i  <math>u_{i}\in V</math>  dla  <math>i=1,\ldots,k</math>  wprowadzamy także następujące oznaczenia:


<math>\displaystyle \, ^{\sharp }u=\, ^{\sharp }u_{1}u_{2}...u_{k} </math>  ,  <math>\displaystyle u^{\sharp }=u_{1}...u_{k-1}u_{k}^{\sharp } </math>  
<math>\, ^{\sharp }u=\, ^{\sharp }u_{1}u_{2}...u_{k}</math>  ,  <math>u^{\sharp }=u_{1}...u_{k-1}u_{k}^{\sharp }</math>  
oraz  <math>\displaystyle \, ^{\sharp }u^{\sharp }=\, ^{\sharp }u_{1}u_{2}...u_{k-1}u_{k}^{\sharp } </math>  
oraz  <math>\, ^{\sharp }u^{\sharp }=\, ^{\sharp }u_{1}u_{2}...u_{k-1}u_{k}^{\sharp }</math>  
gdy  <math>\displaystyle k>1 </math> .
gdy  <math>k>1</math> .


Przy takich oznaczeniach definiujemy gramatykę
Przy takich oznaczeniach definiujemy gramatykę


<center><math>\displaystyle G_{1}=(V_{N}\cup \, ^{\sharp }V\cup V^{\sharp }\cup ^{\sharp }V^{\sharp },V_{T},\, ^{\sharp }v_{0}^{\sharp },P_{1}), </math></center>
<center><math>G_{1}=(V_{N}\cup \, ^{\sharp }V\cup V^{\sharp }\cup ^{\sharp }V^{\sharp },V_{T},\, ^{\sharp }v_{0}^{\sharp },P_{1})</math></center>


w której zbiór praw  <math>\displaystyle P_{1} </math>  składa się ze wszystkich praw uzyskanych zgodnie
w której zbiór praw  <math>P_{1}</math>  składa się ze wszystkich praw uzyskanych zgodnie
z poniższymi warunkami:
z poniższymi warunkami:
# jeśli  <math>\displaystyle u\rightarrow w\in P </math>  , to  <math>\displaystyle u\rightarrow w,\: ^{\#}u\rightarrow \, ^{\#}w,\: u^{\#}\rightarrow w^{\#},\: ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1} </math>  
# jeśli  <math>u\rightarrow w\in P</math>  , to  <math>u\rightarrow w,\ : ^{\#}u\rightarrow \, ^{\#}w,\ : u^{\#}\rightarrow w^{\#},\ : ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}</math>  
# jeśli  <math>\displaystyle \, ^{\#}u\rightarrow \, ^{\#}w\in P </math>  , to  <math>\displaystyle \: u^{\#}\rightarrow w^{\#},\: ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1} </math>  
# jeśli  <math>\, ^{\#}u\rightarrow \, ^{\#}w\in P</math>  , to  <math>\ : u^{\#}\rightarrow w^{\#},\ : ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}</math>  
# jeśli  <math>\displaystyle u^{\#}\rightarrow w^{\#}\in P </math>  , to  <math>\displaystyle u^{\#}\rightarrow w^{\#},\: ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1} </math>  
# jeśli  <math>u^{\#}\rightarrow w^{\#}\in P</math>  , to  <math>u^{\#}\rightarrow w^{\#},\ : ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}</math>  
#  <math>\displaystyle \, ^{\#}x\rightarrow x,\: x^{\#}\rightarrow x,\: ^{\#}x^{\#}\rightarrow x\in P_{1} </math>  
#  <math>\, ^{\#}x\rightarrow x,\ : x^{\#}\rightarrow x,\ : ^{\#}x^{\#}\rightarrow x\in P_{1}</math>  
dla wszystkich  <math>\displaystyle x\in V </math> .
dla wszystkich  <math>x\in V</math> .


Określona w ten sposób gramatyka  <math>\displaystyle G_{1} </math>  jest gramatyką rozszerzającą i równoważną
Określona w ten sposób gramatyka  <math>G_{1}</math>  jest gramatyką rozszerzającą i równoważną
wyjściowej.
wyjściowej.
Dla gramatyki  <math>\displaystyle G_{1} </math>  istnieje, zgodnie z poprzednim twierdzeniem,
Dla gramatyki  <math>G_{1}</math>  istnieje, zgodnie z poprzednim twierdzeniem,
równoważna gramatyka kontekstowa, co kończy dowód twierdzenia.
równoważna gramatyka kontekstowa, co kończy dowód twierdzenia.


<center><math>\displaystyle \diamondsuit</math></center>  }}
}}


Prawdziwe jest także następujące twierdzenie (porównaj z [[#prz.1|1.1]])
Prawdziwe jest także następujące twierdzenie (porównaj z [[#prz.1|1.1]]).


{{twierdzenie|1.3||
{{twierdzenie|1.3||
Dla dowolnej gramatyki kontekstowej (rozszerzającej) istnieje równoważna
Dla dowolnej gramatyki kontekstowej (rozszerzającej) istnieje równoważna
gramatyka kontekstowa (rozszerzająca) o tej własności, że każde prawo, w którym
gramatyka kontekstowa (rozszerzająca) o tej własności, że każde prawo, w którym
występuje symbol terminalny, jest postaci  <math>\displaystyle v\rightarrow a </math> , gdzie  <math>\displaystyle v\in V_{N},\: a\in V_{T} </math> .
występuje symbol terminalny, jest postaci  <math>v\rightarrow a</math> , gdzie  <math>v\in V_{N},\ : a\in V_{T}</math> .


}}
}}


Mówimy, że gramatyka  <math>\displaystyle G </math>  jest rzędu  <math>\displaystyle n>0 </math> , jeśli dla każdego
Mówimy, że gramatyka  <math>G</math>  jest rzędu  <math>n>0</math> , jeśli dla każdego
prawa  <math>\displaystyle x\rightarrow y </math>  tej gramatyki spełniony jest warunek  <math>\displaystyle \mid x\mid \leqslant n </math>  
prawa  <math>x\rightarrow y</math>  tej gramatyki spełniony jest warunek  <math>\mid x\mid \leqslant n</math>  
i  <math>\displaystyle \mid y\mid \leqslant n </math> . Kolejne twierdzenie stwierdza możliwość dalszego
i  <math>\mid y\mid \leqslant n</math> . Kolejne twierdzenie stwierdza możliwość dalszego
uproszczenia praw gramatyki rozszerzającej.
uproszczenia praw gramatyki rozszerzającej.


{{twierdzenie|1.4||
{{twierdzenie|1.4||
Dla każdej gramatyki rozszerzającej istnieje równoważna gramatyka rozszerzająca
Dla każdej gramatyki rozszerzającej istnieje równoważna gramatyka rozszerzająca
rzędu  <math>\displaystyle 2 </math> .
rzędu  <math>2</math> .


}}
}}
Linia 127: Linia 126:


{{definicja|1.3||
{{definicja|1.3||
Gramatyka  <math>\displaystyle G=(V_{N},V_{T},v_{0},P) </math>  jest liniowo ograniczona, jeśli każde
Gramatyka  <math>G=(V_{N},V_{T},v_{0},P)</math>  jest liniowo ograniczona, jeśli każde
prawo jest jednej z następujących postaci:
prawo jest jednej z następujących postaci:


<center><math>\displaystyle v_{0}\rightarrow v_{0}v,\: v_{1}v_{2}\rightarrow z_{1}z_{2},\: v\rightarrow x, </math></center>
<center><math>v_{0}\rightarrow v_{0}v,\ : v_{1}v_{2}\rightarrow z_{1}z_{2},\ : v\rightarrow x</math></center>


gdzie  <math>\displaystyle x\in V_{N}\cup V_{T},\: v,v_{1},v_{2},z_{1},z_{2}\in V_{N} </math>  oraz
gdzie  <math>x\in V_{N}\cup V_{T},\ : v,v_{1},v_{2},z_{1},z_{2}\in V_{N}</math>  oraz
<math>\displaystyle v_{0}\notin \{x,z_{1},z_{2},v\} </math> .
<math>v_{0}\notin \{x,z_{1},z_{2},v\}</math> .


}}
}}


{{twierdzenie|1.5||
{{twierdzenie|1.5||
Dla dowolnej gramatyki kontekstowej  <math>\displaystyle G </math>  istnieje gramatyka liniowo ograniczona
Dla dowolnej gramatyki kontekstowej  <math>G</math>  istnieje gramatyka liniowo ograniczona
<math>\displaystyle G_{1} </math> , która jest równoważna  <math>\displaystyle G </math>  lub też generuje język  <math>\displaystyle L(G)\setminus \{1\} </math> .
<math>G_{1}</math> , która jest równoważna  <math>G</math>  lub też generuje język  <math>L(G)\setminus \{1\}</math> .


}}
}}


{{dowod|||
{{dowod|||
W świetle poprzednich twierdzeń możemy przyjąć, że gramatyka kontekstowa  <math>\displaystyle G=(V_{N},V_{T},v_{0},P) </math>  
W świetle poprzednich twierdzeń możemy przyjąć, że gramatyka kontekstowa  <math>G=(V_{N},V_{T},v_{0},P)</math>  
ma prawa wyłącznie w następujących postaciach:
ma prawa wyłącznie w następujących postaciach:
#  <math>\displaystyle v_{0}\rightarrow 1 </math>  
#  <math>v_{0}\rightarrow 1</math>  
#  <math>\displaystyle v\rightarrow x </math>  gdzie  <math>\displaystyle v\in V_{N},\: x\in V_{N}\cup V_{T} </math>  
#  <math>v\rightarrow x</math>  gdzie  <math>v\in V_{N},\ : x\in V_{N}\cup V_{T}</math>  
#  <math>\displaystyle v\rightarrow v_{1}v_{2} </math>  gdzie  <math>\displaystyle v,v_{1},v_{2}\in V_{N} </math>  
#  <math>v\rightarrow v_{1}v_{2}</math>  gdzie  <math>v,v_{1},v_{2}\in V_{N}</math>  
#  <math>\displaystyle v_{1}v_{2}\rightarrow v_{3}v_{4} </math>  gdzie  <math>\displaystyle v_{1},v_{2},v_{3},v_{4}\in V_{N} </math>  
#  <math>v_{1}v_{2}\rightarrow v_{3}v_{4}</math>  gdzie  <math>v_{1},v_{2},v_{3},v_{4}\in V_{N}</math>  


Określamy gramatykę  <math>\displaystyle G_{1}=(V_{N}\cup \{z_{0},z_{1}\},V_{T},z_{0},P_{1}) </math> ,
Określamy gramatykę  <math>G_{1}=(V_{N}\cup \{z_{0},z_{1}\},V_{T},z_{0},P_{1})</math> ,
gdzie  <math>\displaystyle z_{1},z_{2} </math>  są nowymi symbolami nieterminalnymi, a więc nie należą
gdzie  <math>z_{1},z_{2}</math>  są nowymi symbolami nieterminalnymi, a więc nie należą
do  <math>\displaystyle V_{N} </math> . Natomiast zbiór praw  <math>\displaystyle P_{1} </math>  składa się ze wszystkich
do  <math>V_{N}</math> . Natomiast zbiór praw  <math>P_{1}</math>  składa się ze wszystkich
praw ze zbioru  <math>\displaystyle P </math>  postaci 2 i 4 oraz  <math>\displaystyle z_{0}\rightarrow z_{0}z_{1},\: z_{0}\rightarrow v_{0},\:   </math>  
praw ze zbioru  <math>P</math>  postaci 2 i 4 oraz  <math>z_{0}\rightarrow z_{0}z_{1},\ : z_{0}\rightarrow v_{0},\ :</math>  
praw  <math>\displaystyle z_{1}v\rightarrow vz_{1},\: vz_{1}\rightarrow z_{1}v </math>  dla  <math>\displaystyle v\in V_{N} </math>  
praw  <math>z_{1}v\rightarrow vz_{1},\ : vz_{1}\rightarrow z_{1}v</math>  dla  <math>v\in V_{N}</math>  
i praw  <math>\displaystyle v_{1}z_{1}\rightarrow v_{3}v_{4} </math>  dla każdego prawa postaci 4
i praw  <math>v_{1}z_{1}\rightarrow v_{3}v_{4}</math>  dla każdego prawa postaci 4
w&nbsp;gramatyce  <math>\displaystyle G </math> . Skonstruowana gramatyka jest liniowo ograniczona i spełnia tezę
w&nbsp;gramatyce  <math>G</math> . Skonstruowana gramatyka jest liniowo ograniczona i spełnia tezę
twierdzenia.
twierdzenia.


<center><math>\displaystyle \diamondsuit</math></center>  }}
}}


==2. Automat liniowo ograniczony==
==Automat liniowo ograniczony==


Określimy teraz systemy, zwane automatami liniowo ograniczonymi, który rozpoznają
Określimy teraz systemy, zwane automatami liniowo ograniczonymi, który rozpoznają
Linia 168: Linia 167:


{{definicja|2.1||
{{definicja|2.1||
Automatem liniowo ograniczonym nazywamy
'''Automatem liniowo ograniczonym ''' nazywamy
system  <math>\displaystyle \mathcal{A}_{LO}=(\Sigma _{T},S,P,s_{0},S_{F}) </math> , w którym  <math>\displaystyle \Sigma _{T} </math>  
system  <math>\mathcal{A}_{LO}=(\Sigma _{T},S,P,s_{0},S_{F})</math> , w którym  <math>\Sigma _{T}</math>  
jest skończonym alfabetem,  <math>\displaystyle S </math>  skończonym zbiorem stanów,  <math>\displaystyle S\cap \Sigma _{T}=\emptyset   </math>  
jest skończonym alfabetem,  <math>S</math>  skończonym zbiorem stanów,  <math>S\cap \Sigma _{T}=\emptyset</math>  
oraz wyróżniony jest podzbiór  <math>\displaystyle \Sigma _{I}\subset \Sigma _{T} </math> . Zbiór  <math>\displaystyle \Sigma _{T} </math>  
oraz wyróżniony jest podzbiór  <math>\Sigma _{I}\subset \Sigma _{T}</math> . Zbiór  <math>\Sigma _{T}</math>  
zwany jest alfabetem ta{s}my, a  <math>\displaystyle \Sigma _{I} </math>  - alfabetem wej{s}ciowym.
zwany jest alfabetem taśmy, a  <math>\Sigma _{I}</math>  - alfabetem wejściowym.
Wyróżnione są także: element  <math>\displaystyle \#\in \Sigma _{T}\setminus \Sigma _{I} </math>  zwany
Wyróżnione są także: element  <math>\#\in \Sigma _{T}\setminus \Sigma _{I}</math>  zwany
markerem końca, stan pocz{a}tkowy <math>\displaystyle s_{0}\in S </math>  oraz  <math>\displaystyle S_{F}\subset S </math>  
markerem końca, stan początkowy <math>s_{0}\in S</math>  oraz  <math>S_{F}\subset S</math>  
- zbiór stanów ko{n}cowych. Natomiast relacja przejść  <math>\displaystyle P\subset (S\times \Sigma _{T})\times (S\times \Sigma _{T}\times \{-1,0,1\}) </math>  
- zbiór stanów końcowych. Natomiast relacja przejść  <math>P\subset (S\times \Sigma _{T})\times (S\times \Sigma _{T}\times \{-1,0,1\})</math>  
spełnia następujące warunki:
spełnia następujące warunki:
# jeśli  <math>\displaystyle (s_{1},\#)P(s_{2},a,k) </math> , to  <math>\displaystyle a=\#</math>  
# jeśli  <math>(s_{1},\#)P(s_{2},a,k)</math> , to  <math>a=\#</math>  
# jeśli  <math>\displaystyle (s_{1},a)P(s_{2},\#,k) </math> , to  <math>\displaystyle a=\#</math>  
# jeśli  <math>(s_{1},a)P(s_{2},\#,k)</math> , to  <math>a=\#</math>  


Fakt, że  <math>\displaystyle (s_{1},a)P(s_{2},b,k) </math> ,  zapisujemy zazwyczaj jako  <math>\displaystyle (s_{1},a)\rightarrow (s_{2},b,k) </math> .
Fakt, że  <math>(s_{1},a)P(s_{2},b,k)</math> ,  zapisujemy zazwyczaj jako  <math>(s_{1},a)\rightarrow (s_{2},b,k)</math> .
Do opisu działania automatu liniowo ograniczonego wygodnie jest wprowadzić pojęcie
Do opisu działania automatu liniowo ograniczonego wygodnie jest wprowadzić pojęcie
konfiguracji (podobnie jak dla automatów ze stosem).
konfiguracji (podobnie jak dla automatów ze stosem).


Konfiguracją automatu liniowo ograniczonego jest
Konfiguracją automatu liniowo ograniczonego jest
słowo  <math>\displaystyle vsw\in (\Sigma _{T}\cup S)^{*} </math> ,
słowo  <math>vsw\in (\Sigma _{T}\cup S)^{*}</math> ,
w&nbsp;którym  <math>\displaystyle s\in S,\; v,w\in \Sigma _{T}^{*} </math> . Pomiędzy dwoma konfiguracjami
w&nbsp;którym  <math>s\in S,\; v,w\in \Sigma _{T}^{*}</math> . Pomiędzy dwoma konfiguracjami
<math>\displaystyle d_{1},d_{2} </math>  zachodzi relacja bezpośredniego następstwa  <math>\displaystyle d_{1}\mapsto d_{2} </math>  
<math>d_{1},d_{2}</math>  zachodzi relacja bezpośredniego następstwa  <math>d_{1}\mapsto d_{2}</math>  
wtedy i tylko wtedy, gdy spełniony jest jeden z&nbsp;niżej wypisanych warunków, gdzie
wtedy i tylko wtedy, gdy spełniony jest jeden z&nbsp;niżej wypisanych warunków, gdzie
<math>\displaystyle s_{1},s_{2}\in S </math> ,  <math>\displaystyle a,b,c\in \Sigma _{T} </math>  oraz  <math>\displaystyle v,w\in \Sigma _{T}^{*} </math>  
<math>s_{1},s_{2}\in S</math> ,  <math>a,b,c\in \Sigma _{T}</math>  oraz  <math>v,w\in \Sigma _{T}^{*}:</math>  
#  <math>\displaystyle d_{1}=vs_{1}aw </math> ,  <math>\displaystyle d_{2}=vs_{2}bw </math>  oraz  <math>\displaystyle (s_{1},a)P(s_{2},b,0) </math>  
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vs_{2}bw</math>  oraz  <math>(s_{1},a)P(s_{2},b,0)</math>  
#  <math>\displaystyle d_{1}=vs_{1}aw </math> ,  <math>\displaystyle d_{2}=vbs_{2}w </math>  oraz  <math>\displaystyle (s_{1},a)P(s_{2},b,1) </math>  
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vbs_{2}w</math>  oraz  <math>(s_{1},a)P(s_{2},b,1)</math>  
#  <math>\displaystyle d_{1}=vcs_{1}aw </math> ,  <math>\displaystyle d_{2}=vs_{2}cbw </math>  oraz  <math>\displaystyle (s_{1},a)P(s_{2},b,-1) </math>  
#  <math>d_{1}=vcs_{1}aw</math> ,  <math>d_{2}=vs_{2}cbw</math>  oraz  <math>(s_{1},a)P(s_{2},b,-1)</math>  


Przechodnie domknięcie relacji  <math>\displaystyle \mapsto </math>  oznaczać będziemy symbolem
Przechodnie domknięcie relacji  <math>\mapsto</math>  oznaczać będziemy symbolem
<math>\displaystyle \mapsto^{*} </math> i określać mianem obliczenia wykonanego przez automat
<math>\mapsto^{*}</math> i określać mianem obliczenia wykonanego przez automat
liniowo ograniczony.
liniowo ograniczony.


}}
}}


Język rozpoznawany przez automat liniowo ograniczony  <math>\displaystyle \mathcal{A}_{LO} </math>  
Język rozpoznawany przez automat liniowo ograniczony  <math>\mathcal{A}_{LO}</math>  
to zbiór słów nad alfabetem  <math>\displaystyle \Sigma _{I} </math> , pod działaniem których automat
to zbiór słów nad alfabetem  <math>\Sigma _{I}</math> , pod działaniem których automat
wykonuje obliczenie prowadzące do stanu końcowego, czyli
wykonuje obliczenie prowadzące do stanu końcowego, czyli


<center><math>\displaystyle L(\mathcal{A}_{LO})=\left\{ w\in \Sigma _{I}^{*}\: :\: s_{0}\#w\#\mapsto^{*}vs,\; v\in \Sigma _{T}^{*},\, s\in S_{F}\right\} .</math></center>
<center><math>L(\mathcal{A}_{LO})=\left\{ w\in \Sigma _{I}^{*}\ : :\ : s_{0}\#w\#\mapsto^{*}vs,\; v\in \Sigma _{T}^{*},\, s\in S_{F}\right\}</math>.</center>
 
Język  <math>\displaystyle L\subset \Sigma _{I}^{*}  </math>  jest rozpoznawany (akceptowany) przez
automat liniowo ograniczony, jeśli istnieje automat  <math>\displaystyle \mathcal{A}_{LO}  </math>  taki,
że  <math>\displaystyle \mathcal{L}(\mathcal{A}_{LO})=L.  </math>
 
<font color=red>{2900sp}
 
(2256,2000)(1100,-1200)
 
(1000,0){( 1, 0){3400}}
 
(1100,0)(300,0){3}{(0, 1){300}}
 
(1200,100){ <math>\displaystyle {\sharp }  </math> }
 
(1900,100){ <math>\displaystyle {\cdots }  </math> }
 
(2300,0)(300,0){3}{(0, 1){300}}
 
(2400,100){ <math>\displaystyle { c}  </math> }
 
(2700,100){ <math>\displaystyle { a}  </math> }
 
(3100,100){ <math>\displaystyle {\cdots }  </math> }
 
(3600,0)(300,0){3}{(0, 1){300}}
 
(4000,100){ <math>\displaystyle {\sharp }  </math> }
 
(1707,0){( 1, 0){2393}}
 
(1000,300){( 1, 0){3400}}
 
{(2750,-342){( 0, 1){300}} }
 
(5450,0){( 1, 0){3400}}
 
(5600,0)(300,0){3}{(0, 1){300}}
 
(5700,100){ <math>\displaystyle {\sharp }  </math> }
 
(6400,100){ <math>\displaystyle {\cdots }  </math> }
 
(6800,0)(300,0){3}{(0, 1){300}}
 
(6900,100){ <math>\displaystyle { c}  </math> }
 
(7200,100){ <math>\displaystyle { b}  </math> }
 
(7600,100){ <math>\displaystyle {\cdots }  </math> }
 
(8100,0)(300,0){3}{(0, 1){300}}
 
(8500,100){ <math>\displaystyle \sharp  </math> }


(5450,300){( 1, 0){3400}}
Język  <math>L\subset \Sigma _{I}^{*}</math>  jest rozpoznawany (akceptowany) przez
automat liniowo ograniczony, jeśli istnieje automat  <math>\mathcal{A}_{LO}</math>  taki,
że  <math>\mathcal{L}(\mathcal{A}_{LO})=L</math>


{(6950,-342){( 0, 1){300}} }
<center>
<div class="thumb"><div style="width:200px;"><flash>file=Wyklad12_rysunek1.swf|width=200|height=200</flash>
<div.thumbcaption>Rysunek 1</div>
</div></div>
</center>


(2257,-1235){(893,893){ <math>\displaystyle { \large s_{1}}  </math> }}
(6500,-1235){(893,893){ <math>\displaystyle { \large s_{2}}  </math> }}
</font>


Opiszemy teraz możliwe ruchy automatu liniowo ograniczonego. Automat ten
Opiszemy teraz możliwe ruchy automatu liniowo ograniczonego. Automat ten
Linia 274: Linia 221:
prawo. Automat może wymieniać czytaną literę na inną,
prawo. Automat może wymieniać czytaną literę na inną,
ale nie rozszerza miejsca zajętego na taśmie przez czytane słowo.
ale nie rozszerza miejsca zajętego na taśmie przez czytane słowo.
Działa  niedeterministycznie. Czytając literę  <math>\displaystyle a </math>  będąc
Działa  niedeterministycznie. Czytając literę  <math>a</math>, będąc w stanie  <math>s</math>, automat ma kilka możliwości działania. Może mianowicie:
w stanie  <math>\displaystyle s </math>  automat ma kilka możliwości działania. Może
mianowicie:
# zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 1. Głowica czytająca automatu pozostaje w poprzedniej pozycji,
# zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 1. Głowica czytająca automatu pozostaje w poprzedniej pozycji,
# zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 2. Głowica czytająca automatu przesuwa się w prawo,
# zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 2. Głowica czytająca automatu przesuwa się w prawo,
Linia 282: Linia 227:


Związek pomiędzy rodziną języków kontekstowych a wprowadzoną rodziną automatów liniowo
Związek pomiędzy rodziną języków kontekstowych a wprowadzoną rodziną automatów liniowo
ograniczonych ustalają ponizsze twierdzenia.
ograniczonych ustalają poniższe twierdzenia.


{{twierdzenie|2.1||
{{twierdzenie|2.1||
Dla dowolnego języka kontekstowego  <math>\displaystyle L </math>  istnieje automat liniowo ograniczony
Dla dowolnego języka kontekstowego  <math>L</math>  istnieje automat liniowo ograniczony
<math>\displaystyle \mathcal{A}_{LO} </math>  taki, że  <math>\displaystyle \mathcal{L}(\mathcal{A}_{LO})=L </math> .
<math>\mathcal{A}_{LO}</math>  taki, że  <math>\mathcal{L}(\mathcal{A}_{LO})=L</math> .


}}
}}
Linia 292: Linia 237:
{{dowod|||
{{dowod|||
Można założyć,
Można założyć,
bez ograniczenia ogólności naszych rozważań, że gramatyka  <math>\displaystyle G=(V_{N},V_{T},v_{0},P) </math>  
bez ograniczenia ogólności naszych rozważań, że gramatyka  <math>G=(V_{N},V_{T},v_{0},P)</math>  
generująca język  <math>\displaystyle L </math>  ma prawa wyłącznie następujących postaci:
generująca język  <math>L</math>  ma prawa wyłącznie następujących postaci:
# (G)  <math>\displaystyle v\rightarrow x </math> , gdzie  <math>\displaystyle v\in V_{N},x\in V_{N}\cup V_{T},x\neq v_{0} </math>  
# (G)  <math>v\rightarrow x</math> , gdzie  <math>v\in V_{N},x\in V_{N}\cup V_{T},x\neq v_{0}</math>  
# (G)  <math>\displaystyle v_{0}\rightarrow v_{0}v_{1} </math> , gdzie  <math>\displaystyle v_{1}\in V_{N},v_{1}\neq v_{0} </math>  
# (G)  <math>v_{0}\rightarrow v_{0}v_{1}</math> , gdzie  <math>v_{1}\in V_{N},v_{1}\neq v_{0}</math>  
# (G)  <math>\displaystyle v_{1}v_{2}\rightarrow v_{3}v_{4} </math> , gdzie <math>\displaystyle v_{1},...,v_{4}\in V_{N},v_{3},v_{4}\neq v_{0} </math>  
# (G)  <math>v_{1}v_{2}\rightarrow v_{3}v_{4}</math> , gdzie <math>v_{1},\ldots,v_{4}\in V_{N},v_{3},v_{4}\neq v_{0}</math>  
# (G)  <math>\displaystyle v_{0}\rightarrow 1</math>  jeśli  <math>\displaystyle 1\in L </math> .
# (G)  <math>v_{0}\rightarrow 1</math>  jeśli  <math>1\in L</math> .


Określamy automat liniowo ograniczony  <math>\displaystyle \mathcal{A}_{LO}=(\Sigma _{T},S,P,s_{0},S_{F}) </math> ,
Określamy automat liniowo ograniczony  <math>\mathcal{A}_{LO}=(\Sigma _{T},S,P,s_{0},S_{F})</math> ,
przyjmując  <math>\displaystyle \Sigma _{T}=V_{N}\cup V_{T}\cup \{\#,\flat \} </math> ,  <math>\displaystyle S=\{s_{0},s_{1},s_{2},s_{3},s_{4}\}\cup \{s_{v_{1}}:  \displaystyle v_{1}v_{2}\rightarrow v_{3}v_{4}\in P\} </math> ,
przyjmując  <math>\Sigma _{T}=V_{N}\cup V_{T}\cup \{\#,\flat \}</math> ,  <math>S=\{s_{0},s_{1},s_{2},s_{3},s_{4}\}\cup \{s_{v_{1}}:  v_{1}v_{2}\rightarrow v_{3}v_{4}\in P\}</math> ,
<math>\displaystyle \Sigma _{I}=V_{N}\cup V_{T} </math>  ,  <math>\displaystyle S_{F}=\{s_{3}\} </math> ,  <math>\displaystyle s_{0} </math>  -
<math>\Sigma _{I}=V_{N}\cup V_{T}</math>  ,  <math>S_{F}=\{s_{3}\}</math> ,  <math>s_{0}</math>  -
stan początkowy. Relacja przejść automatu  <math>\displaystyle \mathcal{A}_{LO} </math>  zdefiniowana
stan początkowy. Relacja przejść automatu  <math>\mathcal{A}_{LO}</math>  zdefiniowana
jest poniżej:
jest poniżej:
# (A)  <math>\displaystyle (s_{0},\#)\rightarrow (s_{0},\#,1) </math>  
# (A)  <math>(s_{0},\#)\rightarrow (s_{0},\#,1)</math>  
# (A)  <math>\displaystyle (s_{0},\#)\rightarrow (s_{4},\#,1) </math>  jeśli <math>\displaystyle 1\in L </math>  
# (A)  <math>(s_{0},\#)\rightarrow (s_{4},\#,1)</math>  jeśli <math>1\in L</math>  
# (A)  <math>\displaystyle (s_{0},x)\rightarrow (s_{0},x,1) </math>  ,  <math>\displaystyle (s_{0},x)\rightarrow (s_{0},x,-1) </math> dla każdego  <math>\displaystyle x\in V_{N}\cup V_{T} </math>  
# (A)  <math>(s_{0},x)\rightarrow (s_{0},x,1)</math>  ,  <math>(s_{0},x)\rightarrow (s_{0},x,-1)</math> dla każdego  <math>x\in V_{N}\cup V_{T}</math>  
# (A)  <math>\displaystyle (s_{0},x)\rightarrow (s_{0},v,0) </math>  jeśli <math>\displaystyle v\rightarrow x\in P </math> i  <math>\displaystyle x\neq v_{0} </math>  
# (A)  <math>(s_{0},x)\rightarrow (s_{0},v,0)</math>  jeśli <math>v\rightarrow x\in P</math> i  <math>x\neq v_{0}</math>  
# (A)  <math>\displaystyle (s_{0},v_{3})\rightarrow (s_{v_{1}},v_{1},1),\; (s_{v_{1}},v_{4})\rightarrow (s_{0},v_{2},0) </math> jeśli  <math>\displaystyle v_{1}v_{2}\rightarrow v_{3}v_{4}\in P </math>  
# (A)  <math>(s_{0},v_{3})\rightarrow (s_{v_{1}},v_{1},1),\; (s_{v_{1}},v_{4})\rightarrow (s_{0},v_{2},0)</math> jeśli  <math>v_{1}v_{2}\rightarrow v_{3}v_{4}\in P</math>  
# (A)  <math>\displaystyle (s_{0},v_{0})\rightarrow (s_{1},v_{0},-1) </math>  
# (A)  <math>(s_{0},v_{0})\rightarrow (s_{1},v_{0},-1)</math>  
# (A)  <math>\displaystyle (s_{1},\#)\rightarrow (s_{2},\#,1) </math>  
# (A)  <math>(s_{1},\#)\rightarrow (s_{2},\#,1)</math>  
# (A)  <math>\displaystyle (s_{1},\flat )\rightarrow (s_{2},\flat ,1) </math>  
# (A)  <math>(s_{1},\flat )\rightarrow (s_{2},\flat ,1)</math>  
# (A)  <math>\displaystyle (s_{2},v_{0})\rightarrow (s_{3},\flat ,1) </math>  
# (A)  <math>(s_{2},v_{0})\rightarrow (s_{3},\flat ,1)</math>  
# (A)  <math>\displaystyle (s_{3},v_{1})\rightarrow (s_{0},v_{0},0) </math> , gdy <math>\displaystyle v_{0}\rightarrow v_{0}v_{1}\in P </math>  
# (A)  <math>(s_{3},v_{1})\rightarrow (s_{0},v_{0},0)</math> , gdy <math>v_{0}\rightarrow v_{0}v_{1}\in P</math>  
# (A)  <math>\displaystyle (s_{3},\#)\rightarrow s_{3},\#,1),\; (s_{4},\#)\rightarrow (s_{3},\#,1) </math>  
# (A)  <math>(s_{3},\#)\rightarrow s_{3},\#,1),\; (s_{4},\#)\rightarrow (s_{3},\#,1)</math>  


Określony automat  <math>\displaystyle \mathcal{A}_{LO} </math>  rozpoznaje
Określony automat  <math>\mathcal{A}_{LO}</math>  rozpoznaje
tylko te słowa, które są generowane przez gramatykę  <math>\displaystyle G </math> , symulując wstecz
tylko te słowa, które są generowane przez gramatykę  <math>G</math> , symulując wstecz
każde wyprowadzenie gramatyki  <math>\displaystyle G </math> .
każde wyprowadzenie gramatyki  <math>G</math> .


<center><math>\displaystyle \diamondsuit</math></center>}}
}}


Prawdziwe jest również następujące twierdzenie.
Prawdziwe jest również następujące twierdzenie.


{{twierdzenie|2.2||
{{twierdzenie|2.2||
Dla dowolnego języka  <math>\displaystyle L </math>  rozpoznawanego przez automat liniowo ograniczony
Dla dowolnego języka  <math>L</math>  rozpoznawanego przez automat liniowo ograniczony
<math>\displaystyle \mathcal{A}_{LO} </math>  istnieje gramatyka kontekstowa  <math>\displaystyle G </math>  taka, że  <math>\displaystyle L(G)=L </math> .
<math>\mathcal{A}_{LO}</math>  istnieje gramatyka kontekstowa  <math>G</math>  taka, że  <math>L(G)=L</math> .


}}
}}
Linia 346: Linia 291:


{{twierdzenie|2.3||
{{twierdzenie|2.3||
Dla dowolnych języków kontekstowych  <math>\displaystyle L_{1},L_{2}\subset A^{*} </math>  iloczyn
Dla dowolnych języków kontekstowych  <math>L_{1},L_{2}\subset A^{*}</math>  iloczyn
mnogościowy tych języków  <math>\displaystyle L_{1}\cap L_{2} </math>  jest językiem kontekstowym
mnogościowy tych języków  <math>L_{1}\cap L_{2}</math>  jest językiem kontekstowym.


}}
}}
Linia 353: Linia 298:
{{dowod|||
{{dowod|||
(szkic)
(szkic)
Załóżmy, że języki  <math>\displaystyle L_{1},L_{2} </math>  są rozpoznawane przez automaty
Załóżmy, że języki  <math>L_{1},L_{2}</math>  są rozpoznawane przez automaty
liniowo ograniczone,  <math>\displaystyle \mathcal{A}^{1}_{LO} </math>  i  <math>\displaystyle \mathcal{A}_{LO}^{2} </math> .
liniowo ograniczone,  <math>\mathcal{A}^{1}_{LO}</math>  i  <math>\mathcal{A}_{LO}^{2}</math> .
Opiszemy konstrukcję automatu liniowo ograniczonego  <math>\displaystyle \mathcal{A}_{LO} </math> ,
Opiszemy konstrukcję automatu liniowo ograniczonego  <math>\mathcal{A}_{LO}</math> ,
który rozpoznawać będzie wyłącznie słowa akceptowane równocześnie przez oba
który rozpoznawać będzie wyłącznie słowa akceptowane równocześnie przez oba
automaty. Działanie tego automatu jest następujące. Każde słowo będzie czytane
automaty. Działanie tego automatu jest następujące. Każde słowo będzie czytane
trzy razy. Przy pierwszym czytaniu automat  <math>\displaystyle \mathcal{A}_{LO} </math>  dubluje litery,
trzy razy. Przy pierwszym czytaniu automat  <math>\mathcal{A}_{LO}</math>  dubluje litery,
to znaczy w miejsce litery  <math>\displaystyle a </math>  wprowadza parę  <math>\displaystyle (a,a) </math> . Po zakończeniu
to znaczy w miejsce litery  <math>a</math>  wprowadza parę  <math>(a,a)</math> . Po zakończeniu
tej procedury automat wraca do skrajnej lewej pozycji i rozpoczyna symulację
tej procedury automat wraca do skrajnej lewej pozycji i rozpoczyna symulację
automatu  <math>\displaystyle \mathcal{A}^{1}_{LO} </math> . Jeśli ta symulacja doprowadzi do zaakceptowania
automatu  <math>\mathcal{A}^{1}_{LO}</math> . Jeśli ta symulacja doprowadzi do zaakceptowania
czytanego słowa przez automat  <math>\displaystyle \mathcal{A}^{1}_{LO} </math> , to automat  <math>\displaystyle \mathcal{A}_{LO} </math>  
czytanego słowa przez automat  <math>\mathcal{A}^{1}_{LO}</math> , to automat  <math>\mathcal{A}_{LO}</math>  
rozpoczyna obliczenie od początku, symulując teraz pracę automatu  <math>\displaystyle \mathcal{A}_{LO}^{2} </math> .
rozpoczyna obliczenie od początku, symulując teraz pracę automatu  <math>\mathcal{A}_{LO}^{2}</math> .
Jeśli i ta symulacja zakończy się zaakceptowaniem czytanego słowa, to automat
Jeśli i ta symulacja zakończy się zaakceptowaniem czytanego słowa, to automat
przechodzi do ustalonego stanu końcowego, a to oznacza akceptację tego słowa.
przechodzi do ustalonego stanu końcowego, a to oznacza akceptację tego słowa.
Działając w opisany sposób automat  <math>\displaystyle \mathcal{A}_{LO} </math>  rozpoznaje
Działając w opisany sposób, automat  <math>\mathcal{A}_{LO}</math>  rozpoznaje
język  <math>\displaystyle L_{1}\cap L_{2} </math> , a to w świetle udowodnionego powyżej twierdzenia
język  <math>L_{1}\cap L_{2}</math> , a to w świetle udowodnionego powyżej twierdzenia
oznacza, że przecięcie języków kontekstowych  <math>\displaystyle L_{1}\cap L_{2} </math>  jest językiem
oznacza, że przecięcie języków kontekstowych  <math>L_{1}\cap L_{2}</math>  jest językiem
kontekstowym.
kontekstowym.


<center><math>\displaystyle \diamondsuit</math></center>}}
}}


Ponieważ dalsze własności domknietości rodziny języków kontekstowych  pokrywają się
Ponieważ dalsze własności domkniętości rodziny języków kontekstowych  pokrywają się z własnościami języków typu '''(0)''', więc omówimy te własności wspólnie, co będzie mieć miejsce w następnym wykładzie.
z własnościami języków typu '''(0)''', więc omówimy te własności wspólnie, co bedzie mieć
miejsce w następnym wykładzie.


==3. Maszyna Turinga==
==Maszyna Turinga==


[[grafika:Turing1.jpeg|thumb|right||Alan Turing (1912-1954)<br>[[Biografia Turinga|Zobacz biografię]]]]Przejdziemy teraz do prezentacji ogólnego modelu
[[grafika:Turing1.jpeg|thumb|right||Alan Turing (1912-1954)<br>[[Biografia Turinga|Zobacz biografię]]]]
maszyny liczącej, który został
Przejdziemy teraz do prezentacji ogólnego modelu maszyny liczącej, który został
wprowadzony  w 1936 roku przez Alana M. Turinga. Na
wprowadzony  w 1936 roku przez Alana M. Turinga. Na cześć swego autora został on nazwany '''(jednotaśmową) maszyną Turinga'''. Model ten jest podobny w swojej idei do rozważanych wcześniej
cześć swego autora został on nazwany '''(jednotaśmową) maszyną
automatów liniowo ograniczonych, przy czym jednym z podstawowych założeń (i różnic względem automatów) jest nieskończony dostęp do pamięci. Maszyna Turinga może wydawać się  na początku  pojęciem bardzo abstrakcyjnym. Jednak, jak później zobaczymy, stanowi ona
Turinga'''.
Model ten jest podobny w swojej idei do rozważanych wcześniej
automatów liniowo ograniczonych, przy czym jednym z podstawowych założeń ( i różnic względem
automatów) jest
nieskończony dostęp do pamięci.
Maszyna Turinga może wydawać się  na początku  pojęciem
bardzo abstrakcyjnym. Jednak, jak później zobaczymy, stanowi ona
jedną z podstawowych koncepcji współczesnej informatyki. Pozwala
jedną z podstawowych koncepcji współczesnej informatyki. Pozwala
na formalne zdefiniowanie pojęcia algorytmu oraz jego
na formalne zdefiniowanie pojęcia algorytmu oraz jego
złożoności obliczeniowej. Jako model obliczeń pozwala odpowiedzieć
złożoności obliczeniowej. Jako model obliczeń pozwala odpowiedzieć
także na bardzo ważne pytanie: Czy każdy problem można rozwiązać
także na bardzo ważne pytanie: czy każdy problem można rozwiązać
algorytmicznie ?
algorytmicznie?


Jednotaśmowa maszyna Turinga jest podobna w swej idei do automatu
Jednotaśmowa maszyna Turinga jest podobna w swej idei do automatu
Linia 401: Linia 337:
skład którego wchodzą:
skład którego wchodzą:


* dwustronnie nieskończona taśma zbudowana z komórek zawierających symbole z pewnego zadanego alfabetu
* dwustronnie nieskończona taśma zbudowana z komórek zawierających symbole z pewnego zadanego alfabetu,
* głowica która może czytać i zapisywać symbole w komórkach taśmy oraz poruszać się w prawo lub lewo o jedną komórkę lub pozostawać na tej samej pozycji podczas jednego kroku czasowego
* głowica, która może czytać i zapisywać symbole w komórkach taśmy oraz poruszać się w prawo lub lewo o jedną komórkę lub pozostawać na tej samej pozycji podczas jednego kroku czasowego,
* działający sekwencyjnie mechanizm odpowiedzialny za sterowanie maszyną. Mechanizm ten na podstawie symbolu odczytanego z komórki pod głowicą oraz stanu w którym aktualnie znajduje się maszyna, dokonuje zapisu symbolu w tejże komórce, przechodzi do kolejnego stanu i przesuwa głowicę w prawo, lewo lub też nie zmienia pozycji głowicy.
* działający sekwencyjnie mechanizm odpowiedzialny za sterowanie maszyną; mechanizm ten na podstawie symbolu odczytanego z komórki pod głowicą oraz stanu, w którym aktualnie znajduje się maszyna, dokonuje zapisu symbolu w tejże komórce, przechodzi do kolejnego stanu i przesuwa głowicę w prawo, lewo lub też nie zmienia pozycji głowicy.


Podamy teraz formalną
Podamy teraz formalną
Linia 409: Linia 345:
zdefiniujemy maszynę  w języku konfiguracji.
zdefiniujemy maszynę  w języku konfiguracji.


{{definicja|3.1||
{{definicja|3.1||}}
'''(Jednotaśmowa deterministyczna) maszyna Turinga''' jest to
'''(Jednotaśmowa deterministyczna) maszyna Turinga''' jest to
system  <math>\displaystyle \mathbf{MT}=(\Sigma _{T},S,f,s_{0},S_{F}) </math> , w którym
system  <math>\mathbf{MT}=(\Sigma _{T},S,f,s_{0},S_{F})</math> , w którym
<math>\displaystyle \Sigma _{T} </math>  jest skończonym alfabetem,  <math>\displaystyle S </math>  
<math>\Sigma _{T}</math>  jest skończonym alfabetem,  <math>S</math>  
skończonym zbiorem stanów,  <math>\displaystyle S\cap \Sigma _{T}=\emptyset   </math>  oraz
skończonym zbiorem stanów,  <math>S\cap \Sigma _{T}=\emptyset</math>  oraz
wyróżniony jest podzbiór  <math>\displaystyle \Sigma _{I}\subset \Sigma _{T} </math> . Zbiór
wyróżniony jest podzbiór  <math>\Sigma _{I}\subset \Sigma _{T}</math> . Zbiór
<math>\displaystyle \Sigma _{T} </math>  zwany jest alfabetem taśmy, a  <math>\displaystyle \Sigma _{I}
<math>\Sigma _{T}</math>  zwany jest alfabetem taśmy, a  <math>\Sigma _{I}
</math>  - alfabetem wejściowym. Wyróżnione są także: element  <math>\displaystyle \#\in \Sigma _{T}\setminus \Sigma _{I} </math>  zwany markerem końca, stan
</math>  - alfabetem wejściowym. Wyróżnione są także: element  <math>\#\in \Sigma _{T}\setminus \Sigma _{I}</math>  zwany markerem końca, stan
początkowy  <math>\displaystyle s_{0}\in S </math>  oraz  <math>\displaystyle S_{F}\subset S </math>  - zbiór
początkowy  <math>s_{0}\in S</math>  oraz  <math>S_{F}\subset S</math>  - zbiór
stanów końcowych. Natomiast '''funkcja przejść''' jest funkcją
stanów końcowych. Natomiast '''funkcja przejść''' jest funkcją
częściową  <math>\displaystyle f:\: (S\times \Sigma _{T})\rightarrow (S\times \Sigma
częściową  <math>f:\ : (S\times \Sigma _{T})\rightarrow (S\times \Sigma
_{T}\times \{-1,0,1\} </math> .
_{T}\times \{-1,0,1\}</math> .


'''Konfiguracją maszyny Turinga''' jest słowo  <math>\displaystyle vsw\in (\Sigma
'''Konfiguracją maszyny Turinga''' jest słowo  <math>vsw\in (\Sigma
_{T}\cup S)^{*} </math> , w którym  <math>\displaystyle s\in S,\; v,w\in \Sigma _{T}^{*}
_{T}\cup S)^{*}</math> , w którym  <math>s\in S,\; v,w\in \Sigma _{T}^{*}
</math> . Pomiędzy dwiema konfiguracjami  <math>\displaystyle d_{1},d_{2} </math>  zachodzi
</math> . Pomiędzy dwiema konfiguracjami  <math>d_{1},d_{2}</math>  zachodzi
'''relacja bezpośredniego następstwa'''  <math>\displaystyle d_{1}\mapsto d_{2} </math>  
'''relacja bezpośredniego następstwa'''  <math>d_{1}\mapsto d_{2}</math>  
wtedy i&nbsp;tylko wtedy, gdy spełniony jest jeden z niżej wypisanych
wtedy i&nbsp;tylko wtedy, gdy spełniony jest jeden z niżej wypisanych
warunków, gdzie  <math>\displaystyle s_{1},s_{2}\in S </math> ,  <math>\displaystyle a,b,c\in \Sigma _{T} </math>  
warunków, gdzie  <math>s_{1},s_{2}\in S</math> ,  <math>a,b,c\in \Sigma _{T}</math>  
oraz  <math>\displaystyle v,w\in \Sigma _{T}^{*} </math>  
oraz  <math>v,w\in \Sigma _{T}^{*}</math>:
#  <math>\displaystyle d_{1}=vs_{1}aw </math> ,  <math>\displaystyle d_{2}=vs_{2}bw </math>  oraz  <math>\displaystyle f(s_{1},a)=(s_{2},b,0) </math>  
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vs_{2}bw</math>  oraz  <math>f(s_{1},a)=(s_{2},b,0)</math>  
#  <math>\displaystyle d_{1}=vs_{1}aw </math> ,  <math>\displaystyle d_{2}=vbs_{2}w </math>  oraz  <math>\displaystyle f(s_{1},a)=(s_{2},b,1) </math> i  <math>\displaystyle w\neq 1 </math>  
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vbs_{2}w</math>  oraz  <math>f(s_{1},a)=(s_{2},b,1)</math> i  <math>w\neq 1</math>  
#  <math>\displaystyle d_{1}=vs_{1}\# </math> ,  <math>\displaystyle d_{2}=vbs_{2}\# </math>  oraz  <math>\displaystyle f(s_{1},\#)=(s_{2},b,1) </math>  
#  <math>d_{1}=vs_{1}\#</math> ,  <math>d_{2}=vbs_{2}\#</math>  oraz  <math>f(s_{1},\#)=(s_{2},b,1)</math>  
#  <math>\displaystyle d_{1}=vcs_{1}aw </math> ,  <math>\displaystyle d_{2}=vs_{2}cbw </math>  oraz  <math>\displaystyle f(s_{1},a)=(s_{2},b,-1) </math>  
#  <math>d_{1}=vcs_{1}aw</math> ,  <math>d_{2}=vs_{2}cbw</math>  oraz  <math>f(s_{1},a)=(s_{2},b,-1)</math>  
#  <math>\displaystyle d_{1}=s_{1}\#w </math> ,  <math>\displaystyle d_{2}=s_{2}\#bw </math>  oraz  <math>\displaystyle f(s_{1},\#)=(s_{2},b,-1) </math>  
{{kotwica|pkt.5|}}<math>d_{1}=s_{1}\#w</math> ,  <math>d_{2}=s_{2}\#bw</math>  oraz  <math>f(s_{1},\#)=(s_{2},b,-1)</math>  


Przechodnie domknięcie relacji  <math>\displaystyle \mapsto </math>  oznaczać będziemy
Przechodnie domknięcie relacji  <math>\mapsto</math>  oznaczać będziemy
symbolem  <math>\displaystyle \mapsto^{*} </math> i określać mianem '''obliczenia
symbolem  <math>\mapsto^{*}</math> i określać mianem '''obliczenia
wykonanego''' przez maszynę Turinga. Konfiguracja  <math>\displaystyle d_{1}\in (\Sigma
wykonanego''' przez maszynę Turinga. Konfiguracja  <math>d_{1}\in (\Sigma
_{T}\cup S)^{*} </math>  jest '''końcowa''', jeśli stąd, że  <math>\displaystyle d_{1}\mapsto d_{2} </math> , wynika  <math>\displaystyle d_{2}=d_{1}</math>  Mówimy, że maszyna
_{T}\cup S)^{*}</math>  jest '''końcowa''', jeśli stąd, że  <math>d_{1}\mapsto d_{2}</math> , wynika  <math>d_{2}=d_{1}</math>  Mówimy, że maszyna
Turinga '''zatrzymuje się''' w  <math>\displaystyle d_{1} </math>  wtedy i tylko wtedy,
Turinga '''zatrzymuje się''' w  <math>d_{1}</math>  wtedy i tylko wtedy,
gdy  <math>\displaystyle d_{1} </math>  jest konfiguracją końcową.
gdy  <math>d_{1}</math>  jest konfiguracją końcową.
 
}}


Zauważmy, że wprowadzenie markera końca jest zabiegiem czysto formalnym. Pozwala
Zauważmy, że wprowadzenie markera końca jest zabiegiem czysto formalnym. Pozwala on z jednej strony na oznaczenie słowa wejściowego, a z drugiej strony wskazuje na elementy taśmy, które były zmieniane (czy to przez wprowadzenie słowa wejściowego, czy też poprzez ruch głowicy).
on z jednej strony na oznaczenie słowa wejściowego a z drugiej
strony wskazuje na elementy taśmy które były zmieniane (czy to przez
wprowadzenie słowa wejściowego czy też poprzez ruch głowicy).


{{definicja|3.2||
{{definicja|3.2||
Język rozpoznawany przez maszynę Turinga  <math>\displaystyle MT </math>  jest to zbiór
Język rozpoznawany przez maszynę Turinga  <math>MT</math>  jest to zbiór


<center><math>\displaystyle L(\mathbf{MT})=\left\{ w\in \Sigma _{T}^{*}\: :\: \sharp s_{0}w\sharp \mapsto^{*}\sharp w_{1}s_{F}w_{2}\sharp ,\; dla\: pewnych\: w_{1},w_{2}\in \Sigma _{T}^{*},s_{F}\in S_{F}\right\} .</math></center>
<center><math>L(\mathbf{MT})=\left\{ w\in \Sigma _{T}^{*}\ : :\ : \sharp s_{0}w\sharp \mapsto^{*}\sharp w_{1}s_{F}w_{2}\sharp ,\; dla\ : pewnych\ : w_{1},w_{2}\in \Sigma _{T}^{*},s_{F}\in S_{F}\right\}</math>.</center>


}}
}}


Język  <math>\displaystyle L\subset \Sigma _{I}^{*} </math>  jest rozpoznawany (akceptowany)
Język  <math>L\subset \Sigma _{I}^{*}</math>  jest rozpoznawany (akceptowany)
przez maszynę Turinga, jeśli istnieje  <math>\displaystyle MT </math>  taka, że  <math>\displaystyle L(\mathcal{MT})=L</math>  Klasę języków rozpoznawanych przez maszynę
przez maszynę Turinga, jeśli istnieje  <math>MT</math>  taka, że  <math>L(\mathcal{MT})=L</math>  Klasę języków rozpoznawanych przez maszynę
Turinga oznaczamy  <math>\displaystyle \mathcal{L}(MT) </math> .
Turinga oznaczamy  <math>\mathcal{L}(MT)</math> .


We wprowadzonym przez nas ujęciu formalnym, działanie maszyny
We wprowadzonym przez nas ujęciu formalnym, działanie maszyny
Turinga należy wyobrażać sobie następująco. W pierwszym etapie na
Turinga należy wyobrażać sobie następująco. W pierwszym etapie na
taśmę zostają zapisane symbole słowa wejściowego (z alfabetu
taśmę zostają zapisane symbole słowa wejściowego (z alfabetu
<math>\displaystyle \Sigma_I</math>) a następnie komórki przyległe zostają oznaczone
<math>\Sigma_I</math>), a następnie komórki przyległe zostają oznaczone
symbolami <math>\displaystyle \sharp</math>. Jednocześnie maszyna jest sprowadzana do stanu
symbolami <math>\sharp</math>. Jednocześnie maszyna jest sprowadzana do stanu
<math>\displaystyle s_0</math> a głowica zostaje ustawiona nad pierwszym symbolem słowa
<math>s_0</math>, a głowica zostaje ustawiona nad pierwszym symbolem słowa
wejściowego. W tym momencie rozpoczyna się sekwencyjne przetwarzanie
wejściowego. W tym momencie rozpoczyna się sekwencyjne przetwarzanie
zawartości taśmy przez maszynę. Jeśli maszyna "zatrzyma się", tzn.
zawartości taśmy przez maszynę. Jeśli maszyna "zatrzyma się", tzn.
w dwóch kolejnych chwilach czasowych nie wykona ruchu i jednocześnie
w dwóch kolejnych chwilach czasowych nie wykona ruchu i jednocześnie
nie zmieni stanu i symbolu taśmy, sprawdzany jest jej aktualny stan.
nie zmieni stanu i symbolu taśmy, sprawdzany jest jej aktualny stan.
Jeśli stan był akceptujący (czyli należał do zbioru <math>\displaystyle S_F</math>) to
Jeśli stan był akceptujący (czyli należał do zbioru <math>S_F</math>), to
maszyna zaakceptowała słowo, w przeciwnym razie słowo odrzuciła
maszyna zaakceptowała słowo, w przeciwnym razie - słowo odrzuciła
(gdyż nie może już osiągnąć stanu ze zbioru <math>\displaystyle S_F</math>). Należy zwrócić
(gdyż nie może już osiągnąć stanu ze zbioru <math>S_F</math>). Należy zwrócić
uwagę na to, że dla niektórych konfiguracji początkowych maszyna może
uwagę na to, że dla niektórych konfiguracji początkowych maszyna może
nigdy się nie zatrzymać, a mimo to słowo zostanie przez nią
nigdy się nie zatrzymać, a mimo to słowo zostanie przez nią
zaakceptowane. To samo tyczy się odrzucania słów, jednak w tej
zaakceptowane. To samo tyczy się odrzucania słów, jednak w tej
sytuacji dowód, że słowo nie zostanie zaakceptowane może być
sytuacji dowód, że słowo nie zostanie zaakceptowane, może być
problematyczny. Zaprezentowane podejście ma na celu uproszczenie i
problematyczny. Zaprezentowane podejście ma na celu uproszczenie i
tak już dość technicznych dowodów twierdzeń pojawiających się w tym
tak już dość technicznych dowodów twierdzeń pojawiających się w tym
wykładzie. Związki pomiędzy akceptowaniem a zatrzymywaniem maszyny
wykładzie. Związki pomiędzy akceptowaniem a zatrzymywaniem maszyny
Turinga zostaną skomentowane później (zob. Wniosek&nbsp;[[##WnL+Stop|Uzupelnic WnL+Stop|]]).
Turinga zostaną skomentowane później (zob. Wniosek [[#wn.4.1|4.1]]).
W pierwszej kolejności przedstawiamy dwa przykłady:
W pierwszej kolejności przedstawiamy dwa przykłady:


{{przyklad|3.1||
{{przyklad|3.1||
Skonstruujemy maszynę Turinga <math>\displaystyle MT_1</math> która rozpoznaje język postaci
Skonstruujemy maszynę Turinga <math>MT_1</math>, która rozpoznaje język postaci
<math>\displaystyle L=\left\{0^{2^n}\; : \; n\geqslant 0\right\}</math>. Zamierzone działanie maszyny
<math>L=\left\{0^{2^n}\; : \; n\geqslant 0\right\}</math>. Zamierzone działanie maszyny
<math>\displaystyle MT_1</math> można opisać następująco:
<math>MT_1</math> można opisać następująco:


# Przejdź od lewego markera do prawego zaznaczając symbolem <math>\displaystyle \diamondsuit</math> co drugie <math>\displaystyle 0</math>.
# Przejdź od lewego markera do prawego, zaznaczając symbolem <math>\diamondsuit</math> co drugie <math>0</math>.
# Jeśli było tylko jedno <math>\displaystyle 0</math> to '''akceptuj'''.
# Jeśli było tylko jedno <math>0</math>, to '''akceptuj'''.
# Jeśli w kroku 1. obszar pomiędzy markerami zawierał nieparzystą ilość <math>\displaystyle 0</math> to '''odrzuć'''.
# Jeśli w kroku 1. obszar pomiędzy markerami zawierał nieparzystą ilość <math>0</math>, to '''odrzuć'''.
# Powróć do lewego markera.
# Powróć do lewego markera.
# Powtórz działanie od 1.
# Powtórz działanie od 1.


Zwróćmy uwagę, że o ile jasne jest w jaki sposób maszyna ma
Zwróćmy uwagę, że o ile jasne jest, w jaki sposób maszyna ma
akceptować słowa wejściowe, odrzucanie tych słów nie zostało
akceptować słowa wejściowe, odrzucanie tych słów nie zostało
zdefiniowane. Aby ominąć ten problem, wprowadzimy jeden dodatkowy
zdefiniowane. Aby ominąć ten problem, wprowadzimy jeden dodatkowy
stan (nie należący do stanów końcowych) po osiągnięciu którego
stan (nie należący do stanów końcowych), po osiągnięciu którego
maszyna się zatrzymuje (tzn. nie wykonuje ruchów i przepisuje na
maszyna się zatrzymuje (tzn. nie wykonuje ruchów i przepisuje na
taśmie wciąż ten sam symbol).
taśmie wciąż ten sam symbol).


Określamy kolejno elementy składowe maszyny <math>\displaystyle MT_1</math>:
Określamy kolejno elementy składowe maszyny <math>MT_1</math>:
<center><math>\displaystyle
<center><math>
\Sigma_I=\left\{0\right\}\quad,\quad
\Sigma_I=\left\{0\right\}\quad,\quad
\Sigma_T=\left\{0,\diamondsuit,\clubsuit,\sharp\right\}
\Sigma_T=\left\{0,\diamondsuit,\clubsuit,\sharp\right\}</math>,</center>
</math></center>


<center><math>\displaystyle
<center><math>
S=\left\{s_0,s_1,s_2,s_3,s_4,s_A,s_R\right\}\quad, \quad S_F=\left\{s_A\right\}
S=\left\{s_0,s_1,s_2,s_3,s_4,s_A,s_R\right\}\quad, \quad S_F=\left\{s_A\right\}</math></center>
</math></center>


Pozostaje jeszcze zdefiniować funkcję przejść.
Pozostaje jeszcze zdefiniować funkcję przejść:
}}
}}


{| border=1 align=center
<center><math>\begin{array} {c|c|c|c|c|} (s_0,\sharp)\mapsto (s_R,\sharp,0) & (s_1,\diamondsuit)\mapsto(s1,\diamondsuit,1)\\
|-
\hline (s_0,0)\mapsto(s_1,\clubsuit,1) & (s_1,0) \mapsto(s_2,\diamondsuit,1)\\
| <math>\displaystyle (s_0,\sharp)\mapsto (s_R,\sharp,0)</math>  ||  <math>\displaystyle (s_1,\diamondsuit)\mapsto(s1,\diamondsuit,1)</math>
\hline & (s_1,\sharp)\mapsto(s_A,\sharp,0)\\
|-
\hline (s_2,\diamondsuit)\mapsto(s_2,\diamondsuit,1) & (s_3,0)\mapsto(s_2,\diamondsuit,1)\\
| <math>\displaystyle (s_0,0)\mapsto(s_1,\clubsuit,1)</math>  ||  <math>\displaystyle (s_1,0) \mapsto(s_2,\diamondsuit,1)</math>
\hline (s_2,\sharp)\mapsto(s_4,\sharp,-1) & (s_3,\diamondsuit)\mapsto(s_3,\diamondsuit,1)\\
|-
\hline (s_2,0)\mapsto(s_3,0,1) & (s_3,\sharp)\mapsto(s_R,\sharp,0)\\
| ||  <math>\displaystyle (s_1,\sharp)\mapsto(s_A,\sharp,0)</math>
\hline (s_4,0)\mapsto(s_4,0,-1) & \\
|-
\hline (s_4,\diamondsuit)\mapsto(s_4,\diamondsuit,-1) & \\
|  <math>\displaystyle (s_2,\diamondsuit)\mapsto(s_2,\diamondsuit,1)</math>  ||  <math>\displaystyle (s_3,0)\mapsto(s_2,\diamondsuit,1)</math>
\hline (s_4,\clubsuit)\mapsto(s_2,\clubsuit,1) & \\
|-
\hline (s_A,\sharp)\mapsto(s_A,\sharp,0) & (s_R,\sharp)\mapsto(s_R,\sharp,0)\\
| <math>\displaystyle (s_2,\sharp)\mapsto(s_4,\sharp,-1)</math>  ||  <math>\displaystyle (s_3,\diamondsuit)\mapsto(s_3,\diamondsuit,1)</math>
\hline \end{array}</math></center>
|-
| <math>\displaystyle (s_2,0)\mapsto(s_3,0,1)</math>  ||  <math>\displaystyle (s_3,\sharp)\mapsto(s_R,\sharp,0)</math>
|-
| <math>\displaystyle (s_4,0)\mapsto(s_4,0,-1)</math>
|-
| <math>\displaystyle (s_4,\diamondsuit)\mapsto(s_4,\diamondsuit,-1)</math>
|-
| <math>\displaystyle (s_4,\clubsuit)\mapsto(s_2,\clubsuit,1)</math>
|-
|  <math>\displaystyle (s_A,\sharp)\mapsto(s_A,\sharp,0)</math>  ||  <math>\displaystyle (s_R,\sharp)\mapsto(s_R,\sharp,0)</math>
|-
|
|}


W miejsce tabeli wygodniej jest zobrazować funkcję przejść maszyny
W miejsce tabeli wygodniej jest zobrazować funkcję przejść maszyny
Turinga na etykietowanym grafie skierowanym. Zostało to zrobione na
Turinga na etykietowanym grafie skierowanym. Zostało to zrobione na
poniższym rysunku.
poniższym rysunku:
 
[[File:file=ja-lekcja12-w-rys1.mp4|350x350px|thumb|center|Rysunek 2]]
<font color=red>RYSUNEK ja-lekcja12-w-rys1</font><br>
Łatwo zauważyć, że wprowadzona funkcja przejścia określa maszynę
 
spełniającą postawione przez nas warunki. Symbol <math>\clubsuit</math> został wprowadzony dla odróżnienia wystąpienia pojedynczego zera od sytuacji, gdy liczba zer jest nieparzysta i większa od <math>1</math>.
Łatwo zauważyć że wprowadzona funkcja przejścia określa maszynę
spełniającą postawione przez nas warunki. Symbol <math>\displaystyle \clubsuit</math> został
wprowadzony dla odróżnienia wystąpienia pojedynczego zera od
sytuacji gdy liczba zer jest nieparzysta i większa od <math>\displaystyle 1</math>.


Aby lepiej zrozumieć działanie maszyny <math>\displaystyle MT_1</math> zasymulujemy jej
Aby lepiej zrozumieć działanie maszyny <math>MT_1</math>, zasymulujemy jej działanie na dwóch słowach wejściowych, przy czym pierwsze z nich będzie należało do języka <math>L</math>, a drugie nie:
działanie na dwóch słowach wejściowych, przy czym pierwsze z nich
<center><math>
będzie należało do języka <math>\displaystyle L</math>, a drugie nie.
<center><math>\displaystyle
\begin{array} {c c c c c c c c}
\begin{array} {c c c c c c c c}
&\sharp s_0 0000 \sharp & \mapsto & \sharp \clubsuit s_1 000 \sharp
&\sharp s_0 0000 \sharp & \mapsto & \sharp \clubsuit s_1 000 \sharp
Linia 586: Linia 496:
</math></center>
</math></center>


Wykazaliśmy więc, że <math>\displaystyle \sharp s_0 0000 \sharp
Wykazaliśmy więc, że <math>\sharp s_0 0000 \sharp
\mapsto^* \sharp \clubsuit \diamondsuit \diamondsuit \diamondsuit
\mapsto^* \sharp \clubsuit \diamondsuit \diamondsuit \diamondsuit
s_A \sharp</math>. Zatem <math>\displaystyle 0^4 \in L(MT_1)</math>.
s_A \sharp</math>. Zatem <math>0^4 \in L(MT_1)</math>.


<font color=red>ANIMACJA  ja-lekcja12-w-anim1</font>
[[File:ja-lekcja12-w-anim1a.mp4|250x250px|thumb|center|Animacja 1]]


Dla porównania:
Dla porównania:
<center><math>\displaystyle
<center><math>
\begin{array} {c c c c c c c c}
\begin{array} {c c c c c c c c}
&\sharp s_0 000 \sharp & \mapsto & \sharp \clubsuit s_1 00 \sharp
&\sharp s_0 000 \sharp & \mapsto & \sharp \clubsuit s_1 00 \sharp
Linia 603: Linia 513:
</math></center>
</math></center>


Czyli zgodnie z naszym założeniem <math>\displaystyle 0^3\not \in L(MT_1)</math>
Czyli zgodnie z naszym założeniem <math>0^3\not \in L(MT_1)</math>.
 
[[File:ja-lekcja12-w-anim1b.mp4|250x250px|thumb|center|Animacja 2]]
<font color=red>ANIMACJA  ja-lekcja12-w-anim1</font>


{{przyklad|3.2||
{{przyklad|3.2||
Przedstawimy maszynę Turinga <math>\displaystyle MT_2</math> akceptującą język
Przedstawimy maszynę Turinga <math>MT_2</math> akceptującą język
<center><math>\displaystyle
<center><math>
L=\left\{w \overleftarrow{w} \: : \: w\in \left\{0,1\right\}^*\right\}
L=\left\{w \overleftarrow{w} \ : : \ : w\in \left\{0,1\right\}^*\right\}</math>,</center>
</math></center>


gdzie <math>\displaystyle \overleftarrow{w}</math> oznacza lustrzane odbicie słowa <math>\displaystyle w</math>.
gdzie <math>\overleftarrow{w}</math> oznacza lustrzane odbicie słowa <math>w</math>.
Elementy języka <math>\displaystyle L</math> nazywamy palindromami. Definiujemy alfabet
Elementy języka <math>L</math> nazywamy palindromami. Definiujemy alfabet maszyny:
maszyny
<center><math>
<center><math>\displaystyle
\Sigma_I=\left\{0,1\right\}\quad,\quad \Sigma_T=\left\{0,1,\sharp\right\}</math>,</center>
\Sigma_I=\left\{0,1\right\}\quad,\quad \Sigma_T=\left\{0,1,\sharp\right\}
</math></center>


oraz zbiory stanów
oraz zbiory stanów
<center><math>\displaystyle
<center><math>
S=\left\{s_0,r_0,r_0',q_0,r_1,r_1',q_1,l,s_A,s_R\right\}\quad, \quad
S=\left\{s_0,r_0,r_0',q_0,r_1,r_1',q_1,l,s_A,s_R\right\}\quad, \quad
S_F=\left\{s_A\right\}
S_F=\left\{s_A\right\}</math></center>
</math></center>


}}
}}


Funkcję przejść maszyny <math>\displaystyle MT_2</math> określa tabela:
Funkcję przejść maszyny <math>MT_2</math> określa tabela:
 
{| border=1 align=center cellpadding="1" cellspacing="1"
|-
| <math>\displaystyle (s_0,\sharp)\mapsto (s_A,\sharp,0)</math>  ||  <math>\displaystyle (s_0,0)\mapsto (r_0,\sharp,1)</math>  ||  <math>\displaystyle (s_0,1)\mapsto (r_1,\sharp,1)</math>
|-
|  <math>\displaystyle (r_0,\sharp)\mapsto (s_R,\sharp,0)</math>  ||  <math>\displaystyle (r_0,0)\mapsto (r_0',0,1)</math>  ||  <math>\displaystyle (r_0,1)\mapsto (r_0',1,1)</math>
|-
|  <math>\displaystyle (r_0',\sharp)\mapsto (q_0,\sharp,-1)</math>  ||  <math>\displaystyle (r_0',0)\mapsto (r_0',0,1)</math>  ||  <math>\displaystyle (r_0',1)\mapsto (r_0',1,1)</math>
|-
|  ||  <math>\displaystyle (q_0,0)\mapsto (l,\sharp,-1)</math>  ||  <math>\displaystyle (q_0,1)\mapsto (s_R,\sharp,-1)</math>
|-
|  <math>\displaystyle (r_1,\sharp)\mapsto (s_R,\sharp,0)</math>  ||  <math>\displaystyle (r_1,0)\mapsto (r_1',0,1)</math>  ||  <math>\displaystyle (r_1,1)\mapsto (r_1',1,1)</math>
|-
|  <math>\displaystyle (r_1',\sharp)\mapsto (q_1,\sharp,-1)</math>  ||  <math>\displaystyle (r_1',0)\mapsto (r_1',0,1)</math>  ||  <math>\displaystyle (r_1',1)\mapsto (r_1',1,1)</math>
|-
|  ||  <math>\displaystyle (q_1,0)\mapsto (s_R,\sharp,0)</math>  ||  <math>\displaystyle (q_1,1)\mapsto (l,\sharp,-1)</math>
|-
|  <math>\displaystyle (l,\sharp)\mapsto (s_0,\sharp,1)</math>  ||  <math>\displaystyle (l,0)\mapsto (l,0,-1)</math>  ||  <math>\displaystyle (l,1)\mapsto (l,1,-1)</math>
|-
|  <math>\displaystyle (s_R,\sharp)\mapsto (s_R,\sharp,0)</math> ||  ||
|-
|  <math>\displaystyle (s_A,\sharp)\mapsto (s_A,\sharp,0)</math> ||  ||
 
|}


co dla przejrzystości zobrazowano na Rysunku.
<center><math>\begin{array} {c|c|c|c|c|} (s_0,\sharp)\mapsto (s_A,\sharp,0) & (s_0,0)\mapsto (r_0,\sharp,1) & (s_0,1)\mapsto (r_1,\sharp,1)\\
\hline (r_0,\sharp)\mapsto (s_R,\sharp,0) & (r_0,0)\mapsto (r_0',0,1) & (r_0,1)\mapsto (r_0',1,1)\\
\hline (r_0',\sharp)\mapsto (q_0,\sharp,-1) & (r_0',0)\mapsto (r_0',0,1) & (r_0',1)\mapsto (r_0',1,1)\\
\hline  & (q_0,0)\mapsto (l,\sharp,-1) & (q_0,1)\mapsto (s_R,\sharp,-1)\\
\hline (r_1,\sharp)\mapsto (s_R,\sharp,0) & (r_1,0)\mapsto (r_1',0,1) & (r_1,1)\mapsto (r_1',1,1)\\
\hline (r_1',\sharp)\mapsto (q_1,\sharp,-1) & (r_1',0)\mapsto (r_1',0,1) & (r_1',1)\mapsto (r_1',1,1)\\
\hline  & (q_1,0)\mapsto (s_R,\sharp,0) & (q_1,1)\mapsto (l,\sharp,-1)\\
\hline (l,\sharp)\mapsto (s_0,\sharp,1) & (l,0)\mapsto (l,0,-1) & (l,1)\mapsto (l,1,-1)\\
\hline (s_R,\sharp)\mapsto (s_R,\sharp,0) &  & \\
\hline (s_A,\sharp)\mapsto (s_A,\sharp,0) &  & \\
\hline \end{array}</math></center>


<font color=red>RYSUNEK ja-lekcja12-w-rys3</font><br>
co dla przejrzystości zobrazowano na Rysunku 3.
 
[[File:file=ja-lekcja12-w-rys3.mp4|500x500px|thumb|center|Rysunek 3]]
==4. Inne możliwe definicje maszyn Turinga==
==Inne możliwe definicje maszyn Turinga==


Istnieje kilka możliwych definicji maszyny Turinga, które jak się
Istnieje kilka możliwych definicji maszyny Turinga, które jak się
okazuje są równoważne pod względem możliwości obliczeniowych (tzn.
okazuje są równoważne pod względem możliwości obliczeniowych (tzn.
rozpoznają dokładnie samą klasę języków). Naszkicujemy kilka
rozpoznają dokładnie samą klasę języków). Naszkicujemy kilka
wybranych podejść.
wybranych podejść.


===4.1 Maszyna wielotaśmowa===
===Maszyna wielotaśmowa===


W tym modelu zakłada się że
W tym modelu zakłada się, że głowica ma do dyspozycji nie tylko jedną, ale wiele taśm, na których może zapisywać i odczytywać symbole. Zakłada się przy tym, że słowo wejściowe znajduje się na pierwszej taśmie. Aby symulować maszynę wielotaśmową na jednej taśmie, należy zamienić alfabet taśmy na alfabet <math>(\Sigma_T)^k</math>, gdzie <math>k</math> oznacza ilość taśm. W tym momencie zapis na taśmie <math>i</math>-tej jest realizowany przez zmianę odpowiedniej
głowica ma do dyspozycji nie tylko jedną ale wiele taśma na których
może zapisywać i odczytywać symbole. Zakłada się przy tym że słowo
wejściowe znajduje się na pierwszej taśmie. Aby symulować maszynę
wielotaśmową na jednej taśmie należy zamienić alfabet taśmy na
alfabet <math>\displaystyle (\Sigma_T)^k</math> gdzie <math>\displaystyle k</math> oznacza ilość taśm. W tym momencie
zapis na taśmie <math>\displaystyle i</math>-tej jest realizowany przez zmianę odpowiedniej
współrzędnej litery z nowego alfabetu (zob. Rys. 4.a). Czyli w
współrzędnej litery z nowego alfabetu (zob. Rys. 4.a). Czyli w
opisywanym przypadku funkcja przejść będzie operowała na
opisywanym przypadku funkcja przejść będzie operowała na
następujących zbiorach:
następujących zbiorach:
<center><math>\displaystyle
<center><math>
f:\: (S\times \Sigma^k_{T} )\rightarrow (S \times \Sigma^k_{T}
f:\ : (S\times \Sigma^k_{T} )\rightarrow (S \times \Sigma^k_{T}
\times \{-1,0,1\} ).
\times \{-1,0,1\} )</math></center>
</math></center>
 
===4.2 Taśma jednostronnie nieskończona===


Model ten zakłada że
===Taśma jednostronnie nieskończona===
taśma jest ograniczona z jednej ze stron. Różnica w porównaniu z
rozważaną przez nas maszyną Turinga polega na tym że nie jest
dozwolone przesuwanie lewego markera (tzn. funkcja przejść nie
może zawierać przejść typu ([[##trans5|Uzupelnic trans5|]])). W tej sytuacji aby
symulować maszynę z taśmą obustronnie nieskończoną na maszynie z
taśmą ograniczoną z jednej strony wystarczy zasymulować taśmę
obustronnie nieskończoną poprzez rozszerzenie alfabetu (zob. Rys.
4.b).


<font color=red>RYSUNEK ja-lekcja12-w-rys4</font><br>
Model ten zakłada, że taśma jest ograniczona z jednej ze stron. Różnica w porównaniu z rozważaną przez nas maszyną Turinga polega na tym, że nie jest dozwolone przesuwanie lewego markera (tzn. funkcja przejść nie może zawierać przejść typu [[#pkt.5|punkt 5]] definicji 3.1. W tej sytuacji, aby symulować maszynę z taśmą obustronnie nieskończoną na maszynie z taśmą ograniczoną z jednej strony, wystarczy zasymulować taśmę obustronnie nieskończoną poprzez rozszerzenie alfabetu (zob. Rys. 4.b).
 
[[File:file=ja-lekcja12-w-rys4.mp4|350x350px|thumb|center|Rysunek 4]]
===4.3 Wielogłowicowa maszyna wielotaśmowa===
===Wielogłowicowa maszyna wielotaśmowa===


W tym
W tym
podejściu zakłada się dodatkowo, że każda z taśm posiada swoją
podejściu zakłada się dodatkowo, że każda z taśm posiada swoją
głowicę. Inaczej mówiąc mamy do czynienia z iloczynem kartezjańskim
głowicę. Inaczej mówiąc, mamy do czynienia z iloczynem kartezjańskim
<math>\displaystyle k</math> niezależnych maszyn jednotaśmowych. Akceptowany język jest w
<math>k</math> niezależnych maszyn jednotaśmowych. Akceptowany język jest w
tym momencie <math>\displaystyle k</math>-wymiarowy. Oczywiście, słowo postaci
tym momencie <math>k</math>-wymiarowy. Oczywiście, słowo postaci
<math>\displaystyle (w,1,\dots,1)\in (\Sigma_T^*)^k</math> można w naturalny sposób
<math>(w,1,\dots,1)\in (\Sigma_T^*)^k</math> można w naturalny sposób
utożsamiać z <math>\displaystyle w\in \Sigma_T</math>. Z drugiej strony maszynę
utożsamiać z <math>w\in \Sigma_T</math>. Z drugiej strony maszynę
wielogłowicową można symulować na jednotaśmowej w następujący
wielogłowicową można symulować na jednotaśmowej w następujący
sposób:
sposób:
# Jako zbiór stanów bierzemy <math>\displaystyle S^k</math>.
# Jako zbiór stanów bierzemy <math>S^k</math>.
# Słowa startowe <math>\displaystyle w_1,\dots, w_k</math> zapisujemy jako konfigurację początkową maszyny jednotaśmowej w postaci: <center><math>\displaystyle \sharp (s_0)^k \$ \dot{1} w_1 \$ \dot{2} w_2 \$ \dots \$ \dot{k} w_k \$ </math></center> Symbole <math>\displaystyle \$</math> mają za zadanie wirtualnego rozdzielenia taśm. Symbole <math>\displaystyle \dot{i}</math> wskazują na położenie <math>\displaystyle i</math>-tej głowicy na taśmie.
# Słowa startowe <math>w_1,\dots, w_k</math> zapisujemy jako konfigurację początkową maszyny jednotaśmowej w postaci: <center><math>\sharp (s_0)^k \$ \dot{1} w_1 \$ \dot{2} w_2 \$ \dots \$ \dot{k} w_k \$</math></center> Symbole <math>\$</math> mają za zadanie wirtualnego rozdzielenia taśm. Symbole <math>\dot{i}</math> wskazują na położenie <math>i</math>-tej głowicy na taśmie.
# W trakcie symulacji przechodzimy pomiędzy markerami i wykonujemy przejścia dla kolejnych głowic.
# W trakcie symulacji przechodzimy pomiędzy markerami i wykonujemy przejścia dla kolejnych głowic.


Linia 714: Linia 588:
przypadku bardzo techniczne. Musimy zapewnić możliwość poszerzania
przypadku bardzo techniczne. Musimy zapewnić możliwość poszerzania
obszaru zapisu na poszczególnych taśmach, co jest realizowane
obszaru zapisu na poszczególnych taśmach, co jest realizowane
poprzez dopisanie nowego symbolu i przepisywanie przyległych symboli
poprzez dopisanie nowego symbolu i przepisywanie przyległych symboli,
aż do markera włącznie. Następnie należy wrócić do poprzedniego
aż do markera włącznie. Następnie należy wrócić do poprzedniego
miejsca zapisu i symulować działanie kolejnych głowic. Wymaga to
miejsca zapisu i symulować działanie kolejnych głowic. Wymaga to
wprowadzenia sporej liczby stanów pomocniczych. Nie będziemy
wprowadzenia sporej liczby stanów pomocniczych. Nie będziemy
wchodzić w te techniczne szczegóły. Mamy nadzieję że sama idea
zagłębiać się w te techniczne szczegóły. Mamy nadzieję że sama idea
konstrukcji jest w tym momencie jasna.
konstrukcji jest w tym momencie zrozumiała.


Najbardziej ogólna definicja maszyny tego typu dopuszcza dodatkowo
Najbardziej ogólna definicja maszyny tego typu dopuszcza dodatkowo,
aby głowice mogły przeglądać pozostałe taśmy, dzięki czemu zapewnia
aby głowice mogły przeglądać pozostałe taśmy, dzięki czemu zapewnia
się komunikację między głowicami. Symulacja takiej maszyny na jednej
się komunikację między głowicami. Symulacja takiej maszyny na jednej
taśmie jest podobna w swej idei do metody przedstawionej wcześniej.
taśmie jest podobna w swej idei do metody przedstawionej wcześniej.


===4.4 Maszyna niedeterministyczna===
===Maszyna niedeterministyczna===


Ten typ maszyn ma ogromne
Ten typ maszyn ma ogromne
znaczenie dla teorii złożoności. Z tego powodu przyglądniemy mu się
znaczenie dla teorii złożoności. Z tego powodu przyglądniemy mu się
dokładniej. Różnica pomiędzy niedeterministyczną maszyną Turinga a
dokładniej. Różnica pomiędzy niedeterministyczną maszyną Turinga a
maszyną deterministyczną polega na tym że funkcja przejść może
maszyną deterministyczną polega na tym, że funkcja przejść może
pozwalać na kilka różnych przejść na skutek tego samego symbolu
pozwalać na kilka różnych przejść na skutek tego samego symbolu
czytanego (gdyż funkcja przejść w tym przypadku będzie
czytanego (gdyż funkcja przejść w tym przypadku będzie
Linia 738: Linia 612:
{{definicja|4.1||
{{definicja|4.1||
'''(Jednotaśmowa) niedeterministyczna maszyna Turinga''' jest to
'''(Jednotaśmowa) niedeterministyczna maszyna Turinga''' jest to
system  <math>\displaystyle \mathbf{NMT}=(\Sigma _{T},S,f,s_{0},S_{F}) </math>  w którym
system  <math>\mathbf{NMT}=(\Sigma _{T},S,f,s_{0},S_{F})</math>, w którym
<math>\displaystyle \Sigma _{T} </math>  jest skończonym alfabetem,  <math>\displaystyle S </math>  
<math>\Sigma _{T}</math>  jest skończonym alfabetem,  <math>S</math>  
skończonym zbiorem stanów,  <math>\displaystyle S\cap \Sigma _{T}=\emptyset   </math>  oraz
skończonym zbiorem stanów,  <math>S\cap \Sigma _{T}=\emptyset</math>  oraz
wyróżniony jest podzbiór  <math>\displaystyle \Sigma _{I}\subset \Sigma _{T} </math> .
wyróżniony jest podzbiór  <math>\Sigma _{I}\subset \Sigma _{T}</math> .
Podobnie jak poprzednio zbiór  <math>\displaystyle \Sigma _{T} </math>  zwany jest
Podobnie jak poprzednio zbiór  <math>\Sigma _{T}</math>  zwany jest
alfabetem taśmy, a  <math>\displaystyle \Sigma _{I} </math>  - alfabetem
alfabetem taśmy, a  <math>\Sigma _{I}</math>  - alfabetem
wejściowym. Wyróżnione są także: element  <math>\displaystyle \#\in \Sigma
wejściowym. Wyróżnione są także: element  <math>\#\in \Sigma
_{T}\setminus \Sigma _{I} </math>  zwany markerem końca, stan początkowy
_{T}\setminus \Sigma _{I}</math>  zwany markerem końca, stan początkowy
<math>\displaystyle s_{0}\in S </math>  oraz  <math>\displaystyle S_{F}\subset S </math>  - zbiór stanów
<math>s_{0}\in S</math>  oraz  <math>S_{F}\subset S</math>  - zbiór stanów
końcowych. Natomiast '''funkcja przejść''' jest funkcją częściową
końcowych. Natomiast '''funkcja przejść''' jest funkcją częściową
<math>\displaystyle f:\: (S\times \Sigma _{T})\rightarrow \mathcal{P}(S\times \Sigma
<math>f:\ : (S\times \Sigma _{T})\rightarrow \mathcal{P}(S\times \Sigma
_{T}\times \{-1,0,1\}) </math>  gdzie <math>\displaystyle \mathcal{P}(A)</math> oznacza zbiór
_{T}\times \{-1,0,1\})</math>  gdzie <math>\mathcal{P}(A)</math> oznacza zbiór
podzbiorów zbioru <math>\displaystyle A</math>.
podzbiorów zbioru <math>A</math>.


'''Konfiguracją maszyny Turinga''' jest słowo  <math>\displaystyle vsw\in (\Sigma
'''Konfiguracją maszyny Turinga''' jest słowo  <math>vsw\in (\Sigma
_{T}\cup S)^{*} </math> , w którym  <math>\displaystyle s\in S,\; v,w\in \Sigma _{T}^{*}
_{T}\cup S)^{*}</math> , w którym  <math>s\in S,\; v,w\in \Sigma _{T}^{*}
</math> , przy czym pomiędzy dwiema konfiguracjami  <math>\displaystyle d_{1},d_{2} </math>  
</math> , przy czym pomiędzy dwiema konfiguracjami  <math>d_{1},d_{2}</math>  
zachodzi '''relacja bezpośredniego następstwa'''  <math>\displaystyle d_{1}\mapsto
zachodzi '''relacja bezpośredniego następstwa'''  <math>d_{1}\mapsto
d_{2} </math>  wtedy i&nbsp;tylko wtedy, gdy spełniony jest jeden z niżej
d_{2}</math>  wtedy i&nbsp;tylko wtedy, gdy spełniony jest jeden z niżej
wypisanych warunków, gdzie  <math>\displaystyle s_{1},s_{2}\in S </math> ,  <math>\displaystyle a,b,c\in
wypisanych warunków, gdzie  <math>s_{1},s_{2}\in S</math> ,  <math>a,b,c\in
\Sigma _{T} </math>  oraz  <math>\displaystyle v,w\in \Sigma _{T}^{*} </math>  
\Sigma _{T}</math>  oraz  <math>v,w\in \Sigma _{T}^{*}</math>:
#  <math>\displaystyle d_{1}=vs_{1}aw </math> ,  <math>\displaystyle d_{2}=vs_{2}bw </math>  oraz  <math>\displaystyle f(s_{1},a)\ni(s_{2},b,0) </math>  
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vs_{2}bw</math>  oraz  <math>f(s_{1},a)\ni(s_{2},b,0)</math>  
#  <math>\displaystyle d_{1}=vs_{1}aw </math> ,  <math>\displaystyle d_{2}=vbs_{2}w </math>  oraz  <math>\displaystyle f(s_{1},a)\ni(s_{2},b,1) </math> i  <math>\displaystyle w\neq 1 </math>  
#  <math>d_{1}=vs_{1}aw</math> ,  <math>d_{2}=vbs_{2}w</math>  oraz  <math>f(s_{1},a)\ni(s_{2},b,1)</math> i  <math>w\neq 1</math>  
#  <math>\displaystyle d_{1}=vs_{1}\# </math> ,  <math>\displaystyle d_{2}=vbs_{2}\# </math>  oraz  <math>\displaystyle f(s_{1},\#)\ni(s_{2},b,1) </math>  
#  <math>d_{1}=vs_{1}\#</math> ,  <math>d_{2}=vbs_{2}\#</math>  oraz  <math>f(s_{1},\#)\ni(s_{2},b,1)</math>  
#  <math>\displaystyle d_{1}=vcs_{1}aw </math> ,  <math>\displaystyle d_{2}=vs_{2}cbw </math>  oraz  <math>\displaystyle f(s_{1},a)\ni(s_{2},b,-1) </math>  
#  <math>d_{1}=vcs_{1}aw</math> ,  <math>d_{2}=vs_{2}cbw</math>  oraz  <math>f(s_{1},a)\ni(s_{2},b,-1)</math>  
#  <math>\displaystyle d_{1}=s_{1}\#w </math> ,  <math>\displaystyle d_{2}=s_{2}\#bw </math>  oraz  <math>\displaystyle f(s_{1},\#)\ni(s_{2},b,-1) </math>  
#  <math>d_{1}=s_{1}\#w</math> ,  <math>d_{2}=s_{2}\#bw</math>  oraz  <math>f(s_{1},\#)\ni(s_{2},b,-1)</math>  


Tak jak poprzednio, przechodnie domknięcie relacji  <math>\displaystyle \mapsto </math>  
Tak jak poprzednio, przechodnie domknięcie relacji  <math>\mapsto</math>  
oznaczać będziemy symbolem  <math>\displaystyle \mapsto^{*} </math> i określać mianem
oznaczać będziemy symbolem  <math>\mapsto^{*}</math> i określać mianem
'''obliczenia wykonanego''' przez maszynę Turinga. Konfiguracja
'''obliczenia wykonanego''' przez maszynę Turinga. Konfiguracja
<math>\displaystyle d_{1}\in (\Sigma _{T}\cup S)^{*} </math>  jest '''końcowa''', jeśli
<math>d_{1}\in (\Sigma _{T}\cup S)^{*}</math>  jest '''końcowa''', jeśli
stąd, że  <math>\displaystyle d_{1}\mapsto d_{2} </math> , wynika  <math>\displaystyle d_{2}=d_{1}</math>  
stąd, że  <math>d_{1}\mapsto d_{2}</math> , wynika  <math>d_{2}=d_{1}</math>  
}}
}}


Pomimo tego, że postawiona definicja maszyny niedeterministycznej
Pomimo tego, że postawiona definicja maszyny niedeterministycznej
jest bardzo podobna do maszyny deterministycznej występuje tutaj
jest bardzo podobna do maszyny deterministycznej, występuje tutaj
jedna bardzo istotna różnica. Słowo wejściowe może prowadzić do
jedna bardzo istotna różnica. Słowo wejściowe może prowadzić do
wielu różnych obliczeń wykonanych, w szczególności jedno z obliczeń
wielu różnych obliczeń wykonanych, w szczególności jedno z obliczeń
może doprowadzać do zatrzymania maszyny a inne nie.
może doprowadzać do zatrzymania maszyny, a inne nie.


Przykład maszyny niedeterministycznej podamy później, przy okazji
Przykład maszyny niedeterministycznej podamy później, przy okazji
Linia 782: Linia 656:


{{definicja|4.2||
{{definicja|4.2||
Język rozpoznawany przez niedeterministyczną maszynę Turinga  <math>\displaystyle NMT
Język rozpoznawany przez niedeterministyczną maszynę Turinga  <math>NMT
</math>  jest to zbiór
</math>  jest to zbiór


<center><math>\displaystyle L(\mathbf{NMT})=\left\{ w\in \Sigma _{T}^{*}\: :\: \sharp
<center><math>L(\mathbf{NMT})=\left\{ w\in \Sigma _{T}^{*}\ : :\ : \sharp
s_{0}w\sharp \mapsto^{*}\sharp w_{1}s_{F}w_{2}\sharp ,\; dla\:
s_{0}w\sharp \mapsto^{*}\sharp w_{1}s_{F}w_{2}\sharp ,\; dla\ :
pewnych\: w_{1},w_{2}\in \Sigma _{T}^{*},s_{F}\in S_{F}\right\} .</math></center>
pewnych\ : w_{1},w_{2}\in \Sigma _{T}^{*},s_{F}\in S_{F}\right\}</math>.</center>


Język  <math>\displaystyle L\subset \Sigma _{I}^{*} </math>  jest rozpoznawany (akceptowany)
Język  <math>L\subset \Sigma _{I}^{*}</math>  jest rozpoznawany (akceptowany)
przez niedeterministyczną maszynę Turinga, jeśli istnieje  <math>\displaystyle \mathcal{NMT} </math>  taka, że  <math>\displaystyle L(\mathcal{NMT})=L</math>  
przez niedeterministyczną maszynę Turinga, jeśli istnieje  <math>\mathcal{NMT}</math>  taka, że  <math>L(\mathcal{NMT})=L</math>  
}}
}}


Podkreślamy fakt, że aby maszyna niedeterministyczna zaakceptowała
Podkreślamy fakt, że aby maszyna niedeterministyczna zaakceptowała
słowo wejściowe wystarczy aby wśród wszystkich możliwych obliczeń
słowo wejściowe, wystarczy, aby wśród wszystkich możliwych obliczeń
znalazło się co najmniej jedno akceptujące.
znalazło się co najmniej jedno akceptujące.


Wprost z definicji wynika że każda maszyna deterministyczna jest
Wprost z definicji wynika że każda maszyna deterministyczna jest
także maszyną niedeterministyczną, co oznacza że języki rozpoznawane
także maszyną niedeterministyczną, co oznacza, że języki rozpoznawane
przez maszyny deterministyczne są zawarte w klasie języków
przez maszyny deterministyczne są zawarte w klasie języków
rozpoznawanych przez maszyny niedeterministyczne. Przeciwna inkluzja
rozpoznawanych przez maszyny niedeterministyczne. Przeciwna inkluzja
Linia 805: Linia 679:
{{kotwica|prz.1b|}}{{twierdzenie|4.1||
{{kotwica|prz.1b|}}{{twierdzenie|4.1||


Dla każdej niedeterministycznej maszyny Turinga <math>\displaystyle \mathcal{NMT}</math>
Dla każdej niedeterministycznej maszyny Turinga <math>\mathcal{NMT}</math>
istnieje maszyna deterministyczna <math>\displaystyle \mathcal{MT}</math> taka, że
istnieje maszyna deterministyczna <math>\mathcal{MT}</math> taka, że
<center><math>\displaystyle
<center><math>
L(\mathcal{NMT})=L(\mathcal{MT})
L(\mathcal{NMT})=L(\mathcal{MT})</math></center>
</math></center>


}}
}}


{{dowod|||
{{dowod|||
''(Szkic)''. Aby sprawdzić czy maszyna
''(Szkic)''. Aby sprawdzić, czy maszyna
niedeterministyczna akceptuje dane słowo wejściowe należy przejrzeć
niedeterministyczna akceptuje dane słowo wejściowe, należy przejrzeć
wszystkie możliwe obliczenia wykonywane, tworzące drzewo obliczeń.
wszystkie możliwe obliczenia wykonywane, tworzące drzewo obliczeń.
Poziomy drzewa tworzone są przez kroki czasowe, wierzchołki stanowią
Poziomy drzewa tworzone są przez kroki czasowe, wierzchołki stanowią
obliczenia wykonane w danym kroku czasowym a gałęzie zadane są przez
obliczenia wykonane w danym kroku czasowym, a gałęzie zadane są przez
relację bezpośredniego następstwa. W celu sprawdzenia czy maszyna
relację bezpośredniego następstwa. W celu sprawdzenia, czy maszyna
akceptuje dane słowo przeglądamy drzewo obliczeń poziomami (por.
akceptuje dane słowo, przeglądamy drzewo obliczeń poziomami (por.
algorytm BFS) i akceptujemy gdy przeglądana konfiguracja była
algorytm BFS) i akceptujemy, gdy przeglądana konfiguracja była
akceptująca. Tą techniką przeglądamy wszystkie możliwe obliczenia
akceptująca. Tą techniką przeglądamy wszystkie możliwe obliczenia
wykonane w <math>\displaystyle 1,2,3,\dots</math> krokach.
wykonane w <math>1,2,3,\dots</math> krokach.


Do dokonania symulacji najwygodniej jest użyć maszyny <math>\displaystyle 3</math>-głowicowej
Do dokonania symulacji najwygodniej jest użyć maszyny <math>3</math>-głowicowej
z możliwością czytania na wszystkich taśmach. Wprowadzamy te taśmy
z możliwością czytania na wszystkich taśmach. Wprowadzamy te taśmy
kolejno do przechowywania słowa wejściowego, symulacji działania
kolejno do przechowywania słowa wejściowego, symulacji działania
Linia 831: Linia 704:
przejść danego przez funkcję przejść. Symulacja przebiega w
przejść danego przez funkcję przejść. Symulacja przebiega w
czterech krokach:
czterech krokach:
# Rozpocznij ze słowem wejściowym <math>\displaystyle w</math> na taśmie <math>\displaystyle 1</math> oraz pustymi taśmami <math>\displaystyle 2</math> i <math>\displaystyle 3</math>.
# Rozpocznij ze słowem wejściowym <math>w</math> na taśmie <math>1</math> oraz pustymi taśmami <math>2</math> i <math>3</math>.
# Przekopiuj taśmę <math>\displaystyle 1</math> na taśmę <math>\displaystyle 2</math>.
# Przekopiuj taśmę <math>1</math> na taśmę <math>2</math>.
# Użyj taśmy <math>\displaystyle 2</math> do symulacji <math>\displaystyle w</math> wykorzystując taśmę <math>\displaystyle 3</math> do wyboru przejść funkcji przejść <math>\displaystyle f</math>. Jeśli po wykonaniu skończonego zbioru instrukcji według adresowania z taśmy <math>\displaystyle 3</math> otrzymano konfigurację akceptującą to akceptuj. W przeciwnym razie przejdź do następnego punktu.
# Użyj taśmy <math>2</math> do symulacji <math>w</math>, wykorzystując taśmę <math>3</math> do wyboru przejść funkcji przejść <math>f</math>. Jeśli po wykonaniu skończonego zbioru instrukcji według adresowania z taśmy <math>3</math> otrzymano konfigurację akceptującą, to akceptuj. W przeciwnym razie, przejdź do następnego punktu.
# Zamień ciąg adresowy na następny w kolejności leksykograficznej. Jeśli zapisany ciąg jest ostatnim możliwym ciągiem adresowym o długości <math>\displaystyle N</math> zapisz na taśmie <math>\displaystyle 3</math> pierwszy w kolejności leksykograficznej ciąg adresowy o długości <math>\displaystyle N+1</math> oraz przejdź do <math>\displaystyle 2</math>.
# Zamień ciąg adresowy na następny w kolejności leksykograficznej. Jeśli zapisany ciąg jest ostatnim możliwym ciągiem adresowym o długości <math>N</math>, zapisz na taśmie <math>3</math> pierwszy w kolejności leksykograficznej ciąg adresowy o długości <math>N+1</math> oraz przejdź do <math>2</math>.


}}
}}


{{wniosek|4.1||
{{kotwica|wn.4.1|}}{{wniosek|4.1||


Dla każdej maszyny Turinga <math>\displaystyle \mathcal{MT}</math> istnieje maszyna Turinga
Dla każdej maszyny Turinga <math>\mathcal{MT}</math> istnieje maszyna Turinga
<math>\displaystyle \mathcal{MT}'</math> taka że
<math>\mathcal{MT}'</math> taka, że
<center><math>\displaystyle
<center><math>
L(\mathcal{MT})=L(\mathcal{MT}')
L(\mathcal{MT})=L(\mathcal{MT}')
</math></center>
</math></center>


oraz dla każdego <math>\displaystyle w\in L(\mathcal{MT}')</math> maszyna <math>\displaystyle \mathcal{MT}'</math>
oraz dla każdego <math>w\in L(\mathcal{MT}')</math> maszyna <math>\mathcal{MT}'</math>
zatrzymuje się na <math>\displaystyle w</math>.
zatrzymuje się na <math>w</math>.
}}
}}


{{dowod|||
{{dowod|||
Wystarczy przerobić maszynę <math>\displaystyle \mathcal{MT}</math> na maszynę
Wystarczy przerobić maszynę <math>\mathcal{MT}</math> na maszynę
niedeterministyczną <math>\displaystyle \mathcal{NMT}</math> posiadającą dodatkowy stan <math>\displaystyle s_A</math>
niedeterministyczną <math>\mathcal{NMT}</math> posiadającą dodatkowy stan <math>s_A</math>
oraz taką że dla każdego stanu ze zbioru <math>\displaystyle S_F</math> pod wpływem dowolnego
oraz taką, że dla każdego stanu ze zbioru <math>S_F</math> pod wpływem dowolnego
symbolu z <math>\displaystyle \Sigma_T</math> maszyna <math>\displaystyle \mathcal{NMT}</math> posiada dodatkowe
symbolu z <math>\Sigma_T</math> maszyna <math>\mathcal{NMT}</math> posiada dodatkowe
przejście do <math>\displaystyle s_A</math> w którym już pozostaje i nic nie zmienia. Jasno
przejście do <math>s_A</math>, w którym już pozostaje i nic nie zmienia. Stąd widać, że <math>L(\mathcal{MT})=L(\mathcal{NMT})</math>.
widać, że <math>\displaystyle L(\mathcal{MT})=L(\mathcal{NMT})</math>.


Twierdzenie [[#prz.1b|4.1]] pozwala na otrzymanie maszyny
Twierdzenie [[#prz.1b|4.1]] pozwala na otrzymanie maszyny
<math>\displaystyle \mathcal{MT}'</math> akceptującej ten sam język co <math>\displaystyle \mathcal{NMT}</math> z
<math>\mathcal{MT}'</math> akceptującej ten sam język co <math>\mathcal{NMT}</math> z
dodatkowym założeniem, że gdy <math>\displaystyle \mathcal{NMT}</math> osiąga stan <math>\displaystyle s_A</math>
dodatkowym założeniem, że gdy <math>\mathcal{NMT}</math> osiąga stan <math>s_A</math>,
maszyna <math>\displaystyle \mathcal{MT}'</math> się zatrzymuje. Zauważmy że stan <math>\displaystyle s_A</math> można
maszyna <math>\mathcal{MT}'</math> się zatrzymuje. Zauważmy, że stan <math>s_A</math> można
osiągnąć tylko dla słów akceptowanych prze <math>\displaystyle \mathcal{NMT}</math> a z
osiągnąć tylko dla słów akceptowanych prze <math>\mathcal{NMT}</math>, a z drugiej strony, każde słowo akceptowane przez <math>\mathcal{NMT}</math> prowadzi do co najmniej jednego obliczenia kończącego się w <math>s_A</math>.
drugiej strony każde słowo akceptowane przez <math>\displaystyle \mathcal{NMT}</math>
prowadzi do conajmniej jednego obliczenia kończącego się w
<math>\displaystyle s_A</math>.
}}
}}

Aktualna wersja na dzień 21:57, 15 wrz 2023

W tym wykładzie omówimy języki i gramatyki kontekstowe oraz ich własności. Wprowadzimy automat liniowo ograniczony i uzasadnimy równość rodziny języków kontekstowych i rodziny języków rozpoznawanych przez automaty liniowo ograniczone. Zdefiniujemy maszynę Turinga i pokażemy równoważność tego modelu z wybranymi innymi modelami obliczeń.

W tym wykładzie omówimy kolejną rodzinę języków hierarchii Chomsky'ego, a mianowicie języki kontekstowe. Przedstawimy kilka własnosci gramatyk kontekstowych, czyli typu (1) oraz wprowadzimy pojęcie automatu liniowo ograniczonego. Wprowadzimy też najogólniejszy model obliczeń, a mianowicie maszynę Turinga.

Języki kontekstowe

Języki kontekstowe to kolejna rodzina języków w hierarchii Chomsky'ego. Rozszerza ona istotnie rodzinę języków bezkontekstowych. Wykorzystanie tej rodziny języków formalnych jest dość ograniczone. Brak jest bowiem praktycznych metod konstrukcji parserów dla tych gramatyk.

Ta część wykładu prezentuje gramatyki równoważne gramatykom kontekstowym, posiadające pewne określone własności. Te własności wykorzystuje się przy uzasadnieniu faktu, że rodzina języków kontekstowych pokrywa się z rodziną języków rozpoznawanych przez automaty liniowo ograniczone. Biorąc pod uwagę to, że zastosowania tej rodziny języków formalnych nie są powszechne oraz to, że dowody dla przedstawionych poniżej twierdzeń są mocno techniczne, postanowiliśmy zrezygnować z rygorystycznej prezentacji tego materiału i pominąć dowody. Zainteresowany Student może je znaleźć w literaturze wskazanej do tego przedmiotu.

Definicja 1.1

Gramatykę G=(VN,VT,v0,P) nazywamy rozszerzającą, jeśli każde prawo jest postaci xy , gdzie x,y(VNVT)* i spełniona jest nierówność xy lub jest to prawo v01 i wtedy v0 nie występuje po prawej stronie w żadnej produkcji z P .

Wprost z definicji wynika, że gramatyka kontekstowa jest gramatyką rozszerzającą. Prawdziwe jest również następujące twierdzenie.

Twierdzenie 1.1

Dla dowolnej gramatyki G=(VN,VT,v0,P) rozszerzającej istnieje równoważna gramatyka kontekstowa.

Wprowadzimy teraz gramatyki z markerem końca.

Definicja 1.2

Gramatyką z markerem końca nazywamy gramatykę G=(VN{},VT,v0,P) taką, że VNVT oraz prawa są postaci: uv , uv lub uv , gdzie u,v(VNVT)* i w słowie u występuje co najmniej jeden symbol nieterminalny z VN . Językiem generowanym przez tę gramatykę nazywamy zbiór

L(G)={wVT*: :v0*w}

Gramatyka z markerem końca G jest kontekstowa (typu 1 ), jeśli jej prawa po wymazaniu markera spełniają warunki gramatyki rozszerzającej. Oczywiście dla dowolnej gramatyki kontekstowej istnieje równoważna gramatyka kontekstowa z markerem końca. Prawdziwe jest również następujące twierdzenie:

Twierdzenie 1.2

Dla dowolnej gramatyki kontekstowej z markerem końca istnieje równoważna gramatyka kontekstowa.

Dowód

Niech G=(VN{},VT,v0,P) będzie dowolną gramatyką kontekstową z markerem końca. Zakładamy, bez ograniczania ogólności rozważań, że w zbiorze P nie występuje prawo v01 (po wymazaniu markera ). Dla każdego symbolu x ze zbioru V=VNVT określamy trzy symbole x,x, :x oraz oznaczamy odpowiednio przez V,V,V zbiory tych symboli. Dla u=u1...uk takiego, że k1 i uiV dla i=1,,k wprowadzamy także następujące oznaczenia:

u=u1u2...uk , u=u1...uk1uk oraz u=u1u2...uk1uk gdy k>1 .

Przy takich oznaczeniach definiujemy gramatykę

G1=(VNVVV,VT,v0,P1)

w której zbiór praw P1 składa się ze wszystkich praw uzyskanych zgodnie z poniższymi warunkami:

  1. jeśli uwP , to uw, :#u#w, :u#w#, :#u##w#P1
  2. jeśli #u#wP , to  :u#w#, :#u##w#P1
  3. jeśli u#w#P , to u#w#, :#u##w#P1
  4. #xx, :x#x, :#x#xP1

dla wszystkich xV .

Określona w ten sposób gramatyka G1 jest gramatyką rozszerzającą i równoważną wyjściowej. Dla gramatyki G1 istnieje, zgodnie z poprzednim twierdzeniem, równoważna gramatyka kontekstowa, co kończy dowód twierdzenia.

Prawdziwe jest także następujące twierdzenie (porównaj z 1.1).

Twierdzenie 1.3

Dla dowolnej gramatyki kontekstowej (rozszerzającej) istnieje równoważna gramatyka kontekstowa (rozszerzająca) o tej własności, że każde prawo, w którym występuje symbol terminalny, jest postaci va , gdzie vVN, :aVT .

Mówimy, że gramatyka G jest rzędu n>0 , jeśli dla każdego prawa xy tej gramatyki spełniony jest warunek xn i yn . Kolejne twierdzenie stwierdza możliwość dalszego uproszczenia praw gramatyki rozszerzającej.

Twierdzenie 1.4

Dla każdej gramatyki rozszerzającej istnieje równoważna gramatyka rozszerzająca rzędu 2 .

Na koniec wprowadzimy jeszcze jeden rodzaj gramatyk równoważnych gramatykom kontekstowym. Są to mianowicie gramatyki liniowo ograniczone.

Definicja 1.3

Gramatyka G=(VN,VT,v0,P) jest liniowo ograniczona, jeśli każde prawo jest jednej z następujących postaci:

v0v0v, :v1v2z1z2, :vx

gdzie xVNVT, :v,v1,v2,z1,z2VN oraz v0{x,z1,z2,v} .

Twierdzenie 1.5

Dla dowolnej gramatyki kontekstowej G istnieje gramatyka liniowo ograniczona G1 , która jest równoważna G lub też generuje język L(G){1} .

Dowód

W świetle poprzednich twierdzeń możemy przyjąć, że gramatyka kontekstowa G=(VN,VT,v0,P) ma prawa wyłącznie w następujących postaciach:

  1. v01
  2. vx gdzie vVN, :xVNVT
  3. vv1v2 gdzie v,v1,v2VN
  4. v1v2v3v4 gdzie v1,v2,v3,v4VN

Określamy gramatykę G1=(VN{z0,z1},VT,z0,P1) , gdzie z1,z2 są nowymi symbolami nieterminalnymi, a więc nie należą do VN . Natomiast zbiór praw P1 składa się ze wszystkich praw ze zbioru P postaci 2 i 4 oraz z0z0z1, :z0v0, : praw z1vvz1, :vz1z1v dla vVN i praw v1z1v3v4 dla każdego prawa postaci 4 w gramatyce G . Skonstruowana gramatyka jest liniowo ograniczona i spełnia tezę twierdzenia.

Automat liniowo ograniczony

Określimy teraz systemy, zwane automatami liniowo ograniczonymi, który rozpoznają języki kontekstowe.

Definicja 2.1

Automatem liniowo ograniczonym nazywamy system 𝒜LO=(ΣT,S,P,s0,SF) , w którym ΣT jest skończonym alfabetem, S skończonym zbiorem stanów, SΣT= oraz wyróżniony jest podzbiór ΣIΣT . Zbiór ΣT zwany jest alfabetem taśmy, a ΣI - alfabetem wejściowym. Wyróżnione są także: element #ΣTΣI zwany markerem końca, stan początkowy s0S oraz SFS - zbiór stanów końcowych. Natomiast relacja przejść P(S×ΣT)×(S×ΣT×{1,0,1}) spełnia następujące warunki:

  1. jeśli (s1,#)P(s2,a,k) , to a=#
  2. jeśli (s1,a)P(s2,#,k) , to a=#

Fakt, że (s1,a)P(s2,b,k) , zapisujemy zazwyczaj jako (s1,a)(s2,b,k) . Do opisu działania automatu liniowo ograniczonego wygodnie jest wprowadzić pojęcie konfiguracji (podobnie jak dla automatów ze stosem).

Konfiguracją automatu liniowo ograniczonego jest słowo vsw(ΣTS)* , w którym sS,v,wΣT* . Pomiędzy dwoma konfiguracjami d1,d2 zachodzi relacja bezpośredniego następstwa d1d2 wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie s1,s2S , a,b,cΣT oraz v,wΣT*:

  1. d1=vs1aw , d2=vs2bw oraz (s1,a)P(s2,b,0)
  2. d1=vs1aw , d2=vbs2w oraz (s1,a)P(s2,b,1)
  3. d1=vcs1aw , d2=vs2cbw oraz (s1,a)P(s2,b,1)

Przechodnie domknięcie relacji oznaczać będziemy symbolem * i określać mianem obliczenia wykonanego przez automat liniowo ograniczony.

Język rozpoznawany przez automat liniowo ograniczony 𝒜LO to zbiór słów nad alfabetem ΣI , pod działaniem których automat wykonuje obliczenie prowadzące do stanu końcowego, czyli

L(𝒜LO)={wΣI* :: :s0#w#*vs,vΣT*,sSF}.

Język LΣI* jest rozpoznawany (akceptowany) przez automat liniowo ograniczony, jeśli istnieje automat 𝒜LO taki, że (𝒜LO)=L

<flash>file=Wyklad12_rysunek1.swf|width=200|height=200</flash> <div.thumbcaption>Rysunek 1


Opiszemy teraz możliwe ruchy automatu liniowo ograniczonego. Automat ten może czytać słowo wejściowe w dwóch kierunkach. Jego głowica może poruszać się w lewo lub w prawo. Automat może wymieniać czytaną literę na inną, ale nie rozszerza miejsca zajętego na taśmie przez czytane słowo. Działa niedeterministycznie. Czytając literę a, będąc w stanie s, automat ma kilka możliwości działania. Może mianowicie:

  1. zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 1. Głowica czytająca automatu pozostaje w poprzedniej pozycji,
  2. zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 2. Głowica czytająca automatu przesuwa się w prawo,
  3. zamienić literę na inną literę i/lub zmienić stan na inny - zgodnie z warunkiem 3. Głowica czytająca automatu przesuwa się w lewo.

Związek pomiędzy rodziną języków kontekstowych a wprowadzoną rodziną automatów liniowo ograniczonych ustalają poniższe twierdzenia.

Twierdzenie 2.1

Dla dowolnego języka kontekstowego L istnieje automat liniowo ograniczony 𝒜LO taki, że (𝒜LO)=L .

Dowód

Można założyć, bez ograniczenia ogólności naszych rozważań, że gramatyka G=(VN,VT,v0,P) generująca język L ma prawa wyłącznie następujących postaci:

  1. (G) vx , gdzie vVN,xVNVT,xv0
  2. (G) v0v0v1 , gdzie v1VN,v1v0
  3. (G) v1v2v3v4 , gdzie v1,,v4VN,v3,v4v0
  4. (G) v01 jeśli 1L .

Określamy automat liniowo ograniczony 𝒜LO=(ΣT,S,P,s0,SF) , przyjmując ΣT=VNVT{#,} , S={s0,s1,s2,s3,s4}{sv1:v1v2v3v4P} , ΣI=VNVT , SF={s3} , s0 - stan początkowy. Relacja przejść automatu 𝒜LO zdefiniowana jest poniżej:

  1. (A) (s0,#)(s0,#,1)
  2. (A) (s0,#)(s4,#,1) jeśli 1L
  3. (A) (s0,x)(s0,x,1) , (s0,x)(s0,x,1) dla każdego xVNVT
  4. (A) (s0,x)(s0,v,0) jeśli vxP i xv0
  5. (A) (s0,v3)(sv1,v1,1),(sv1,v4)(s0,v2,0) jeśli v1v2v3v4P
  6. (A) (s0,v0)(s1,v0,1)
  7. (A) (s1,#)(s2,#,1)
  8. (A) (s1,)(s2,,1)
  9. (A) (s2,v0)(s3,,1)
  10. (A) (s3,v1)(s0,v0,0) , gdy v0v0v1P
  11. (A) (s3,#)s3,#,1),(s4,#)(s3,#,1)

Określony automat 𝒜LO rozpoznaje tylko te słowa, które są generowane przez gramatykę G , symulując wstecz każde wyprowadzenie gramatyki G .

Prawdziwe jest również następujące twierdzenie.

Twierdzenie 2.2

Dla dowolnego języka L rozpoznawanego przez automat liniowo ograniczony 𝒜LO istnieje gramatyka kontekstowa G taka, że L(G)=L .

W dowodzie konstruuje się odpowiednią gramatykę.Zasada tej konstrukcji jest następująca. Z symbolu startowego gramatyka generuje dowolne słowa, ustawiając zawsze na prawym końcu symbol nieterminalny związany z przejściem automatu do stanu końcowego. Następnie korzysta się z możliwości zamiany takiego symbolu nieterminalnego na inne. W ten sposób gramatyka symuluje wstecz działanie automatu, wprowadzając symbole nieterminalne odpowiadające stanom automatu. Dojście do stanu początkowego automatu w tej symulacji jest równoznaczne z usunięciem ostatniego symbolu nieterminalnego i wygenerowaniem słowa dokładnie tego samego, które rozpoznaje automat.

Udowownimy teraz zamkniętość rodziny języków kontekstowych ze względu na iloczyn mnogościowy.

Twierdzenie 2.3

Dla dowolnych języków kontekstowych L1,L2A* iloczyn mnogościowy tych języków L1L2 jest językiem kontekstowym.

Dowód

(szkic) Załóżmy, że języki L1,L2 są rozpoznawane przez automaty liniowo ograniczone, 𝒜LO1 i 𝒜LO2 . Opiszemy konstrukcję automatu liniowo ograniczonego 𝒜LO , który rozpoznawać będzie wyłącznie słowa akceptowane równocześnie przez oba automaty. Działanie tego automatu jest następujące. Każde słowo będzie czytane trzy razy. Przy pierwszym czytaniu automat 𝒜LO dubluje litery, to znaczy w miejsce litery a wprowadza parę (a,a) . Po zakończeniu tej procedury automat wraca do skrajnej lewej pozycji i rozpoczyna symulację automatu 𝒜LO1 . Jeśli ta symulacja doprowadzi do zaakceptowania czytanego słowa przez automat 𝒜LO1 , to automat 𝒜LO rozpoczyna obliczenie od początku, symulując teraz pracę automatu 𝒜LO2 . Jeśli i ta symulacja zakończy się zaakceptowaniem czytanego słowa, to automat przechodzi do ustalonego stanu końcowego, a to oznacza akceptację tego słowa. Działając w opisany sposób, automat 𝒜LO rozpoznaje język L1L2 , a to w świetle udowodnionego powyżej twierdzenia oznacza, że przecięcie języków kontekstowych L1L2 jest językiem kontekstowym.

Ponieważ dalsze własności domkniętości rodziny języków kontekstowych pokrywają się z własnościami języków typu (0), więc omówimy te własności wspólnie, co będzie mieć miejsce w następnym wykładzie.

Maszyna Turinga

Alan Turing (1912-1954)
Zobacz biografię

Przejdziemy teraz do prezentacji ogólnego modelu maszyny liczącej, który został wprowadzony w 1936 roku przez Alana M. Turinga. Na cześć swego autora został on nazwany (jednotaśmową) maszyną Turinga. Model ten jest podobny w swojej idei do rozważanych wcześniej automatów liniowo ograniczonych, przy czym jednym z podstawowych założeń (i różnic względem automatów) jest nieskończony dostęp do pamięci. Maszyna Turinga może wydawać się na początku pojęciem bardzo abstrakcyjnym. Jednak, jak później zobaczymy, stanowi ona jedną z podstawowych koncepcji współczesnej informatyki. Pozwala na formalne zdefiniowanie pojęcia algorytmu oraz jego złożoności obliczeniowej. Jako model obliczeń pozwala odpowiedzieć także na bardzo ważne pytanie: czy każdy problem można rozwiązać algorytmicznie?

Jednotaśmowa maszyna Turinga jest podobna w swej idei do automatu liniowo ograniczonego, pominięte jednak zostaje, jak wspomnieliśmy, ograniczenie dostępu do pamięci. Omawiana maszyna jest abstrakcyjnym tworem w skład którego wchodzą:

  • dwustronnie nieskończona taśma zbudowana z komórek zawierających symbole z pewnego zadanego alfabetu,
  • głowica, która może czytać i zapisywać symbole w komórkach taśmy oraz poruszać się w prawo lub lewo o jedną komórkę lub pozostawać na tej samej pozycji podczas jednego kroku czasowego,
  • działający sekwencyjnie mechanizm odpowiedzialny za sterowanie maszyną; mechanizm ten na podstawie symbolu odczytanego z komórki pod głowicą oraz stanu, w którym aktualnie znajduje się maszyna, dokonuje zapisu symbolu w tejże komórce, przechodzi do kolejnego stanu i przesuwa głowicę w prawo, lewo lub też nie zmienia pozycji głowicy.

Podamy teraz formalną definicję maszyny Turinga. Aby zachować analogię do poprzednich wykładów, zdefiniujemy maszynę w języku konfiguracji.

Definicja 3.1

(Jednotaśmowa deterministyczna) maszyna Turinga jest to system 𝐌𝐓=(ΣT,S,f,s0,SF) , w którym ΣT jest skończonym alfabetem, S skończonym zbiorem stanów, SΣT= oraz wyróżniony jest podzbiór ΣIΣT . Zbiór ΣT zwany jest alfabetem taśmy, a ΣI - alfabetem wejściowym. Wyróżnione są także: element #ΣTΣI zwany markerem końca, stan początkowy s0S oraz SFS - zbiór stanów końcowych. Natomiast funkcja przejść jest funkcją częściową f: :(S×ΣT)(S×ΣT×{1,0,1} .

Konfiguracją maszyny Turinga jest słowo vsw(ΣTS)* , w którym sS,v,wΣT* . Pomiędzy dwiema konfiguracjami d1,d2 zachodzi relacja bezpośredniego następstwa d1d2 wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie s1,s2S , a,b,cΣT oraz v,wΣT*:

  1. d1=vs1aw , d2=vs2bw oraz f(s1,a)=(s2,b,0)
  2. d1=vs1aw , d2=vbs2w oraz f(s1,a)=(s2,b,1) i w1
  3. d1=vs1# , d2=vbs2# oraz f(s1,#)=(s2,b,1)
  4. d1=vcs1aw , d2=vs2cbw oraz f(s1,a)=(s2,b,1)
  5. d1=s1#w , d2=s2#bw oraz f(s1,#)=(s2,b,1)

Przechodnie domknięcie relacji oznaczać będziemy symbolem * i określać mianem obliczenia wykonanego przez maszynę Turinga. Konfiguracja d1(ΣTS)* jest końcowa, jeśli stąd, że d1d2 , wynika d2=d1 Mówimy, że maszyna Turinga zatrzymuje się w d1 wtedy i tylko wtedy, gdy d1 jest konfiguracją końcową.

Zauważmy, że wprowadzenie markera końca jest zabiegiem czysto formalnym. Pozwala on z jednej strony na oznaczenie słowa wejściowego, a z drugiej strony wskazuje na elementy taśmy, które były zmieniane (czy to przez wprowadzenie słowa wejściowego, czy też poprzez ruch głowicy).

Definicja 3.2

Język rozpoznawany przez maszynę Turinga MT jest to zbiór

L(𝐌𝐓)={wΣT* :: :s0w*w1sFw2,dla :pewnych :w1,w2ΣT*,sFSF}.

Język LΣI* jest rozpoznawany (akceptowany) przez maszynę Turinga, jeśli istnieje MT taka, że L(𝒯)=L Klasę języków rozpoznawanych przez maszynę Turinga oznaczamy (MT) .

We wprowadzonym przez nas ujęciu formalnym, działanie maszyny Turinga należy wyobrażać sobie następująco. W pierwszym etapie na taśmę zostają zapisane symbole słowa wejściowego (z alfabetu ΣI), a następnie komórki przyległe zostają oznaczone symbolami . Jednocześnie maszyna jest sprowadzana do stanu s0, a głowica zostaje ustawiona nad pierwszym symbolem słowa wejściowego. W tym momencie rozpoczyna się sekwencyjne przetwarzanie zawartości taśmy przez maszynę. Jeśli maszyna "zatrzyma się", tzn. w dwóch kolejnych chwilach czasowych nie wykona ruchu i jednocześnie nie zmieni stanu i symbolu taśmy, sprawdzany jest jej aktualny stan. Jeśli stan był akceptujący (czyli należał do zbioru SF), to maszyna zaakceptowała słowo, w przeciwnym razie - słowo odrzuciła (gdyż nie może już osiągnąć stanu ze zbioru SF). Należy zwrócić uwagę na to, że dla niektórych konfiguracji początkowych maszyna może nigdy się nie zatrzymać, a mimo to słowo zostanie przez nią zaakceptowane. To samo tyczy się odrzucania słów, jednak w tej sytuacji dowód, że słowo nie zostanie zaakceptowane, może być problematyczny. Zaprezentowane podejście ma na celu uproszczenie i tak już dość technicznych dowodów twierdzeń pojawiających się w tym wykładzie. Związki pomiędzy akceptowaniem a zatrzymywaniem maszyny Turinga zostaną skomentowane później (zob. Wniosek 4.1). W pierwszej kolejności przedstawiamy dwa przykłady:

Przykład 3.1

Skonstruujemy maszynę Turinga MT1, która rozpoznaje język postaci L={02n:n0}. Zamierzone działanie maszyny MT1 można opisać następująco:

  1. Przejdź od lewego markera do prawego, zaznaczając symbolem co drugie 0.
  2. Jeśli było tylko jedno 0, to akceptuj.
  3. Jeśli w kroku 1. obszar pomiędzy markerami zawierał nieparzystą ilość 0, to odrzuć.
  4. Powróć do lewego markera.
  5. Powtórz działanie od 1.

Zwróćmy uwagę, że o ile jasne jest, w jaki sposób maszyna ma akceptować słowa wejściowe, odrzucanie tych słów nie zostało zdefiniowane. Aby ominąć ten problem, wprowadzimy jeden dodatkowy stan (nie należący do stanów końcowych), po osiągnięciu którego maszyna się zatrzymuje (tzn. nie wykonuje ruchów i przepisuje na taśmie wciąż ten sam symbol).

Określamy kolejno elementy składowe maszyny MT1:

ΣI={0},ΣT={0,,,},
S={s0,s1,s2,s3,s4,sA,sR},SF={sA}

Pozostaje jeszcze zdefiniować funkcję przejść:

(s0,)(sR,,0)(s1,)(s1,,1)(s0,0)(s1,,1)(s1,0)(s2,,1)(s1,)(sA,,0)(s2,)(s2,,1)(s3,0)(s2,,1)(s2,)(s4,,1)(s3,)(s3,,1)(s2,0)(s3,0,1)(s3,)(sR,,0)(s4,0)(s4,0,1)(s4,)(s4,,1)(s4,)(s2,,1)(sA,)(sA,,0)(sR,)(sR,,0)

W miejsce tabeli wygodniej jest zobrazować funkcję przejść maszyny Turinga na etykietowanym grafie skierowanym. Zostało to zrobione na poniższym rysunku:

Plik:File=ja-lekcja12-w-rys1.mp4
Rysunek 2

Łatwo zauważyć, że wprowadzona funkcja przejścia określa maszynę spełniającą postawione przez nas warunki. Symbol został wprowadzony dla odróżnienia wystąpienia pojedynczego zera od sytuacji, gdy liczba zer jest nieparzysta i większa od 1.

Aby lepiej zrozumieć działanie maszyny MT1, zasymulujemy jej działanie na dwóch słowach wejściowych, przy czym pierwsze z nich będzie należało do języka L, a drugie nie:

s00000s1000s2000s300s20s4s40s40s40s10s10s2s2s4s4s4s4s1s1s1s1sA

Wykazaliśmy więc, że s00000*sA. Zatem 04L(MT1).

Animacja 1

Dla porównania:

s0000s100s200s30sR

Czyli zgodnie z naszym założeniem 03∉L(MT1).

Animacja 2

Przykład 3.2

Przedstawimy maszynę Turinga MT2 akceptującą język

L={ww :: :w{0,1}*},

gdzie w oznacza lustrzane odbicie słowa w. Elementy języka L nazywamy palindromami. Definiujemy alfabet maszyny:

ΣI={0,1},ΣT={0,1,},

oraz zbiory stanów

S={s0,r0,r0,q0,r1,r1,q1,l,sA,sR},SF={sA}

Funkcję przejść maszyny MT2 określa tabela:

(s0,)(sA,,0)(s0,0)(r0,,1)(s0,1)(r1,,1)(r0,)(sR,,0)(r0,0)(r0,0,1)(r0,1)(r0,1,1)(r0,)(q0,,1)(r0,0)(r0,0,1)(r0,1)(r0,1,1)(q0,0)(l,,1)(q0,1)(sR,,1)(r1,)(sR,,0)(r1,0)(r1,0,1)(r1,1)(r1,1,1)(r1,)(q1,,1)(r1,0)(r1,0,1)(r1,1)(r1,1,1)(q1,0)(sR,,0)(q1,1)(l,,1)(l,)(s0,,1)(l,0)(l,0,1)(l,1)(l,1,1)(sR,)(sR,,0)(sA,)(sA,,0)

co dla przejrzystości zobrazowano na Rysunku 3.

Plik:File=ja-lekcja12-w-rys3.mp4
Rysunek 3

Inne możliwe definicje maszyn Turinga

Istnieje kilka możliwych definicji maszyny Turinga, które jak się okazuje są równoważne pod względem możliwości obliczeniowych (tzn. rozpoznają dokładnie tę samą klasę języków). Naszkicujemy kilka wybranych podejść.

Maszyna wielotaśmowa

W tym modelu zakłada się, że głowica ma do dyspozycji nie tylko jedną, ale wiele taśm, na których może zapisywać i odczytywać symbole. Zakłada się przy tym, że słowo wejściowe znajduje się na pierwszej taśmie. Aby symulować maszynę wielotaśmową na jednej taśmie, należy zamienić alfabet taśmy na alfabet (ΣT)k, gdzie k oznacza ilość taśm. W tym momencie zapis na taśmie i-tej jest realizowany przez zmianę odpowiedniej współrzędnej litery z nowego alfabetu (zob. Rys. 4.a). Czyli w opisywanym przypadku funkcja przejść będzie operowała na następujących zbiorach:

f: :(S×ΣTk)(S×ΣTk×{1,0,1})

Taśma jednostronnie nieskończona

Model ten zakłada, że taśma jest ograniczona z jednej ze stron. Różnica w porównaniu z rozważaną przez nas maszyną Turinga polega na tym, że nie jest dozwolone przesuwanie lewego markera (tzn. funkcja przejść nie może zawierać przejść typu punkt 5 definicji 3.1. W tej sytuacji, aby symulować maszynę z taśmą obustronnie nieskończoną na maszynie z taśmą ograniczoną z jednej strony, wystarczy zasymulować taśmę obustronnie nieskończoną poprzez rozszerzenie alfabetu (zob. Rys. 4.b).

Plik:File=ja-lekcja12-w-rys4.mp4
Rysunek 4

Wielogłowicowa maszyna wielotaśmowa

W tym podejściu zakłada się dodatkowo, że każda z taśm posiada swoją głowicę. Inaczej mówiąc, mamy do czynienia z iloczynem kartezjańskim k niezależnych maszyn jednotaśmowych. Akceptowany język jest w tym momencie k-wymiarowy. Oczywiście, słowo postaci (w,1,,1)(ΣT*)k można w naturalny sposób utożsamiać z wΣT. Z drugiej strony maszynę wielogłowicową można symulować na jednotaśmowej w następujący sposób:

  1. Jako zbiór stanów bierzemy Sk.
  2. Słowa startowe w1,,wk zapisujemy jako konfigurację początkową maszyny jednotaśmowej w postaci:
    (s0)k$1˙w1$2˙w2$$k˙wk$
    Symbole $ mają za zadanie wirtualnego rozdzielenia taśm. Symbole i˙ wskazują na położenie i-tej głowicy na taśmie.
  3. W trakcie symulacji przechodzimy pomiędzy markerami i wykonujemy przejścia dla kolejnych głowic.

Widać już, że formalne podanie funkcji przejść jest w omawianym przypadku bardzo techniczne. Musimy zapewnić możliwość poszerzania obszaru zapisu na poszczególnych taśmach, co jest realizowane poprzez dopisanie nowego symbolu i przepisywanie przyległych symboli, aż do markera włącznie. Następnie należy wrócić do poprzedniego miejsca zapisu i symulować działanie kolejnych głowic. Wymaga to wprowadzenia sporej liczby stanów pomocniczych. Nie będziemy zagłębiać się w te techniczne szczegóły. Mamy nadzieję że sama idea konstrukcji jest w tym momencie zrozumiała.

Najbardziej ogólna definicja maszyny tego typu dopuszcza dodatkowo, aby głowice mogły przeglądać pozostałe taśmy, dzięki czemu zapewnia się komunikację między głowicami. Symulacja takiej maszyny na jednej taśmie jest podobna w swej idei do metody przedstawionej wcześniej.

Maszyna niedeterministyczna

Ten typ maszyn ma ogromne znaczenie dla teorii złożoności. Z tego powodu przyglądniemy mu się dokładniej. Różnica pomiędzy niedeterministyczną maszyną Turinga a maszyną deterministyczną polega na tym, że funkcja przejść może pozwalać na kilka różnych przejść na skutek tego samego symbolu czytanego (gdyż funkcja przejść w tym przypadku będzie multi-funkcją).

Definicja 4.1

(Jednotaśmowa) niedeterministyczna maszyna Turinga jest to system 𝐍𝐌𝐓=(ΣT,S,f,s0,SF), w którym ΣT jest skończonym alfabetem, S skończonym zbiorem stanów, SΣT= oraz wyróżniony jest podzbiór ΣIΣT . Podobnie jak poprzednio zbiór ΣT zwany jest alfabetem taśmy, a ΣI - alfabetem wejściowym. Wyróżnione są także: element #ΣTΣI zwany markerem końca, stan początkowy s0S oraz SFS - zbiór stanów końcowych. Natomiast funkcja przejść jest funkcją częściową f: :(S×ΣT)𝒫(S×ΣT×{1,0,1}) gdzie 𝒫(A) oznacza zbiór podzbiorów zbioru A.

Konfiguracją maszyny Turinga jest słowo vsw(ΣTS)* , w którym sS,v,wΣT* , przy czym pomiędzy dwiema konfiguracjami d1,d2 zachodzi relacja bezpośredniego następstwa d1d2 wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie s1,s2S , a,b,cΣT oraz v,wΣT*:

  1. d1=vs1aw , d2=vs2bw oraz f(s1,a)(s2,b,0)
  2. d1=vs1aw , d2=vbs2w oraz f(s1,a)(s2,b,1) i w1
  3. d1=vs1# , d2=vbs2# oraz f(s1,#)(s2,b,1)
  4. d1=vcs1aw , d2=vs2cbw oraz f(s1,a)(s2,b,1)
  5. d1=s1#w , d2=s2#bw oraz f(s1,#)(s2,b,1)

Tak jak poprzednio, przechodnie domknięcie relacji oznaczać będziemy symbolem * i określać mianem obliczenia wykonanego przez maszynę Turinga. Konfiguracja d1(ΣTS)* jest końcowa, jeśli stąd, że d1d2 , wynika d2=d1

Pomimo tego, że postawiona definicja maszyny niedeterministycznej jest bardzo podobna do maszyny deterministycznej, występuje tutaj jedna bardzo istotna różnica. Słowo wejściowe może prowadzić do wielu różnych obliczeń wykonanych, w szczególności jedno z obliczeń może doprowadzać do zatrzymania maszyny, a inne nie.

Przykład maszyny niedeterministycznej podamy później, przy okazji omawiania klas złożoności obliczeniowej.

Definicja 4.2

Język rozpoznawany przez niedeterministyczną maszynę Turinga NMT jest to zbiór

L(𝐍𝐌𝐓)={wΣT* :: :s0w*w1sFw2,dla :pewnych :w1,w2ΣT*,sFSF}.

Język LΣI* jest rozpoznawany (akceptowany) przez niedeterministyczną maszynę Turinga, jeśli istnieje 𝒩𝒯 taka, że L(𝒩𝒯)=L

Podkreślamy fakt, że aby maszyna niedeterministyczna zaakceptowała słowo wejściowe, wystarczy, aby wśród wszystkich możliwych obliczeń znalazło się co najmniej jedno akceptujące.

Wprost z definicji wynika że każda maszyna deterministyczna jest także maszyną niedeterministyczną, co oznacza, że języki rozpoznawane przez maszyny deterministyczne są zawarte w klasie języków rozpoznawanych przez maszyny niedeterministyczne. Przeciwna inkluzja jest gwarantowana przez następujące twierdzenie.

Twierdzenie 4.1

Dla każdej niedeterministycznej maszyny Turinga 𝒩𝒯 istnieje maszyna deterministyczna 𝒯 taka, że

L(𝒩𝒯)=L(𝒯)

Dowód

(Szkic). Aby sprawdzić, czy maszyna niedeterministyczna akceptuje dane słowo wejściowe, należy przejrzeć wszystkie możliwe obliczenia wykonywane, tworzące drzewo obliczeń. Poziomy drzewa tworzone są przez kroki czasowe, wierzchołki stanowią obliczenia wykonane w danym kroku czasowym, a gałęzie zadane są przez relację bezpośredniego następstwa. W celu sprawdzenia, czy maszyna akceptuje dane słowo, przeglądamy drzewo obliczeń poziomami (por. algorytm BFS) i akceptujemy, gdy przeglądana konfiguracja była akceptująca. Tą techniką przeglądamy wszystkie możliwe obliczenia wykonane w 1,2,3, krokach.

Do dokonania symulacji najwygodniej jest użyć maszyny 3-głowicowej z możliwością czytania na wszystkich taśmach. Wprowadzamy te taśmy kolejno do przechowywania słowa wejściowego, symulacji działania maszyny niedeterministycznej i adresowania wyboru przejść ze zbioru przejść danego przez funkcję przejść. Symulacja przebiega w czterech krokach:

  1. Rozpocznij ze słowem wejściowym w na taśmie 1 oraz pustymi taśmami 2 i 3.
  2. Przekopiuj taśmę 1 na taśmę 2.
  3. Użyj taśmy 2 do symulacji w, wykorzystując taśmę 3 do wyboru przejść funkcji przejść f. Jeśli po wykonaniu skończonego zbioru instrukcji według adresowania z taśmy 3 otrzymano konfigurację akceptującą, to akceptuj. W przeciwnym razie, przejdź do następnego punktu.
  4. Zamień ciąg adresowy na następny w kolejności leksykograficznej. Jeśli zapisany ciąg jest ostatnim możliwym ciągiem adresowym o długości N, zapisz na taśmie 3 pierwszy w kolejności leksykograficznej ciąg adresowy o długości N+1 oraz przejdź do 2.

Wniosek 4.1

Dla każdej maszyny Turinga 𝒯 istnieje maszyna Turinga 𝒯 taka, że

L(𝒯)=L(𝒯)

oraz dla każdego wL(𝒯) maszyna 𝒯 zatrzymuje się na w.

Dowód

Wystarczy przerobić maszynę 𝒯 na maszynę niedeterministyczną 𝒩𝒯 posiadającą dodatkowy stan sA oraz taką, że dla każdego stanu ze zbioru SF pod wpływem dowolnego symbolu z ΣT maszyna 𝒩𝒯 posiada dodatkowe przejście do sA, w którym już pozostaje i nic nie zmienia. Stąd widać, że L(𝒯)=L(𝒩𝒯).

Twierdzenie 4.1 pozwala na otrzymanie maszyny 𝒯 akceptującej ten sam język co 𝒩𝒯 z dodatkowym założeniem, że gdy 𝒩𝒯 osiąga stan sA, maszyna 𝒯 się zatrzymuje. Zauważmy, że stan sA można osiągnąć tylko dla słów akceptowanych prze 𝒩𝒯, a z drugiej strony, każde słowo akceptowane przez 𝒩𝒯 prowadzi do co najmniej jednego obliczenia kończącego się w sA.