Języki, automaty i obliczenia/Wykład 12: Języki kontekstowe i automat liniowo ograniczony. Maszyna Turinga: Różnice pomiędzy wersjami
m Zastępowanie tekstu – „,...,” na „,\ldots,” |
|||
(Nie pokazano 16 wersji utworzonych przez 3 użytkowników) | |||
Linia 23: | Linia 23: | ||
{{definicja|1.1|| | {{definicja|1.1|| | ||
Gramatykę <math> | Gramatykę <math>G=(V_{N},V_{T},v_{0},P)</math> nazywamy rozszerzającą, | ||
jeśli każde prawo jest postaci <math> | 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> | 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> | i wtedy <math>v_{0}</math> nie występuje po prawej stronie w żadnej produkcji z <math>P</math> . | ||
}} | }} | ||
Linia 35: | Linia 35: | ||
{{kotwica|prz.1|}}{{twierdzenie|1.1|| | {{kotwica|prz.1|}}{{twierdzenie|1.1|| | ||
Dla dowolnej gramatyki <math> | 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 43: | Linia 43: | ||
{{definicja|1.2|| | {{definicja|1.2|| | ||
Gramatyką z markerem końca <math> | Gramatyką z markerem końca <math>\sharp</math> nazywamy | ||
gramatykę <math> | gramatykę <math>G_{\sharp }=(V_{N}\cup \{\sharp \},V_{T},v_{0},P)</math> taką, że | ||
<math> | <math>\sharp \notin V_{N}\cup V_{T}</math> oraz prawa są postaci: <math>u\rightarrow v</math> | ||
, <math> | , <math>\sharp u\rightarrow \sharp v</math> lub <math>u\sharp \rightarrow v\sharp</math> , | ||
gdzie <math> | 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> | 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> | <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> | 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> | 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 70: | Linia 70: | ||
{{dowod||| | {{dowod||| | ||
Niech <math> | 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 zbiorze <math> | rozważań, że w zbiorze <math>P</math> nie występuje prawo <math>v_{0}\rightarrow 1</math> | ||
(po wymazaniu markera <math> | (po wymazaniu markera <math>\sharp</math> ). Dla każdego symbolu <math>x</math> ze zbioru | ||
<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> | oraz oznaczamy odpowiednio przez <math>\, ^{\sharp }V,V^{\sharp },^{\sharp }V^{\sharp }</math> | ||
zbiory tych symboli. Dla <math> | zbiory tych symboli. Dla <math>u=u_{1}...u_{k}</math> | ||
takiego, że <math> | 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> | <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> | oraz <math>\, ^{\sharp }u^{\sharp }=\, ^{\sharp }u_{1}u_{2}...u_{k-1}u_{k}^{\sharp }</math> | ||
gdy <math> | gdy <math>k>1</math> . | ||
Przy takich oznaczeniach definiujemy gramatykę | Przy takich oznaczeniach definiujemy gramatykę | ||
<center><math> | <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> | 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> | # 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> | # jeśli <math>\, ^{\#}u\rightarrow \, ^{\#}w\in P</math> , to <math>\ : u^{\#}\rightarrow w^{\#},\ : ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}</math> | ||
# jeśli <math> | # jeśli <math>u^{\#}\rightarrow w^{\#}\in P</math> , to <math>u^{\#}\rightarrow w^{\#},\ : ^{\#}u^{\#}\rightarrow \, ^{\#}w^{\#}\in P_{1}</math> | ||
# <math> | # <math>\, ^{\#}x\rightarrow x,\ : x^{\#}\rightarrow x,\ : ^{\#}x^{\#}\rightarrow x\in P_{1}</math> | ||
dla wszystkich <math> | dla wszystkich <math>x\in V</math> . | ||
Określona w ten sposób gramatyka <math> | 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> | 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. | ||
Linia 107: | Linia 107: | ||
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> | 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> | Mówimy, że gramatyka <math>G</math> jest rzędu <math>n>0</math> , jeśli dla każdego | ||
prawa <math> | prawa <math>x\rightarrow y</math> tej gramatyki spełniony jest warunek <math>\mid x\mid \leqslant n</math> | ||
i <math> | 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> | rzędu <math>2</math> . | ||
}} | }} | ||
Linia 126: | Linia 126: | ||
{{definicja|1.3|| | {{definicja|1.3|| | ||
Gramatyka <math> | 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> | <center><math>v_{0}\rightarrow v_{0}v,\ : v_{1}v_{2}\rightarrow z_{1}z_{2},\ : v\rightarrow x</math></center> | ||
gdzie <math> | gdzie <math>x\in V_{N}\cup V_{T},\ : v,v_{1},v_{2},z_{1},z_{2}\in V_{N}</math> oraz | ||
<math> | <math>v_{0}\notin \{x,z_{1},z_{2},v\}</math> . | ||
}} | }} | ||
{{twierdzenie|1.5|| | {{twierdzenie|1.5|| | ||
Dla dowolnej gramatyki kontekstowej <math> | Dla dowolnej gramatyki kontekstowej <math>G</math> istnieje gramatyka liniowo ograniczona | ||
<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> | 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> | # <math>v_{0}\rightarrow 1</math> | ||
# <math> | # <math>v\rightarrow x</math> gdzie <math>v\in V_{N},\ : x\in V_{N}\cup V_{T}</math> | ||
# <math> | # <math>v\rightarrow v_{1}v_{2}</math> gdzie <math>v,v_{1},v_{2}\in V_{N}</math> | ||
# <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> | Określamy gramatykę <math>G_{1}=(V_{N}\cup \{z_{0},z_{1}\},V_{T},z_{0},P_{1})</math> , | ||
gdzie <math> | gdzie <math>z_{1},z_{2}</math> są nowymi symbolami nieterminalnymi, a więc nie należą | ||
do <math> | do <math>V_{N}</math> . Natomiast zbiór praw <math>P_{1}</math> składa się ze wszystkich | ||
praw ze zbioru <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> | 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> | i praw <math>v_{1}z_{1}\rightarrow v_{3}v_{4}</math> dla każdego prawa postaci 4 | ||
w gramatyce <math> | w gramatyce <math>G</math> . Skonstruowana gramatyka jest liniowo ograniczona i spełnia tezę | ||
twierdzenia. | twierdzenia. | ||
Linia 168: | Linia 168: | ||
{{definicja|2.1|| | {{definicja|2.1|| | ||
'''Automatem liniowo ograniczonym ''' nazywamy | '''Automatem liniowo ograniczonym ''' nazywamy | ||
system <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> | 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> | oraz wyróżniony jest podzbiór <math>\Sigma _{I}\subset \Sigma _{T}</math> . Zbiór <math>\Sigma _{T}</math> | ||
zwany jest alfabetem taśmy, a <math> | zwany jest alfabetem taśmy, a <math>\Sigma _{I}</math> - alfabetem wejściowym. | ||
Wyróżnione są także: element <math> | Wyróżnione są także: element <math>\#\in \Sigma _{T}\setminus \Sigma _{I}</math> zwany | ||
markerem końca, stan początkowy <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ńcowych. Natomiast relacja przejść <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> | # jeśli <math>(s_{1},\#)P(s_{2},a,k)</math> , to <math>a=\#</math> | ||
# jeśli <math> | # jeśli <math>(s_{1},a)P(s_{2},\#,k)</math> , to <math>a=\#</math> | ||
Fakt, że <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> | słowo <math>vsw\in (\Sigma _{T}\cup S)^{*}</math> , | ||
w którym <math> | w którym <math>s\in S,\; v,w\in \Sigma _{T}^{*}</math> . Pomiędzy dwoma konfiguracjami | ||
<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 niżej wypisanych warunków, gdzie | wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie | ||
<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> | # <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> | # <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> | # <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> | Przechodnie domknięcie relacji <math>\mapsto</math> oznaczać będziemy symbolem | ||
<math> | <math>\mapsto^{*}</math> i określać mianem obliczenia wykonanego przez automat | ||
liniowo ograniczony. | liniowo ograniczony. | ||
}} | }} | ||
Język rozpoznawany przez automat liniowo ograniczony <math> | Język rozpoznawany przez automat liniowo ograniczony <math>\mathcal{A}_{LO}</math> | ||
to zbiór słów nad alfabetem <math> | 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> | <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> | Język <math>L\subset \Sigma _{I}^{*}</math> jest rozpoznawany (akceptowany) przez | ||
automat liniowo ograniczony, jeśli istnieje automat <math> | automat liniowo ograniczony, jeśli istnieje automat <math>\mathcal{A}_{LO}</math> taki, | ||
że <math> | że <math>\mathcal{L}(\mathcal{A}_{LO})=L</math> | ||
<center> | <center> | ||
Linia 221: | 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> | 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: | ||
# 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 230: | Linia 230: | ||
{{twierdzenie|2.1|| | {{twierdzenie|2.1|| | ||
Dla dowolnego języka kontekstowego <math> | Dla dowolnego języka kontekstowego <math>L</math> istnieje automat liniowo ograniczony | ||
<math> | <math>\mathcal{A}_{LO}</math> taki, że <math>\mathcal{L}(\mathcal{A}_{LO})=L</math> . | ||
}} | }} | ||
Linia 237: | 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> | 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> | generująca język <math>L</math> ma prawa wyłącznie następujących postaci: | ||
# (G) <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> | # (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> | # (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> | # (G) <math>v_{0}\rightarrow 1</math> jeśli <math>1\in L</math> . | ||
Określamy automat liniowo ograniczony <math> | Określamy automat liniowo ograniczony <math>\mathcal{A}_{LO}=(\Sigma _{T},S,P,s_{0},S_{F})</math> , | ||
przyjmując <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> | <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> | stan początkowy. Relacja przejść automatu <math>\mathcal{A}_{LO}</math> zdefiniowana | ||
jest poniżej: | jest poniżej: | ||
# (A) <math> | # (A) <math>(s_{0},\#)\rightarrow (s_{0},\#,1)</math> | ||
# (A) <math> | # (A) <math>(s_{0},\#)\rightarrow (s_{4},\#,1)</math> jeśli <math>1\in L</math> | ||
# (A) <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> | # (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> | # (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> | # (A) <math>(s_{0},v_{0})\rightarrow (s_{1},v_{0},-1)</math> | ||
# (A) <math> | # (A) <math>(s_{1},\#)\rightarrow (s_{2},\#,1)</math> | ||
# (A) <math> | # (A) <math>(s_{1},\flat )\rightarrow (s_{2},\flat ,1)</math> | ||
# (A) <math> | # (A) <math>(s_{2},v_{0})\rightarrow (s_{3},\flat ,1)</math> | ||
# (A) <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> | # (A) <math>(s_{3},\#)\rightarrow s_{3},\#,1),\; (s_{4},\#)\rightarrow (s_{3},\#,1)</math> | ||
Określony automat <math> | Określony automat <math>\mathcal{A}_{LO}</math> rozpoznaje | ||
tylko te słowa, które są generowane przez gramatykę <math> | tylko te słowa, które są generowane przez gramatykę <math>G</math> , symulując wstecz | ||
każde wyprowadzenie gramatyki <math> | każde wyprowadzenie gramatyki <math>G</math> . | ||
}} | }} | ||
Linia 270: | Linia 270: | ||
{{twierdzenie|2.2|| | {{twierdzenie|2.2|| | ||
Dla dowolnego języka <math> | Dla dowolnego języka <math>L</math> rozpoznawanego przez automat liniowo ograniczony | ||
<math> | <math>\mathcal{A}_{LO}</math> istnieje gramatyka kontekstowa <math>G</math> taka, że <math>L(G)=L</math> . | ||
}} | }} | ||
Linia 291: | Linia 291: | ||
{{twierdzenie|2.3|| | {{twierdzenie|2.3|| | ||
Dla dowolnych języków kontekstowych <math> | Dla dowolnych języków kontekstowych <math>L_{1},L_{2}\subset A^{*}</math> iloczyn | ||
mnogościowy tych języków <math> | mnogościowy tych języków <math>L_{1}\cap L_{2}</math> jest językiem kontekstowym. | ||
}} | }} | ||
Linia 298: | Linia 298: | ||
{{dowod||| | {{dowod||| | ||
(szkic) | (szkic) | ||
Załóżmy, że języki <math> | Załóżmy, że języki <math>L_{1},L_{2}</math> są rozpoznawane przez automaty | ||
liniowo ograniczone, <math> | liniowo ograniczone, <math>\mathcal{A}^{1}_{LO}</math> i <math>\mathcal{A}_{LO}^{2}</math> . | ||
Opiszemy konstrukcję automatu liniowo ograniczonego <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> | trzy razy. Przy pierwszym czytaniu automat <math>\mathcal{A}_{LO}</math> dubluje litery, | ||
to znaczy w miejsce litery <math> | 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> | automatu <math>\mathcal{A}^{1}_{LO}</math> . Jeśli ta symulacja doprowadzi do zaakceptowania | ||
czytanego słowa przez automat <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> | 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> | Działając w opisany sposób, automat <math>\mathcal{A}_{LO}</math> rozpoznaje | ||
język <math> | 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> | oznacza, że przecięcie języków kontekstowych <math>L_{1}\cap L_{2}</math> jest językiem | ||
kontekstowym. | kontekstowym. | ||
Linia 322: | Linia 322: | ||
==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, | 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 | ||
Linia 351: | Linia 347: | ||
{{definicja|3.1||}} | {{definicja|3.1||}} | ||
'''(Jednotaśmowa deterministyczna) maszyna Turinga''' jest to | '''(Jednotaśmowa deterministyczna) maszyna Turinga''' jest to | ||
system <math> | system <math>\mathbf{MT}=(\Sigma _{T},S,f,s_{0},S_{F})</math> , w którym | ||
<math> | <math>\Sigma _{T}</math> jest skończonym alfabetem, <math>S</math> | ||
skończonym zbiorem stanów, <math> | skończonym zbiorem stanów, <math>S\cap \Sigma _{T}=\emptyset</math> oraz | ||
wyróżniony jest podzbiór <math> | wyróżniony jest podzbiór <math>\Sigma _{I}\subset \Sigma _{T}</math> . Zbiór | ||
<math> | <math>\Sigma _{T}</math> zwany jest alfabetem taśmy, a <math>\Sigma _{I} | ||
</math> - alfabetem wejściowym. Wyróżnione są także: element <math> | </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> | 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> | częściową <math>f:\ : (S\times \Sigma _{T})\rightarrow (S\times \Sigma | ||
_{T}\times \{-1,0,1\} | _{T}\times \{-1,0,1\}</math> . | ||
'''Konfiguracją maszyny Turinga''' jest słowo <math> | '''Konfiguracją maszyny Turinga''' jest słowo <math>vsw\in (\Sigma | ||
_{T}\cup S)^{*} | _{T}\cup S)^{*}</math> , w którym <math>s\in S,\; v,w\in \Sigma _{T}^{*} | ||
</math> . Pomiędzy dwiema konfiguracjami <math> | </math> . Pomiędzy dwiema konfiguracjami <math>d_{1},d_{2}</math> zachodzi | ||
'''relacja bezpośredniego następstwa''' <math> | '''relacja bezpośredniego następstwa''' <math>d_{1}\mapsto d_{2}</math> | ||
wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych | wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych | ||
warunków, gdzie <math> | warunków, gdzie <math>s_{1},s_{2}\in S</math> , <math>a,b,c\in \Sigma _{T}</math> | ||
oraz <math> | oraz <math>v,w\in \Sigma _{T}^{*}</math>: | ||
# <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> | # <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> | # <math>d_{1}=vs_{1}\#</math> , <math>d_{2}=vbs_{2}\#</math> oraz <math>f(s_{1},\#)=(s_{2},b,1)</math> | ||
# <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> | ||
# {{kotwica|pkt.5|}}<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> | Przechodnie domknięcie relacji <math>\mapsto</math> oznaczać będziemy | ||
symbolem <math> | symbolem <math>\mapsto^{*}</math> i określać mianem '''obliczenia | ||
wykonanego''' przez maszynę Turinga. Konfiguracja <math> | wykonanego''' przez maszynę Turinga. Konfiguracja <math>d_{1}\in (\Sigma | ||
_{T}\cup S)^{*} | _{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> | Turinga '''zatrzymuje się''' w <math>d_{1}</math> wtedy i tylko wtedy, | ||
gdy <math> | gdy <math>d_{1}</math> 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). | 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|| | {{definicja|3.2|| | ||
Język rozpoznawany przez maszynę Turinga <math> | Język rozpoznawany przez maszynę Turinga <math>MT</math> jest to zbiór | ||
<center><math> | <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> | Język <math>L\subset \Sigma _{I}^{*}</math> jest rozpoznawany (akceptowany) | ||
przez maszynę Turinga, jeśli istnieje <math> | 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> | 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> | <math>\Sigma_I</math>), a następnie komórki przyległe zostają oznaczone | ||
symbolami <math> | symbolami <math>\sharp</math>. Jednocześnie maszyna jest sprowadzana do stanu | ||
<math> | <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> | 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> | (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ą | ||
Linia 419: | Linia 415: | ||
{{przyklad|3.1|| | {{przyklad|3.1|| | ||
Skonstruujemy maszynę Turinga <math> | Skonstruujemy maszynę Turinga <math>MT_1</math>, która rozpoznaje język postaci | ||
<math> | <math>L=\left\{0^{2^n}\; : \; n\geqslant 0\right\}</math>. Zamierzone działanie maszyny | ||
<math> | <math>MT_1</math> można opisać następująco: | ||
# Przejdź od lewego markera do prawego, zaznaczając symbolem <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> | # Jeśli było tylko jedno <math>0</math>, to '''akceptuj'''. | ||
# Jeśli w kroku 1. obszar pomiędzy markerami zawierał nieparzystą ilość <math> | # 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. | ||
Linia 436: | Linia 432: | ||
taśmie wciąż ten sam symbol). | taśmie wciąż ten sam symbol). | ||
Określamy kolejno elementy składowe maszyny <math> | Określamy kolejno elementy składowe maszyny <math>MT_1</math>: | ||
<center><math> | <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> | <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ść: | ||
}} | }} | ||
<center><math> | <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)\\ | \hline (s_0,0)\mapsto(s_1,\clubsuit,1) & (s_1,0) \mapsto(s_2,\diamondsuit,1)\\ | ||
\hline & (s_1,\sharp)\mapsto(s_A,\sharp,0)\\ | \hline & (s_1,\sharp)\mapsto(s_A,\sharp,0)\\ | ||
Linia 459: | Linia 453: | ||
\hline (s_4,\clubsuit)\mapsto(s_2,\clubsuit,1) & \\ | \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)\\ | \hline (s_A,\sharp)\mapsto(s_A,\sharp,0) & (s_R,\sharp)\mapsto(s_R,\sharp,0)\\ | ||
\hline \end{array} | \hline \end{array}</math></center> | ||
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]] | |||
Łatwo zauważyć, że wprowadzona funkcja przejścia określa maszynę | Łatwo zauważyć, że wprowadzona funkcja przejścia określa maszynę | ||
spełniającą postawione przez nas warunki. Symbol <math> | 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>. | ||
Aby lepiej zrozumieć działanie maszyny <math> | 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: | ||
<center><math> | <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 0000 \sharp & \mapsto & \sharp \clubsuit s_1 000 \sharp | &\sharp s_0 0000 \sharp & \mapsto & \sharp \clubsuit s_1 000 \sharp | ||
Linia 507: | Linia 496: | ||
</math></center> | </math></center> | ||
Wykazaliśmy więc, że <math> | 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> | s_A \sharp</math>. Zatem <math>0^4 \in L(MT_1)</math>. | ||
[[File:ja-lekcja12-w-anim1a.mp4|250x250px|thumb|center|Animacja 1]] | |||
Dla porównania: | Dla porównania: | ||
<center><math> | <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 528: | Linia 513: | ||
</math></center> | </math></center> | ||
Czyli zgodnie z naszym założeniem <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]] | |||
{{przyklad|3.2|| | {{przyklad|3.2|| | ||
Przedstawimy maszynę Turinga <math> | Przedstawimy maszynę Turinga <math>MT_2</math> akceptującą język | ||
<center><math> | <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> | gdzie <math>\overleftarrow{w}</math> oznacza lustrzane odbicie słowa <math>w</math>. | ||
Elementy języka <math> | Elementy języka <math>L</math> nazywamy palindromami. Definiujemy alfabet maszyny: | ||
<center><math> | <center><math> | ||
\Sigma_I=\left\{0,1\right\}\quad,\quad \Sigma_T=\left\{0,1,\sharp\right\} | \Sigma_I=\left\{0,1\right\}\quad,\quad \Sigma_T=\left\{0,1,\sharp\right\}</math>,</center> | ||
</math></center> | |||
oraz zbiory stanów | oraz zbiory stanów | ||
<center><math> | <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> | Funkcję przejść maszyny <math>MT_2</math> określa tabela: | ||
<center><math> | <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 (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 (r_0',\sharp)\mapsto (q_0,\sharp,-1) & (r_0',0)\mapsto (r_0',0,1) & (r_0',1)\mapsto (r_0',1,1)\\ | ||
Linia 567: | Linia 545: | ||
\hline (s_R,\sharp)\mapsto (s_R,\sharp,0) & & \\ | \hline (s_R,\sharp)\mapsto (s_R,\sharp,0) & & \\ | ||
\hline (s_A,\sharp)\mapsto (s_A,\sharp,0) & & \\ | \hline (s_A,\sharp)\mapsto (s_A,\sharp,0) & & \\ | ||
\hline \end{array} | \hline \end{array}</math></center> | ||
co dla przejrzystości zobrazowano na Rysunku 3. | co dla przejrzystości zobrazowano na Rysunku 3. | ||
[[File:file=ja-lekcja12-w-rys3.mp4|500x500px|thumb|center|Rysunek 3]] | |||
==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ę | ||
Linia 583: | Linia 556: | ||
wybranych podejść. | 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 <math> | 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 | ||
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> | <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> | |||
=== | ===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 [[#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). | 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]] | |||
===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> | <math>k</math> niezależnych maszyn jednotaśmowych. Akceptowany język jest w | ||
tym momencie <math> | tym momencie <math>k</math>-wymiarowy. Oczywiście, słowo postaci | ||
<math> | <math>(w,1,\dots,1)\in (\Sigma_T^*)^k</math> można w naturalny sposób | ||
utożsamiać z <math> | 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> | # Jako zbiór stanów bierzemy <math>S^k</math>. | ||
# Słowa startowe <math> | # 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 633: | Linia 600: | ||
taśmie jest podobna w swej idei do metody przedstawionej wcześniej. | taśmie jest podobna w swej idei do metody przedstawionej wcześniej. | ||
=== | ===Maszyna niedeterministyczna=== | ||
Ten typ maszyn ma ogromne | Ten typ maszyn ma ogromne | ||
Linia 645: | Linia 612: | ||
{{definicja|4.1|| | {{definicja|4.1|| | ||
'''(Jednotaśmowa) niedeterministyczna maszyna Turinga''' jest to | '''(Jednotaśmowa) niedeterministyczna maszyna Turinga''' jest to | ||
system <math> | system <math>\mathbf{NMT}=(\Sigma _{T},S,f,s_{0},S_{F})</math>, w którym | ||
<math> | <math>\Sigma _{T}</math> jest skończonym alfabetem, <math>S</math> | ||
skończonym zbiorem stanów, <math> | skończonym zbiorem stanów, <math>S\cap \Sigma _{T}=\emptyset</math> oraz | ||
wyróżniony jest podzbiór <math> | wyróżniony jest podzbiór <math>\Sigma _{I}\subset \Sigma _{T}</math> . | ||
Podobnie jak poprzednio zbiór <math> | Podobnie jak poprzednio zbiór <math>\Sigma _{T}</math> zwany jest | ||
alfabetem taśmy, a <math> | alfabetem taśmy, a <math>\Sigma _{I}</math> - alfabetem | ||
wejściowym. Wyróżnione są także: element <math> | wejściowym. Wyróżnione są także: element <math>\#\in \Sigma | ||
_{T}\setminus \Sigma _{I} | _{T}\setminus \Sigma _{I}</math> zwany markerem końca, stan początkowy | ||
<math> | <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> | <math>f:\ : (S\times \Sigma _{T})\rightarrow \mathcal{P}(S\times \Sigma | ||
_{T}\times \{-1,0,1\}) | _{T}\times \{-1,0,1\})</math> gdzie <math>\mathcal{P}(A)</math> oznacza zbiór | ||
podzbiorów zbioru <math> | podzbiorów zbioru <math>A</math>. | ||
'''Konfiguracją maszyny Turinga''' jest słowo <math> | '''Konfiguracją maszyny Turinga''' jest słowo <math>vsw\in (\Sigma | ||
_{T}\cup S)^{*} | _{T}\cup S)^{*}</math> , w którym <math>s\in S,\; v,w\in \Sigma _{T}^{*} | ||
</math> , przy czym pomiędzy dwiema konfiguracjami <math> | </math> , przy czym pomiędzy dwiema konfiguracjami <math>d_{1},d_{2}</math> | ||
zachodzi '''relacja bezpośredniego następstwa''' <math> | zachodzi '''relacja bezpośredniego następstwa''' <math>d_{1}\mapsto | ||
d_{2} | d_{2}</math> wtedy i tylko wtedy, gdy spełniony jest jeden z niżej | ||
wypisanych warunków, gdzie <math> | wypisanych warunków, gdzie <math>s_{1},s_{2}\in S</math> , <math>a,b,c\in | ||
\Sigma _{T} | \Sigma _{T}</math> oraz <math>v,w\in \Sigma _{T}^{*}</math>: | ||
# <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> | # <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> | # <math>d_{1}=vs_{1}\#</math> , <math>d_{2}=vbs_{2}\#</math> oraz <math>f(s_{1},\#)\ni(s_{2},b,1)</math> | ||
# <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> | # <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> | Tak jak poprzednio, przechodnie domknięcie relacji <math>\mapsto</math> | ||
oznaczać będziemy symbolem <math> | oznaczać będziemy symbolem <math>\mapsto^{*}</math> i określać mianem | ||
'''obliczenia wykonanego''' przez maszynę Turinga. Konfiguracja | '''obliczenia wykonanego''' przez maszynę Turinga. Konfiguracja | ||
<math> | <math>d_{1}\in (\Sigma _{T}\cup S)^{*}</math> jest '''końcowa''', jeśli | ||
stąd, że <math> | stąd, że <math>d_{1}\mapsto d_{2}</math> , wynika <math>d_{2}=d_{1}</math> | ||
}} | }} | ||
Linia 689: | Linia 656: | ||
{{definicja|4.2|| | {{definicja|4.2|| | ||
Język rozpoznawany przez niedeterministyczną maszynę Turinga <math> | Język rozpoznawany przez niedeterministyczną maszynę Turinga <math>NMT | ||
</math> jest to zbiór | </math> jest to zbiór | ||
<center><math> | <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\} | pewnych\ : w_{1},w_{2}\in \Sigma _{T}^{*},s_{F}\in S_{F}\right\}</math>.</center> | ||
Język <math> | Język <math>L\subset \Sigma _{I}^{*}</math> jest rozpoznawany (akceptowany) | ||
przez niedeterministyczną maszynę Turinga, jeśli istnieje <math> | przez niedeterministyczną maszynę Turinga, jeśli istnieje <math>\mathcal{NMT}</math> taka, że <math>L(\mathcal{NMT})=L</math> | ||
}} | }} | ||
Linia 712: | Linia 679: | ||
{{kotwica|prz.1b|}}{{twierdzenie|4.1|| | {{kotwica|prz.1b|}}{{twierdzenie|4.1|| | ||
Dla każdej niedeterministycznej maszyny Turinga <math> | Dla każdej niedeterministycznej maszyny Turinga <math>\mathcal{NMT}</math> | ||
istnieje maszyna deterministyczna <math> | istnieje maszyna deterministyczna <math>\mathcal{MT}</math> taka, że | ||
<center><math> | <center><math> | ||
L(\mathcal{NMT})=L(\mathcal{MT}) | L(\mathcal{NMT})=L(\mathcal{MT})</math></center> | ||
</math></center> | |||
}} | }} | ||
Linia 730: | Linia 696: | ||
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> | wykonane w <math>1,2,3,\dots</math> krokach. | ||
Do dokonania symulacji najwygodniej jest użyć maszyny <math> | 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 738: | 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> | # 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> | # Przekopiuj taśmę <math>1</math> na taśmę <math>2</math>. | ||
# Użyj taśmy <math> | # 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> | # 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>. | ||
}} | }} | ||
Linia 747: | Linia 713: | ||
{{kotwica|wn.4.1|}}{{wniosek|4.1|| | {{kotwica|wn.4.1|}}{{wniosek|4.1|| | ||
Dla każdej maszyny Turinga <math> | Dla każdej maszyny Turinga <math>\mathcal{MT}</math> istnieje maszyna Turinga | ||
<math> | <math>\mathcal{MT}'</math> taka, że | ||
<center><math> | <center><math> | ||
L(\mathcal{MT})=L(\mathcal{MT}') | L(\mathcal{MT})=L(\mathcal{MT}') | ||
</math></center> | </math></center> | ||
oraz dla każdego <math> | oraz dla każdego <math>w\in L(\mathcal{MT}')</math> maszyna <math>\mathcal{MT}'</math> | ||
zatrzymuje się na <math> | zatrzymuje się na <math>w</math>. | ||
}} | }} | ||
{{dowod||| | {{dowod||| | ||
Wystarczy przerobić maszynę <math> | Wystarczy przerobić maszynę <math>\mathcal{MT}</math> na maszynę | ||
niedeterministyczną <math> | niedeterministyczną <math>\mathcal{NMT}</math> posiadającą dodatkowy stan <math>s_A</math> | ||
oraz taką, że dla każdego stanu ze zbioru <math> | oraz taką, że dla każdego stanu ze zbioru <math>S_F</math> pod wpływem dowolnego | ||
symbolu z <math> | symbolu z <math>\Sigma_T</math> maszyna <math>\mathcal{NMT}</math> posiada dodatkowe | ||
przejście do <math> | 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>. | ||
Twierdzenie [[#prz.1b|4.1]] pozwala na otrzymanie maszyny | Twierdzenie [[#prz.1b|4.1]] pozwala na otrzymanie maszyny | ||
<math> | <math>\mathcal{MT}'</math> akceptującej ten sam język co <math>\mathcal{NMT}</math> z | ||
dodatkowym założeniem, że gdy <math> | dodatkowym założeniem, że gdy <math>\mathcal{NMT}</math> osiąga stan <math>s_A</math>, | ||
maszyna <math> | 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> | 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>. | ||
}} | }} |
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ę nazywamy rozszerzającą, jeśli każde prawo jest postaci , gdzie i spełniona jest nierówność lub jest to prawo i wtedy nie występuje po prawej stronie w żadnej produkcji z .
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 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ę taką, że oraz prawa są postaci: , lub , gdzie i w słowie występuje co najmniej jeden symbol nieterminalny z . Językiem generowanym przez tę gramatykę nazywamy zbiór
Gramatyka z markerem końca jest kontekstowa (typu ), 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 będzie dowolną gramatyką kontekstową z markerem końca. Zakładamy, bez ograniczania ogólności rozważań, że w zbiorze nie występuje prawo (po wymazaniu markera ). Dla każdego symbolu ze zbioru określamy trzy symbole oraz oznaczamy odpowiednio przez zbiory tych symboli. Dla takiego, że i dla wprowadzamy także następujące oznaczenia:
, oraz gdy .
Przy takich oznaczeniach definiujemy gramatykę
w której zbiór praw składa się ze wszystkich praw uzyskanych zgodnie z poniższymi warunkami:
- jeśli , to
- jeśli , to
- jeśli , to
dla wszystkich .
Określona w ten sposób gramatyka jest gramatyką rozszerzającą i równoważną wyjściowej. Dla gramatyki 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 , gdzie .
Mówimy, że gramatyka jest rzędu , jeśli dla każdego prawa tej gramatyki spełniony jest warunek i . 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 .
Na koniec wprowadzimy jeszcze jeden rodzaj gramatyk równoważnych gramatykom kontekstowym. Są to mianowicie gramatyki liniowo ograniczone.
Definicja 1.3
Gramatyka jest liniowo ograniczona, jeśli każde prawo jest jednej z następujących postaci:
gdzie oraz .
Twierdzenie 1.5
Dla dowolnej gramatyki kontekstowej istnieje gramatyka liniowo ograniczona , która jest równoważna lub też generuje język .
Dowód
W świetle poprzednich twierdzeń możemy przyjąć, że gramatyka kontekstowa ma prawa wyłącznie w następujących postaciach:
- gdzie
- gdzie
- gdzie
Określamy gramatykę , gdzie są nowymi symbolami nieterminalnymi, a więc nie należą do . Natomiast zbiór praw składa się ze wszystkich praw ze zbioru postaci 2 i 4 oraz praw dla i praw dla każdego prawa postaci 4 w gramatyce . 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 , w którym jest skończonym alfabetem, skończonym zbiorem stanów, oraz wyróżniony jest podzbiór . Zbiór zwany jest alfabetem taśmy, a - alfabetem wejściowym. Wyróżnione są także: element zwany markerem końca, stan początkowy oraz - zbiór stanów końcowych. Natomiast relacja przejść spełnia następujące warunki:
- jeśli , to
- jeśli , to
Fakt, że , zapisujemy zazwyczaj jako . 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 , w którym . Pomiędzy dwoma konfiguracjami zachodzi relacja bezpośredniego następstwa wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie , oraz
- , oraz
- , oraz
- , oraz
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 to zbiór słów nad alfabetem , pod działaniem których automat wykonuje obliczenie prowadzące do stanu końcowego, czyli
Język jest rozpoznawany (akceptowany) przez automat liniowo ograniczony, jeśli istnieje automat taki, że
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ę , będąc w stanie , 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 2. Głowica czytająca automatu przesuwa się w prawo,
- 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 istnieje automat liniowo ograniczony taki, że .
Dowód
Można założyć, bez ograniczenia ogólności naszych rozważań, że gramatyka generująca język ma prawa wyłącznie następujących postaci:
- (G) , gdzie
- (G) , gdzie
- (G) , gdzie
- (G) jeśli .
Określamy automat liniowo ograniczony , przyjmując , , , , - stan początkowy. Relacja przejść automatu zdefiniowana jest poniżej:
- (A)
- (A) jeśli
- (A) , dla każdego
- (A) jeśli i
- (A) jeśli
- (A)
- (A)
- (A)
- (A)
- (A) , gdy
- (A)
Określony automat rozpoznaje tylko te słowa, które są generowane przez gramatykę , symulując wstecz każde wyprowadzenie gramatyki .

Prawdziwe jest również następujące twierdzenie.
Twierdzenie 2.2
Dla dowolnego języka rozpoznawanego przez automat liniowo ograniczony istnieje gramatyka kontekstowa taka, że .
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 iloczyn mnogościowy tych języków jest językiem kontekstowym.
Dowód
(szkic) Załóżmy, że języki są rozpoznawane przez automaty liniowo ograniczone, i . Opiszemy konstrukcję automatu liniowo ograniczonego , 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 dubluje litery, to znaczy w miejsce litery wprowadza parę . Po zakończeniu tej procedury automat wraca do skrajnej lewej pozycji i rozpoczyna symulację automatu . Jeśli ta symulacja doprowadzi do zaakceptowania czytanego słowa przez automat , to automat rozpoczyna obliczenie od początku, symulując teraz pracę automatu . 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 rozpoznaje język , a to w świetle udowodnionego powyżej twierdzenia oznacza, że przecięcie języków kontekstowych 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

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 , w którym jest skończonym alfabetem, skończonym zbiorem stanów, oraz wyróżniony jest podzbiór . Zbiór zwany jest alfabetem taśmy, a - alfabetem wejściowym. Wyróżnione są także: element zwany markerem końca, stan początkowy oraz - zbiór stanów końcowych. Natomiast funkcja przejść jest funkcją częściową .
Konfiguracją maszyny Turinga jest słowo , w którym . Pomiędzy dwiema konfiguracjami zachodzi relacja bezpośredniego następstwa wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie , oraz :
- , oraz
- , oraz i
- , oraz
- , oraz
- , oraz
Przechodnie domknięcie relacji oznaczać będziemy symbolem i określać mianem obliczenia wykonanego przez maszynę Turinga. Konfiguracja jest końcowa, jeśli stąd, że , wynika Mówimy, że maszyna Turinga zatrzymuje się w wtedy i tylko wtedy, gdy 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 jest to zbiór
Język jest rozpoznawany (akceptowany) przez maszynę Turinga, jeśli istnieje taka, że Klasę języków rozpoznawanych przez maszynę Turinga oznaczamy .
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 ), a następnie komórki przyległe zostają oznaczone symbolami . Jednocześnie maszyna jest sprowadzana do stanu , 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 ), to maszyna zaakceptowała słowo, w przeciwnym razie - słowo odrzuciła (gdyż nie może już osiągnąć stanu ze zbioru ). 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 , która rozpoznaje język postaci . Zamierzone działanie maszyny można opisać następująco:
- Przejdź od lewego markera do prawego, zaznaczając symbolem co drugie .
- Jeśli było tylko jedno , to akceptuj.
- Jeśli w kroku 1. obszar pomiędzy markerami zawierał nieparzystą ilość , to odrzuć.
- Powróć do lewego markera.
- 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 :
Pozostaje jeszcze zdefiniować funkcję przejść:
W miejsce tabeli wygodniej jest zobrazować funkcję przejść maszyny Turinga na etykietowanym grafie skierowanym. Zostało to zrobione na poniższym rysunku:
Ł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 .
Aby lepiej zrozumieć działanie maszyny , zasymulujemy jej działanie na dwóch słowach wejściowych, przy czym pierwsze z nich będzie należało do języka , a drugie nie:
Wykazaliśmy więc, że . Zatem .
Dla porównania:
Czyli zgodnie z naszym założeniem .
Przykład 3.2
Przedstawimy maszynę Turinga akceptującą język
gdzie oznacza lustrzane odbicie słowa . Elementy języka nazywamy palindromami. Definiujemy alfabet maszyny:
oraz zbiory stanów
Funkcję przejść maszyny określa tabela:
co dla przejrzystości zobrazowano na Rysunku 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 , gdzie oznacza ilość taśm. W tym momencie zapis na taśmie -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:
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).
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 niezależnych maszyn jednotaśmowych. Akceptowany język jest w tym momencie -wymiarowy. Oczywiście, słowo postaci można w naturalny sposób utożsamiać z . Z drugiej strony maszynę wielogłowicową można symulować na jednotaśmowej w następujący sposób:
- Jako zbiór stanów bierzemy .
- Słowa startowe zapisujemy jako konfigurację początkową maszyny jednotaśmowej w postaci:
Symbole mają za zadanie wirtualnego rozdzielenia taśm. Symbole wskazują na położenie -tej głowicy na taśmie. - 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 , w którym jest skończonym alfabetem, skończonym zbiorem stanów, oraz wyróżniony jest podzbiór . Podobnie jak poprzednio zbiór zwany jest alfabetem taśmy, a - alfabetem wejściowym. Wyróżnione są także: element zwany markerem końca, stan początkowy oraz - zbiór stanów końcowych. Natomiast funkcja przejść jest funkcją częściową gdzie oznacza zbiór podzbiorów zbioru .
Konfiguracją maszyny Turinga jest słowo , w którym , przy czym pomiędzy dwiema konfiguracjami zachodzi relacja bezpośredniego następstwa wtedy i tylko wtedy, gdy spełniony jest jeden z niżej wypisanych warunków, gdzie , oraz :
- , oraz
- , oraz i
- , oraz
- , oraz
- , oraz
Tak jak poprzednio, przechodnie domknięcie relacji oznaczać będziemy symbolem i określać mianem obliczenia wykonanego przez maszynę Turinga. Konfiguracja jest końcowa, jeśli stąd, że , wynika
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 jest to zbiór
Język jest rozpoznawany (akceptowany) przez niedeterministyczną maszynę Turinga, jeśli istnieje taka, że
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
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 krokach.
Do dokonania symulacji najwygodniej jest użyć maszyny -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:
- Rozpocznij ze słowem wejściowym na taśmie oraz pustymi taśmami i .
- Przekopiuj taśmę na taśmę .
- Użyj taśmy do symulacji , wykorzystując taśmę do wyboru przejść funkcji przejść . Jeśli po wykonaniu skończonego zbioru instrukcji według adresowania z taśmy 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 , zapisz na taśmie pierwszy w kolejności leksykograficznej ciąg adresowy o długości oraz przejdź do .

Wniosek 4.1
Dla każdej maszyny Turinga istnieje maszyna Turinga taka, że
oraz dla każdego maszyna zatrzymuje się na .
Dowód
Wystarczy przerobić maszynę na maszynę niedeterministyczną posiadającą dodatkowy stan oraz taką, że dla każdego stanu ze zbioru pod wpływem dowolnego symbolu z maszyna posiada dodatkowe przejście do , w którym już pozostaje i nic nie zmienia. Stąd widać, że .
Twierdzenie 4.1 pozwala na otrzymanie maszyny akceptującej ten sam język co z dodatkowym założeniem, że gdy osiąga stan , maszyna się zatrzymuje. Zauważmy, że stan 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 .
