Soluții Mai multe reduceri Turing

1. Pentru fiecare dintre problemele următoare, determinați dacă sunt decidabile sau nu (demonstrația nedecidablității poate fi realizată printr-o reducere Turing, cea a decidabilității prin schițarea unui algoritm):

  • $ f_{1010}(M) = {\rm TRUE} \iff M[1010] \text{ nu mută niciodată capul de citire la stânga}$
Această problemă este decidabilă. Observăm că dacă mașina nu mută capul de citire la stânga, având un număr finit $ n = |K| $ de stări si un număr finit $ m = |\Gamma| $ de simboluri de bandă, mașina fie se oprește după un număr finit de tranziții, fie nu se termină prin a ajunge într-un șir de tranziții de forma $ (q,\ a) \to (q',\ a',\ -) \to (q'',\ a'',\ -) \to \dots \to (q,\ a,\ -) $ (cel mult $ n\cdot m $ tranziții), fie parcurge tot conținutul benzii ajungând la capătul din dreapta pe un simbol blank, după care tranzițiile au forma $ (p,\ \square) \to (p',\ b',\ \rightarrow/-) \to (p'',\ b'',\ \rightarrow/-) \to \dots \to (p,\ \square,\ \rightarrow/-) $ (cel mult $ n\cdot m $ tranziții) (exceptând cazul anterior în care mașina rămâne la nesfârșit în hold schimbând stările și/sau simbolurile, mașina avansează la dreapta la nesfârșit, făcând eventual hold între avansări, schimbând stările și/sau simbolurile). Așadar, sunt suficiente $ n\cdot m + 1 + {\rm len}(1010) $ = $ n\cdot m + 5 $ tranziții pentru a verifica dacă mașina mută capul de citire la stânga. Putem descrie masina care decide această problemă astfel:
M_1010[M]:
    k = 0
    n = nr_stari(M)
    m = nr_simboluri_banda(M)
    while k < n * m + 5:
        simuleaza un pas din M[1010]
        k = k + 1
        if tranzitia a fost la stanga:
            tranzitie la N
    tranzitie la Y 
  • $ f_{s}(M) = {\rm TRUE} \iff \forall w, M[w] \text{ nu mută niciodată capul de citire la stânga}$
Și această problemă este decidabilă. Numărul de tranziții la stânga al mașinii este finit, si la fel și numărul de tranziții într-una din stările din care mașina poate face o tranziție la stânga. Făcând doar tranziții la dreapta și hold, simbolul aflat sub capul de citire la un moment dat este întotdeauna fie cel aflat pe acea poziție în input, fie cel scris după hold-ul anterior. Putem construi “drumuri” (șiruri de tranziții) înapoi de la tranzițiile la stânga, iar dacă ajungem la starea inițială, am găsit un input pentru care mașina face o tranziție la stânga. De fapt, putem reprezenta orice mașină Turing sub forma unui graf (exemplu) și putem găsi toate drumurile de la starea inițială până la o stare în care ajungem printr-o tranziție la stânga. Un drum “corect” fie trece doar prin tranziții care citesc un simbol din alfabetul de input, fie trece printr-o tranziție care scrie un simbol ce nu se află in alfabetul de input și ține capul de citire pe loc înainte de a face o tranziție ce citește acel simbol (pentru a construi în acest fel un input valid).
  • $ f_{50a}(M) = {\rm TRUE} \iff M[1010] \text{ nu trece prin mai mult de 50 de tranziții}$
Problema este decidabilă. Rulăm mașina pentru maxim 50 de pași pe inputul 1010. Dacă se termină între timp, $ f_{50a}(M) = {\rm TRUE}$ și tranziționăm la starea Y. Altfel, $ f_{50a}(M) = {\rm FALSE}$ și tranziționăm la starea N.
  • $ f_{50b}(M) = {\rm TRUE} \iff \forall w, M[w] \text{ nu trece prin mai mult de 50 de tranziții}$
Chiar și această problemă este decidabilă. Observăm că dacă inputul are o lungime mai mare de 51, mașina trebuie să facă cel puțin 51 de tranziții pentru a parcurge tot inputul. Așadar, $ f_{50b}(M) = {\rm TRUE}$ doar pentru mașini care citesc doar primele cel mult 51 de simboluri. Este suficient atunci să rulăm mașina pentru 50 de pași pentru toate inputurile $ w$ cu $ |w| \leq 51$. Dacă pentru fiecare astfel de input, mașina se oprește pe parcursul celor 50 de pași, acceptăm mașina (tranziție la Y), altfel, dacă pentru oricare dintre aceste inputuri mașina nu se oprește după 50 de pași, o respingem (tranziție la N).

