Edit this page Backlinks This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== Mai multe reduceri Turing ====== ===== Exerciții ===== /* <note important> **Solutii** https://drive.google.com/file/d/1REQ1A2SjEUDwodPDqXkptWyqIbPB62e5/view?usp=sharing </note> */ 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}$ /* <hidden Soluție> 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: <code> M_1010[enc(M)]: k = 0 n = nr_stari(M) m = nr_simboluri_banda(M) while k < n * m + 5: simuleaza un pas din M[w] k = k + 1 if tranzitia a fost la stanga: tranzitie la N tranzitie la Y </code> </hidden> */ * $ f_{s}(M) = {\rm TRUE} \iff \forall w, M[w] \text{ nu mută niciodată capul de citire la stânga}$ /* <hidden Soluție> Ș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 ([[https://turingmachine.io/|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). </hidden> */ * $ f_{50a}(M) = {\rm TRUE} \iff M[1010] \text{ nu trece prin mai mult de 50 de tranziții}$ /* <hidden Soluție> 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. </hidden> */ * $ f_{50b}(M) = {\rm TRUE} \iff \forall w, M[w] \text{ nu trece prin mai mult de 50 de tranziții}$ /* <hidden Soluție> 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). </hidden> */ 2. Determinați exact unde se află următoarele probleme ($ {\rm R}$, $ {\rm RE} \setminus {\rm R}$, $ \mathbb{D} \setminus {\rm RE}$): * $ f_{or}(M_1, M_2) = {\rm TRUE} \iff M_1[111] \rightarrow {\rm TRUE} \lor M_2[111] \rightarrow {\rm TRUE}$ /* <hidden Soluție> 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: <code> M_or[enc((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 </code> Demonstrăm că problema nu este decidabilă prin urmatoarea reducere $ \mathtt{HALT} \leq_m f_{or}$: $ (M, w) \xrightarrow{t} (M_1, M_2)$ a.î $ \mathtt{HALT}(M, w) = {\rm TRUE} \iff f_{or}(M_1, M_2) = {\rm TRUE}$ </hidden> */ * $ f_{and}(M_1, M_2) = {\rm TRUE} \iff M_1[111] \rightarrow {\rm TRUE} \land M_2[111] \rightarrow {\rm TRUE}$ * $ f_{diff}(M_1, M_2) = {\rm TRUE} \iff M_1[111] \rightarrow {\rm TRUE} \land M_2[111] \not\rightarrow {\rm TRUE}$ 3. Dați exemplu de o Mașină Turing pentru care putem determina algoritmic, pentru orice input, dacă se termină sau nu. 4. Dați exemplu de o Mașină Turing pentru care nu putem determina algoritmic dacă se termină sau nu.