2. Determinați exact unde se află următoarele probleme ($ {\rm R}$, $ {\rm RE} \setminus {\rm R}$, $ \mathbb{D} \setminus {\rm RE}$):

  • $ f_{\rm or}(M_1, M_2) = {\rm TRUE} \iff M_1[111] \rightarrow {\rm TRUE} \lor M_2[111] \rightarrow {\rm TRUE}$
Din faptul că ar trebui să decidem dacă mașinile se termină, în primul rând, pe inputul 111, pentru a vedea dacă vreuna din ele acceptă inputul, ne dăm seama că problema nu este decidabilă (și vom demonstra mai jos printr-o reducere). Totuși, din moment ce putem vedea dacă una din mașini a acceptat inputul atunci când îl acceptă, intuim că am putea face o astfel de verificare pentru ambele mașini simultan și atunci problema ar fi în $ {\rm RE} \setminus {\rm R}$. Într-adevăr, putem scrie următoarea mașină care acceptă problema:
M_or[(M1, M2)]:
    while (M1 nu s-a terminat) sau (M2 nu s-a terminat):
        simulează un pas din M1[111]
        simulează un pas din M2[111]
        if (M1 a facut tranziție la Y) sau (M2 a facut tranziție la Y):
            tranziție la Y
    tranziție la N

Demonstrăm că problema nu este decidabilă prin urmatoarea reducere $ \mathtt{HALT} \leq_m f_{or}$:
$ t(M, w) = (M_1, M_2) $ a.î $ \mathtt{HALT}(M, w) = {\rm TRUE} \iff f_{\rm or}(M_1, M_2) = {\rm TRUE} $

M1[u]:
    simulează M[w]
    tranziție la Y

M2[u]:
    tranziție la N

$ (\Rightarrow) $ $$ \mathtt{HALT}(M, w) = {\rm TRUE} \Rightarrow M_1[111] \to {\rm TRUE} \\ \Rightarrow M_1[111] \to {\rm TRUE} \vee M_2[111] \to {\rm TRUE} \Rightarrow f_{\rm or}(M_1, M_2) = {\rm TRUE} $$ $ (\Leftarrow) $ $$ f_{\rm or}(M_1, M_2) = {\rm TRUE} \Rightarrow M_1[111] \to {\rm TRUE} \vee M_2[111] \to {\rm TRUE} \\ \forall v, M_2[v] \to {\rm FALSE} \Rightarrow M_2[111] \nrightarrow {\rm TRUE} \\ \Rightarrow M_1[111] \to {\rm TRUE} \Rightarrow \mathtt{HALT}(M, w) = {\rm TRUE} \\ (\text{deoarece } \mathtt{HALT}(M, w) = {\rm FALSE} \Rightarrow M_1[111] \to \bot) $$

  • $ f_{\rm and}(M_1, M_2) = {\rm TRUE} \iff M_1[111] \rightarrow {\rm TRUE} \land M_2[111] \rightarrow {\rm TRUE}$
La fel ca în cazul anterior, problema se află în $ {\rm RE} \setminus {\rm R}$, în mod analog. Mașina care acceptă problema este:
M_and[(M1, M2)]:
    while (M1 nu s-a terminat) sau (M2 nu s-a terminat):
        simulează un pas din M1[111]
        simulează un pas din M2[111]
        if (M1 a facut tranziție la N) sau (M2 a facut tranziție la N):
            tranziție la N
    tranziție la Y

Iar pentru a demonstra că problema nu este decidabilă, folosim următoarea reducere $ \mathtt{HALT} \leq_m f_{\rm and}$:
$ t(M, w) = (M_1, M_2) $ a.î $ \mathtt{HALT}(M, w) = {\rm TRUE} \iff f_{\rm and}(M_1, M_2) = {\rm TRUE} $

M1[u]:
    simulează M[w]
    tranziție la Y

M2[u]:
    tranziție la Y

$ (\Rightarrow) $ $$ \mathtt{HALT}(M, w) = {\rm TRUE} \Rightarrow M_1[111] \to {\rm TRUE} \\ M_2[111] \to {\rm TRUE} \Rightarrow M_1[111] \to {\rm TRUE} \land M_2[111] \to {\rm TRUE} \Rightarrow f_{\rm and}(M_1, M_2) = {\rm TRUE} $$ $ (\Leftarrow) $ $$ f_{\rm and}(M_1, M_2) = {\rm TRUE} \Rightarrow M_1[111] \to {\rm TRUE} \land M_2[111] \to {\rm TRUE} \\ \Rightarrow M_1[111] \to {\rm TRUE} \Rightarrow \mathtt{HALT}(M, w) = {\rm TRUE} \\ (\text{deoarece } \mathtt{HALT}(M, w) = {\rm FALSE} \Rightarrow M_1[111] \to \bot) $$

  • $ f_{\rm diff}(M_1, M_2) = {\rm TRUE} \iff M_1[111] \rightarrow {\rm TRUE} \land M_2[111] \not\rightarrow {\rm TRUE}$
Exercițiile anterioare ne-au ajutat să ne dăm seama că această problemă nu este decidabilă, și am putea face o reducere $ \mathtt{HALT} \leq_m f_{\rm diff}$ ca mai devreme pentru a demonstra acest lucru. Totuși, ne punem întrebarea acum dacă această problemă mai este acceptabilă. Problema dacă $ M_1[111] \rightarrow {\rm TRUE}$ este acceptabilă (doar simulăm mașina), dar pentru a vedea dacă $ M_2[111] \not\rightarrow {\rm TRUE}$, ar trebui să vedem dacă $ M_2$ nu se termină. Știm că problema $ \mathtt{coHALT}$ nu este acceptabilă și atunci ne dăm seama că problema $ f_{\rm diff}$ nu este nici ea acceptabilă. Putem face reducerea $ \mathtt{coHALT} \leq_m f_{\rm diff}$ pentru a demonstra acest lucru (și prin urmare și nedecidabilitatea - nu e nevoie să facem și reducerea menționată la început): $ t(M, w) = (M_1, M_2) $ a.î $ \mathtt{coHALT}(M, w) = {\rm TRUE} \iff f_{\rm diff}(M_1, M_2) = {\rm TRUE} $
M1[u]:
    tranziție la Y

M2[u]:
    simulează M[w]
    tranziție la Y

$ (\Rightarrow) $ $$ \mathtt{coHALT}(M, w) = {\rm TRUE} \Rightarrow M[w] \to \bot \Rightarrow M_2[111] \to \bot \\ M_1[111] \to {\rm TRUE} \Rightarrow M_1[111] \to {\rm TRUE} \land M_2[111] \nrightarrow {\rm TRUE} \Rightarrow f_{\rm diff}(M_1, M_2) = {\rm TRUE} $$ $ (\Leftarrow) $ $$ f_{\rm diff}(M_1, M_2) = {\rm TRUE} \Rightarrow M_1[111] \to {\rm TRUE} \land M_2[111] \nrightarrow {\rm TRUE} \\ \Rightarrow M_2[111] \nrightarrow {\rm TRUE} \Rightarrow M[w] \to \bot \\ (\text{deoarece } M[w] \nrightarrow \bot \Rightarrow M_2[111] \to {\rm TRUE} \text{ din construcția mașinii}) \\ \Rightarrow \mathtt{coHALT}(M, w) = {\rm TRUE} $$

Răspunsurile la următoarele două probleme sunt nelimitate. Puteți găsi multe variante creative. Vom prezenta doar câteva exemple.

3. Dați exemplu de o Mașină Turing pentru care putem determina algoritmic, pentru orice input, dacă se termină sau nu.

Dacă luăm orice problemă decidabilă și într-o mașină care o decide înlocuim toate tranzițiile la N cu tranziții ce determină neterminarea mașinii și eventual înlocuim o parte (sau toate) din tranzițiile la Y cu tranziții la N, obținem o mașină pentru care putem determina algoritmic dacă se termină, deoarece acum problema decidabilă de la care am plecat este echivalentă cu problema terminării acestei mașini.
Exemplu 1: O mașină care ar trebui să decidă dacă inputul nu conține același număr de 1 și de 0, modificată după transformarea descrisă
$ Q$ \ $ \Gamma$ $ 0$ $ 1$ $ \square$ $ X$
$ q_0$ $ f_1, X, \rightarrow$ $ f_0, X, \rightarrow$ N$ r,\square,\leftarrow$ $ q_0,X,\rightarrow$
$ f_0$ $ r, X, \leftarrow$ $ f_0, 1, \rightarrow$ Y$ N, \square, -$ $ f_0, X, \rightarrow$
$ f_1$ $ f_1, 0, \rightarrow$ $ r, 1, \leftarrow$ $ Y, \square, -$ $ f_1, X, \rightarrow$
$ r$ $ r, 0, \leftarrow$ $ r, 1, \leftarrow$ $ q_0, \square, \rightarrow$ $ r, X, \leftarrow$

Mașina originală decide dacă această mașină se termină

Exemplu 2: O mașină care caută înainte și înapoi simbolul X în input (când ajunge la capăt se întoarce). Această mașină se termină dacă și numai dacă inputul conține X. Observație: dacă folosim o mașină care se termină cu reject când ajunge la capăt, atunci aceasta decide terminarea mașinii descrise și poate fi transformată în ea prin înlocuirea tranziției pe blank.

4. Dați exemplu de o Mașină Turing pentru care nu putem determina algoritmic dacă se termină sau nu.

Mașina Turing Universală: existența unui algoritm/mașină Turing care să decidă terminarea MTU-ului este echivalentă cu decidabilitatea problemei HALT.