Ok [Musica] guys, let's start. Ok, quello che vediamo oggi sono un po' di esercizi su macchine di touring Montinasto. Abbiamo introdotto la nozione la scorsa volta, ci esercitiamo ora un po'. Vediamo un po' di roba così vediamo come come si programma questo aggeggio. Ok? M è chiaro per tutti la definizione di multinastro? La differenza di multinastro con multitraccia? Yeah! No, ok, multinastro. Vi ricordo che sono quelle macchine di touring che hanno più nastri e ogni nastro ha una testina indipendente. Ok. Multitracco, testini macchine Turing che hanno un solo nastro diviso in più tracce e c'è una testina gigante che se la legge tutto e se le legge tutti assieme. Ok? Abbiamo mostrato che le multinastro sono equivalenti alle multitraccia. Abbiamo mostrato che le multitraccia sono equivalenti a quelle standard. Di conseguenza tutte queste macchine sono equivalenti alle macchine standard. Per equivalenti intendo che se c'è se una macchina multinastro decide o accetta un certo linguaggio L, allora esisterà anche una macchina mononastro standard che decide o accetta lo stesso identico linguaggio. Abbiamo visto che una macchina multinastro può essere un po' più veloce di una macchina mononastro perché perché avendo più testine può usare la memoria in un modo migliore, però questo non gli dà un potere di calcolo maggiore. Cioè quello che sappiamo fare su macchine di Touring multinastro, lo sappiamo fare su macchine di Touring mononastro, eh, e quindi non aggiunge niente all'espressività di questo tipo di automi, semplicemente ci vengono più facili da programmare. Eh, quindi oggi vedremo un po' di di esempi di linguaggi che riconosciamo con macchine di Touring Multinastro, così ci esercitiamo un pochettino. Questa cosa ci servirà perché quando poi andiamo su macchine non deterministiche a quel punto diventa più divertente se abbiamo più nastri e quindi è meglio impratichirci ora. Ok. Alright. Qui c'ho un po' di esempi. Iniziamo. Ah, così vedo, così vedo che vedete. Allora, vogliamo riconoscere il linguaggio L fatto così, A B AB tale che A e B sono stringhe provenienti da 0 Chiaro il significato di questo linguaggio? Ci siete? Quindi il linguaggio di triple divise da due cancelletti. Qui abbiamo un primo pezzo che chiamiamo A, un secondo pezzo che chiamiamo B e poi il terzo pezzo deve essere pari ad A concatenato B. Ok? Quindi molto semplice. Il solito trucco per risolvere queste cose è visualizzare il funzionamento della macchina. Ok? Facciamolo un po' assieme. Come possiamo risolvere questo coso? Potremmo tre nastri. Quello degli sul primo scriviamo tutta A. Al primo cancelletto scriviamo B sulla sull'ultimo nastro. Al secondo cancelletto riavvolgiamo tutto e vediamo se prima si legge tutto a si legge tutto B. Ok. Sì. Praticamente noi possiamo utilizzare dei nastri di memoria temporanea. Ci ricopiamo A B, li possiamo ricopiare in sequenza, no? Sullo stesso nastro. E poi andiamo a vedere se AB sta in fondo dopo il secondo cancelletto. Ok? Ovviamente ci sono tanti modi di fare questa cosa, non mi interesserà vedere il modo più efficiente, basta che funziona, cioè qualsiasi cosa che funziona per me va bene, però deve funzionare. Ok? Allora, questo è uno che vi propongo io. Allora, m abbiamo che alfa è un simbolo che appartiene all'insieme 01. Leggete? Sì. Allora, siccome noi abbiamo che A e B devono avere almeno un carattere, iniziamo per esempio leggendo un carattere. Quindi, sul primo nastro leggiamo un simbolo alfa, lo lasciamo lì dov'è e andiamo avanti. Sul secondo che facciamo? Sì, non c'è niente. Scriviamo alfa. Eh, eh, e andiamo avanti. E andiamo avanti. Ok. Questa cosa ovviamente va fatta per tutti i simboli di quello che noi chiamiamo a e quindi cicliamo su questa cosa, no? Spostiamo le testine. Tutto quello che stava in A. Fatemelo scrivere a sto punto. Quindi che cosa abbiamo? Tipo 0 1 0 cancelletto 0. Ok. E poi abbiamo 0 1 1 0. Ok? Quindi l'idea è praticamente questo è il primo nastro di input, sul secondo nastro di input andiamo a piazzare questi qua, quindi 0 1 0, superiamo il cancelletto e poi andiamo a copiare questi 1 1 1 e sono quando è pronto andiamo a verificare che è uguale a questa cosa qui. Ok, tutto qua. So tagliare così si fa così. No, ciao. Ok, allora facciamo. Quindi stiamo ricopiendo a quindi sul primo nastro c'è alfa, scrivo alfa e vado avanti. Sul secondo nastro c'è blank, scrivo alfa e vado avanti. Ok? Fino a quando becchiamo il cancelletto sul primo nastro. Sul primo nastro c'è cancelletto. Lascio cancelletto e vado avanti. Sul secondo nastro che faccio? C'è blank, lascio blank, sto fer Sì, quindi c'è Blank, lascio blank e sto fermo. Posso anche non scrivere niente, che significa? in qualsiasi condizione è il secondo nastro, lo lascio lì com'è e lo lascio fermo. Ok, però si instanzia in c'è blank, lascio blank e sto fermo. Ok, andiamo in Q2. A questo punto dobbiamo fare una cosa simile, quindi sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro c'è. Blank. Alri, scrivo alfa e vado avanti. Domanda: questo alfa qua e questo alfa qua sono relati in qualche modo? No, sono la stessa etichetta che sta in due edge diversi. Sì, non dovremmo scrivere sul nastro tre. Non non è indispensabile. Un attimo, qua serve questo qua. Si potrebbe scrivere sul nastro tre e poi andiamo a leggere dal due, no? Perché guarda la la mia idea è questa. Scrivo A sul 2 e poi scrivo B sul 2. Li metto uno appresso all'altro in maniera tale che poi tutta questa la prendo e la confronto con C. Si può anche scrivere sul terzo, eh, cioè non è oro colato. Questo è un modo per farlo. Ok? Qualsiasi modo che va bene, va bene. Ok, siamo in Q2, andiamo in Q3. Qui facciamo sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro c'è blank, las scrivo alfa e vado avanti. Ok. Ma non si può ciclare direttamente Q2 o c'è bisogno di fare un passaggio in Q2 dobbiamo essere sicuri che B abbia almeno un carattere, un simbolo. Quindi io in questo modo impongo che su B leggo almeno una cosa. Ok? Poi andiamo avanti. Sul primo nastro c'è cancelletto. Lascio cancelletto e vado avanti sul secondo nastro che facciamo? Ok. Allora, ci sono vari modi per risolvere questa cosa. Qualsiasi modo che funziona va bene. Ok. Allora, uno che potrebbe essere utile per noi, c sono vari, è che una volta che abbiamo scritto l'intero contenuto del secondo nastro e che quindi sul nastro abbiamo A seguito da B, una cosa che potremmo fare è vado indietro all'inizio di quello che ho scritto sul secondo nastro e poi verifico che il quello Quello che ci sta sul primo nastro e quello che ci sta sul secondo nastro sono la stessa cosa. Un altro modo che è perfettamente equivalente è che mando in fondo il primo nastro e dopodiché li indietreggio assieme. Ok? Uno vale l'altro. Eh, sono entrambi. Funzionano entrambi. Ok, magari riavvolgiamo il secondo nastro. Allora, che abbiamo sul secondo nastro? C'è Blank, scrivo blank e B. Andiamo indietro. Ok, Q4. Vediamo che leggete. Mh, più o meno. Ok, ci sta. Ok, dobbiamo riavvolgere ora l'intero secondo nastro. Come facciamo? Primo nastro. Sul primo nastro non facciamo niente, quindi non scriviamo niente. Sì. E sul secondo, cioè qualsiasi cosa leggo Sì, sì. Eh, leggo alfa, non scrivo niente. Cioè, scrivo alfa, riscriviamo alfa e torniamo indietro. Sì, quindi sul secondo c'è alfa, riscrivo alfa e vado dietro. Ok, quindi a questo punto stiamo indietreggiando sul secondo nastro fino a quando? Come ci accorgiamo di aver riavvolto tutto? Blank. Qui ci sta niente. Appena vediamo quello sul secondo nastro sappiamo che siamo arrivati. Ok. Ok. Allora, sul secondo nastro c'è blank. Scrivo blank e vado avanti. Q5. Adesso in che condizioni siamo? Cioè in che stato di in che configurazione si trova la macchina? Dov'è la testina del primo nastro? Dov'è la testina del secondo nastro? Allora, la testina del primo e dopo il secondo asterisco. Sì. Eh, sì. Cancelletto. E mentre invece Ah, sì, è cancelletto. Eh, mentre invece la testina del secondo nastro è eh sul primo alfa, diciamo, sul primo carattere non blank, quello più a sinistra. Ok. Benissimo. Quindi, che cosa dobbiamo fare? li guardiamo contemporaneamente, li spostiamo assieme, deve esserci sempre la stessa cosa e devono finire assieme. Ok? Quindi semplicemente sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro cosa devo trovare? Alfa. Alfa. Lascio alfa e vado avanti. Quand'è che mi fermo? Blank dove? A entrambi. Ok, quindi sul primo ci sta blank, lascio blank e sto fermo. Sul secondo c'è blank, lascio blank e sto fermo. Andiamo in Q6 e aspettiamo. Chiaro? Per tutti come funziona sta macchina? Molto semplice, ok? Gli esercizi, quelli un po' più trichi, li vediamo dopo la pausa, ok? Prossimo. Se vado troppo veloce fermatemi. Alright. Scusi. Sì, ma per noi il confronto tra string effettivamente sull'automa non lo spieghiamo, ma avviene in maniera implicita qual dello stato Q5 +6, cioè non c'è ver proprio medi di struttura dove diciamo confrontiamo la parte di stringa. in Q5 si confronta in Q5 la eh l'etichetta qui ci sta dicendo che qualsiasi carattere leggo su primo nastro e sul primo nastro mi trovo nella porzione di input che è questa qua, quella che chiamiamo C. Quindi qualsiasi cosa leggo su primo nastro, quella stessa cosa deve stare sul secondo nastro. È lì che stiamo facendo il la verifica. Però questo per voi, cioè non è che l'abbiamo In che senso? C'abbiamo dei singoli che indicano non avere propria del vita. Cioè se avessi un'altra transizione da stato qui a cui + 1 dove la transizione appunto viene come su un altro uno o alfa scrivo alfa e passo avanti e su nastro due o alfa scrivo alfa passo avanti. Sto intendere sempre che abbiano un confronto oppure no. Il fatto che queste due cose sono scritte assieme significa che percorrere questo edge si devono verificare due condizioni. O su primo nastro c'è zero e su secondo nastro c'è zero. Allo stesso momento, eh, e a quel punto lì avanzo entrambi. Oppure su primo nastro c'è uno, su secondo nastro c'è uno e li avanzo entrambi. Non può accadere che sul primo nastro c'è zero e sul secondo nastro c'è uno. L'etichetta com'è definit. Quindi la combinazione delle etichette crea una condizione Sì. Perché lì in quel modo, siccome stiamo usando alfa qui e alfa qui, stiamo usando lo stesso simbolo lì, sto intendendo che questo Ok, cambiamo colore. Questa qui è un'etichetta da sola, eh, cioè la condizione deve avvenire su primo nastro e sul secondo nastro. Questa cosa qua è il riassunto di queste etichette. Su primo nastro c'è zero, scrivo 0 e vado avanti. Su secondo nastro c'è zero, lascio zero e vado avanti. Oppure sul primo nastro c'è uno, lascio uno e vado avanti. E sul secondo nastro c'è uno, lascio uno e vado avanti. È solo un modo compatto di scriverlo. Ok? In realtà lì è come se intendessi queste due condizioni. O leggo su entrambi zero e li avanzo entrambi. O leggo entrambi 1 e li avanzo entrambi. Però quando succede che sul primo c'è zero e sul secondo c'è uno o viceversa, che sul primo c'è uno e il secondo c'è zero, nessuna di quelle due etichette è valida e quindi noi quell'arco non possiamo percorrerlo. Ci bloccheremo e la macchina si blocca là. Siccome si blocca in uno stato che non è accettante, allora per noi, per la nostra definizione la macchina sta rifiutando, perché se si arresta in uno stato che non è in quelli della lista degli accettanti per noi la macchina sta dicendo di no. Ok, preferisco questa definizione perché sennò dovremmo avere uno stato apposta per il rifiuto e tutti gli errori devono puntare là e ci sono dei grafi fantasmagorici. Così è più semplice, mettiamo solo la condizione di accettazione. Whenever la macchina si ferma da qualche parte che non è accettante, allora la macchina rifiuta. Però è chiaro che lì avviene il confronto. Il confronto avviene nella modalità in cui è scritta l'etichetta. L'etichetta non permette cose strane. Questo è perché uso lo stesso simbolo alfa alfa. Se io lì avessi scritto alfa beta, no, e alfa e beta non sono vincolati in alcun modo, quindi possono essere lo stesso diversi, lì a quel punto la macchina può avanzare su tutto quello che c'è. Lì non starei controllando effettivamente niente. Quindi se avessi scritto per esempio eh beta e alfa dove beta controlla B. Eh, mi dici più mi di eh più di preciso che etichetta intende. Allora, eh inizialmente noi abbiamo appunto definito il linguaggio da cittare e inoltre abbiamo definito alfa casina 01. Yeah. Se io avessi scritto virgola, casina 01 e poi avessi risosto le etichette che abbiamo posto lì, però eh esempio metto eh quando passo eh la stringa B appunto utilizzo beta, mentre quando passo la stringa A utilizzo alfa. Toniamo per astratto che noi ci ritroviamo eh in una condizione in cui le due etichette che andiamo a analizzare utilizano sia alfa che beta. Eh sarebbe stato un errore perché appunto alfa e beta sono solo dei nomi che diamo ai simboli che possono apparire su un nastro. Cioè il fatto che io chiami beta i simboli ehm che io usi meglio il fatto che io usi il simbolo beta mentre ricopio su un nastro i simboli di B. Mi sembra di aver capito, non fa nessuna differenza se io quei simboli li avessi chiamati alfa. Cioè è solo un modo per compattare una cosa che senò sarebbe più lunga da scrivere. Tutto qua. Siccome io non voglio scrivere tutta la casistica, io uso questo simbolo alfa e dico, guarda, siccome sto usando alfa qui e alfa in questa posizione, in realtà io quello che ti sto dicendo che sul primo e sul secondo nastro ci deve essere lo stesso simbolo. può essere 0, può essere 1, può essere du, dipende un po' dall'alfabeto, però quello che intendo è che questo è un modo short, compatto, di rappresentare in realtà un insieme di etichette. Ok? il fatto che io in passato, no, nella nei passaggi precedenti i simboli che provenivano da beta in quel momento li stavo chiamando beta, non influisce in alcun modo sui passaggi successivi del fatto che quei simboli prima li avevo chiamati beta, perché a me il simbolo alfa beta ha un significato solamente quando usato nella stessa label, cioè il fatto che questo qua sia alfa e questo sia alfa non cambia, non significa niente, è solo un modo, cioè quel simbolo ha il significato solamente in quella etichetta. Tutto qui. Ultima domanda. Eh, ma se io è chiaro Sì, così però eh appunto sempre sia alfa che beta. Sì. Eh, se io avessi l'etichetta, appunto, sul nastro uno, utilizzo beta, scrivo beta e passo avanti. Sul nastro due, invece alfa, scrivo alfa, passo avanti. È corretto? Perché sia alfa che beta partendo nello stesso lumino, no? No, perché nel momento in cui allora lo scriviamo qua, lo distinguiamo con un colore, senò Ok? Allora, l'esempio che lei mi stava proponendo, se ricordo bene, è sul primo nastro c'è beta, lascio beta e vado avanti. Sul secondo nastro c'è alfa, lascio alfa e vado avanti. Corretto? Ok. Prendendo quello che succede in cucina. Sì. e alfa e beta sono simboli che provengono da 0 1. Questa cosa qui è un modo compatto di scrivere questo. Adesso i simboli alfa e beta sono nomenclatura che diamo a simboli che possono essere 0 o 1. Ok? il il fatto che alfa e beta in questa notazione specifica, poi negli esercizi successivi vediamo che noi possiamo legare cose. Se noi diciamo che alfa e beta non sono legati in alcun modo, questo qui è un modo compatto di scrivere questo. Sul primo nastro c'è zero, scrivo zero e vado avanti. Sul secondo nastro c'è zero, scrivo zero e vado avanti. Oppure sul primo nastro c'è zero, scrivo zero e vado avanti. Sul secondo nastro c'è uno, scrivo uno e vado avanti. Oppure sul primo nastro c'è uno, scrivo uno e vado avanti. Sul secondo nastro c'è zero, scrivo zero e vado avanti. Oppure sul primo nastro c'è uno, lascio uno e vado avanti. E sul secondo nastro c'è uno, lascio uno e vado avanti. In questo caso, se io avessi usato questa etichetta qui in Q5, sarebbe stato un problema perché a quel punto ci sarebbero stati questo qua e questo qua che erano fonte di errore. Ok? Ecco perché uso lo stesso simbolo, perché io voglio escludere la possibilità che la macchina possa computare su quei passaggi. Chiaro? È più chiaro? Ok. Chiaro per tutti? Ok. Così sappiamo che linguaggio stiamo parlando. Altro linguaggio, il linguaggio delle stringhe A, B, C, tali che A, B e C sono stringhe su 0 1+ and la lunghezza di A è maggiore della lunghezza di B che è maggiore della lunghezza di C. Ed inoltre la lunghezza di C è uguale alla lunghezza di Aunghezza di B. Ok? Quella cosa tipo valore assoluto quando lo facciamo su stringhe è la lunghezza della stringa. Ok? Questo alle volte sui libri potreste trovare questa. Date una stringa V. La sua lunghezza è questa. Ok? O l'uno o l'altro per noi va bene. Alrght. Quindi noi mo ci dobbiamo inventare un modo per riuscire a risolvere questa cosa qua. prossimo com'è. Ok, vi do qualche minuto per pensare come si può organizzare. Ja. Attimo, un attimo, lasciamo pensare un po' le persone. Un secondo, un secondo. Sì, sono minori stretti. Sì, sì, minori stretti. Cioè la stringa A deve essere strettamente più lunga della stringa B e la stringa B deve essere strettamente più lunga della la stringa C. Sono esercizi del cavolo, ma per impratichirci un po' con conteggi, verifiche di stringhe, eccetera, perché poi quando facciamo macchine non deterministiche facciamo roba un po' più sofisticata. Ok, lei vuole intervenire? Eh, yes, prego. Eh, potrei ricopiarmi il B su un secondo nastro e poi scorrere il primo su A e il secondo con 10 copiati e verificare che sul primo trovo cancello. controlla più o meno, perché se finiscono assieme, cioè vuol dire che la lunghezza è la stessa, eh, cioè p + c è a quindi sono sicuramente più piccoli. Ah ah ok, ok. Vedi se vuole andare dalla dall'altro lato su sulla lunghezza. Ok. Ok. E per controllare che le stringhe sono una strettamente più lunga dell'altra. Eh beh, se B C fa A sicuramente sono se vi sono delle due nulle sono più forte gli altri, però B e C potrebbero avere la stessa lunghezza. Ah ah però ci sta eh una una cosa una cosa che è un trucco è un trucco di ragionamento che ovviamente sui libri e sugli eserciziari non vi dicono mai, eh. Però immagino che ci avrete pensato a questa cosa, cioè non è che la soluzione del vostro collega non vada bene. La soluzione del vostro collega è un primo passo verso una soluzione corretta, cioè raramente si arriva a una soluzione alla prima botta. Quando leggete i libri, no? Poi soprattutto sulle dimostrazioni, vi accorgerete, dice "Ah, teorema, questo è lo statement, bla bla prova". E ve la leggete là, no? Cioè, chi è arrivato a dimostrare quella cosa non si è svegliato una mattina e ha detto si fa così. È generalmente frutto di prove, di trialsr, si vede se funziona, se funziona, ok, se non funziona si si capisce un po' dov'è la magagna, aggiustiamo e andiamo a bloccare. Per esempio, la soluzione del vostro collega è sostanzialmente corretta. ci dobbiamo semplicemente andare a inventare un modo per verificare che B sia più lunga di C. Ok? Sì. Eh, si risolve con un cazzo in cui copio anche C proprio Core e dopo aver letto A e secondo un altro inizio a leggere B e verifico che quando leggo in B alfa e arrivo alfa. Sì, sì. Qualsiasi cosa che funzioni. Adesso vi propongo una che ho io sottomano in maniera tale che sono sicuro che funzioni che ho verificato prima. Però il principio è lo stesso. Cioè cosa dobbiamo fare? Mi segno la lunghezza di A da una certa parte, mi segno la lunghezza di B da un'altra parte, verifico che la lunghezza di A è strettamente maggiore di quella di B. Poi verifico che la lunghezza di C è uguale alla differenza fra le due e poi verifico che C è più piccolo di B. Tutto qua. Ok. L'ordine in cui si fanno queste cose può essere vario, si può fare all'inizio, si può fare alla fine. L'importante è che la sequenza di tutte queste cose venga fatta in un qualche ordine. Ok? Pure i miei esercizi, eh. Allora, questi era vecchia roba. Allora, questi erano roba nuova che avevo preparato per oggi. Come vedete è pieno il cancellatore perché perché ci stavo provando e a quel Ah, ok, non funziona, cancello, si ripete. Ok, cioè, quindi non vi consiglio metodologico, non vi scoraggiate se al primo tentativo non ci riuscite, cioè si giusta. Ok? Sul libro, quando andrate a vedere le dimostrazioni, nessuno mai vi dirà quante volte ci ha provato prima di arrivare alla soluzione. Quando scrivi papers, no, e magari per fare un pezzo di una dimostrazione mi serve un mese, non ci scrivo lì, ci ho messo un dannatissimo mese per arrivare fin scrive direttamente la soluzione e la gente pensa "Wow! Chissà come l'ha pensata sta cosa. I che c'ho sbattuto la testa per settimane, quello è la cosa. Ok, quindi voglio è proprio tranquillo sbagliare, eh? Si aggiusta, si va avanti. Ok. Allora, la mia idea che vi propongo è sostanzialmente questa. Questo è il nostro mastro di input. C'abbiamo 00 1 cancelletto cancelletto Allora, tra i tantissimi modi per far funzionare le cose è che io su secondo nastro mi vado a piazzare la lunghezza di A. Quindi io metto tante X quanti sono i simboli di A. Su terzo nastro vado a piazzare la lunghezza di B. Ok? Questa cosa mi permetterà di fare un po' di verifiche, fare somme, differenze, eccetera. Tutto qua. Ci sono 1000 modi per fare questa cosa. Un qualsiasi modo che funziona va bene. Ok. Alright. Partiamo da Q0. Siamo in Q0. Allora, abbiamo che alfa appartiene a 0 Quindi sul primo nastro trovo alfa, lascio alfa e vado avanti. Sul secondo nastro trovo blank. Secondo nastro è vuoto all'inizio. Scrivo X e vado avanti. Vado in Q1 e faccio lo stesso lavoro. Trovo alfa, lascio alfa e vado avanti sul primo nastro. Sul secondo nastro trovo blank, scrivo X e vado avanti. Ok? Quando sappiamo che ci possiamo fermare? Quando troviamo un cancelletto. Quindi sul primo nastro c'è cancelletto, lascio cancelletto e vado avanti. E sul secondo nastro che facciamo? Cerano con nastro. Ok? In linea di principio potremmo fare quello che ci diceva, però siccome ci serve poi calcolare la differenza fra la lunghezza di A e la lunghezza di B in maniera tale che otteniamo la lunghezza di C, allora inizio a spostarmi la testina del secondo nastro sull'ultima X scritta, così posso iniziare a fare questa differenza. Ehm, senò, cioè, stavo pensando riscrivere sul primo nastro e tante C sul primo sul primo in modo tale che così se finché leggo X, se poi back che finisce C e trovo blank, allora per forza mi interessa. Partentemente dalla dalla lunghezza di B. Ah, ok. Sì, quello è un altro modo per farlo. Sì, sì, sì, sì. Ovviamente si può fare, eh. Ok, quindi eh perseguo in questo. Sul secondo nastro c'è blank, lascio blank e vado dietro. Ok, Q2. In Q2 iniziamo a leggere la stringa B. Ci aspettiamo almeno un carattere. Quindi, sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro inizio a cancellare le X. per poter eh fare questa differenza. Ok. Sì. Ah, invece di fare il ciclo da subito, ha detto aggiunge questo passaggio in più perché ci aspettiamo almeno un carattere. Avendo noi le definito A, B e C. Sì, sì, sì. Sì, sì, sì, sì. Quello giustamente si può fare, giustamente il vostro collega dice: "Nel momento in cui verifichiamo che A è più lungo di B e B è più lungo di C, se ho la certezza che questa relazione di lunghezza è valida e C ha almeno un carattere, ovviamente tutto il resto deve funzionare", giusto? Va bene? Eh, ok, ormai ci siamo. Secondo c'è X, scrivo blank e vado dietro e andiamo in Q3. Arrivato qua, facciamo la stessa cosa. Primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo c'è X, scrivo blank e vado dietro. Ok, quando ci fermiamo a Ah, un attimo, un secondo, un secondo. Qua dobbiamo iniziare a scrivere la lunghezza del DB. Quindi, sul terzo nastro c'è blank, scrivo X e vado avanti. Qui c'è blank, scrivo X e vado avanti. Ok, quand'è che ci fermiamo? Eh, ok. Fammelo. Questi qua vanno con questo. No, vabbò. Questi vanno su e questi vanno qua. Ok. Eh, quand'è che ci fermiamo? quando troviamo sul primo nastro cancelletto. Ok, quindi sicuramente è una prima condizione. Sul primo nastro trovo cancelletto, lascio cancelletto e vado avanti. Sul secondo che deve succedere? X potesse cioè sì, sul secondo nastro. Allora, sul secondo nastro c'era la lunghezza di A. Noi stiamo indietreggiando sulla lunghezza di A togliendo la lunghezza di B. Ok? Quindi a fine di questo giro sul secondo nastro ci sarà a - b. Ok? Però, siccome A deve essere più lungo di B, nel momento in cui finisce B, deve esserci una X residua sul secondo nastro. Quindi noi andiamo a verificare che sul secondo nastro ci sia rimasto qualcosa. Quindi c'è X, lascio X e sto fermo. Ok. Sul terzo nastro c'è blank. Lascio Blank e vado dietro. Mamma mia. Ok. Alright. Adesso ci manca da verificare C. Cosa dobbiamo fare per C? Dobbiamo semplicemente verificare che C è lungo tanto quanto le X del secondo nastro, perché sul secondo nastro è rimasto a - b. E il terzo nastro che contiene le B deve essere più lungo della lunghezza di C. Tutto qua. Ok? Quindi facciamo un passaggio sul primo nastro. Leggiamo il primo simbolo di C. Leggo alfa, lascio alfa e vado avanti. Sul secondo nastro c'è X, lascio X e torno indietro. Sul terzo nastro c'è X, lascio X e torno indietro. Andiamo in Q5. Questo va fatto, ok, per tutti i caratteri di C. Quindi, sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro c'è X, lascio X e vado avanti. Sul terzo nastro c'è X, lascio X e No, non è avanti quello, eh. Oplà, vado dietro. E qua vado dietro. Ok. Quando ci fermiamo? Quando uno blank. Sì. Quindi c'è blank, lascio blank e sto fermo. In due, in due ho blank, c'è blank, lascio blank e sto fermo. E su tre devo avere X, c'è X, lascio X e sto fermo. E accettiamo. Ok, abbiamo tempo. Altro esercizio e poi facciamo la pausa che più ne vediamo meglio è. In caso ce ne andiamo prima. Ok. Riconoscere il linguaggio L tale per cui abbiamo V w tale che W appartiene a 01. Ok, roba abbastanza semplice. Come possiamo farlo? Sì. Posso scrivere le tre WW sui tre nastri e faccio controllo se sono uguali e quando arriviamo al Sì, sì. Ok, quindi possiamo scrivere W su una su un nastro di appoggio. Potremmo utilizzarlo due volte così non dobbiamo riavvolgerlo. Quindi scriviamo w succ nastro. Dopodiché, superate il primo cancelletto, verifichiamo che su primo nastro e secondo nastro c'è la stessa cosa fino al cancelletto e poi dopo il secondo cancelletto verifichiamo che sul primo nastro e sul terzo nastro c'è la stessa cosa. Ok? Quindi molto semplice. Qualsiasi cosa che funziona va bene. Generalmente generalmente nessuno programma, cioè questa è la cioè quindi non è che c'è un modo migliore perché è un formalismo che noi utilizziamo adesso per praticirci su alcune cose e per iniziare a dimostrare alcuni risultati tipo la macchina universale, l'indecidibilità del linguaggio vuoto, ste cose così. Quindi ci serve una macchina di tuning. Di fatto nessuno programma mai macchine di tuning. Quindi per quanto concerne l'esame, visto che per noi è semplicemente un tour per studiare cose, la mia il mio criterio è qualsiasi cosa che funziona va bene, ok? Quindi 2 3 eh per me è la stessa cosa, cioè si prende se è corretto uno ed è corretto l'altro, si prende il massimo dei punti con uno, il massimo dei punti con l'altro. Ok? lineare. Ok. Co zero. Alri. Cosa facciamo? Quindi sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro alfa e avanti. Ok. Blank alfa e vado avanti. Su terzo nastro uguale uguale blank alfa e vado avanti. Ok. Quand'è che andiamo oltre? In questo caso abbiamo che W appartiene a 01 star e di conseguenza potrebbe essere vuoto. Ok? Quand'è che usciamo? Quando mettiamo? Quando incontriamo cancelletto, sul primo nastro c'è un cancelletto, lascio cancelletto e vado avanti. Secondo e terzo nastro dobbiamo prepararli per la computazione successiva, ok? Quindi abbiamo necessità di riavvolgere i nastri secondo e terzo. Quindi, nel momento in cui stiamo processando la prima stringa, arriviamo al cancelletto. Che facciamo? Dove si troveranno il secondo e il terzo nastro in quel momento? Sì, a terra alla fine di W. Alla fine delle copie di W sul secondo e su terzo nastro. Ma dove? Sull'ultimo simbolo di W o sul primo blank? Sul primo blank. Sul primo blank. Quindi, nel momento in cui incontriamo il cancelletto lì, che facciamo sul secondo e terzo nastro? Andiamo dietro. Quindi c'è blank, lascio blank e torno indietro. C'è blank, lascio blank. e torno indietro e andiamo in cuno. Ok, quindi qua completiamo il riavvolgimento. Sul secondo nastro c'è che c'è sul secondo nastro. Alfa. Vado alfa e torno indietro. E sul terzo? Uguale uguale perché c'è la stessa stringa. Ok. Qui avremmo pure potuto scrivere beta, tanto ce l'abbiamo scritto noi su un secondo nastro la stessa cosa. Cose strane non ne possono accadere, ok? Però siccome sappiamo che è la stessa stringa, li riavvolgiamo assieme, ok? Quand'è che ci fermiamo? Blank. Blank dove? Sul secondo e sul terzo. Sul secondo e sul terzo. Sul secondo c'è blank. Lascio blank e vado avanti. Sul terzo c'è blank, lascio blank e vado avanti. Guardate questa cosa qua. Ok? In tutto questo pezzo di computazione qui, il primo nastro non viene proprio menzionato. Che succede al primo nastro mentre siamo qua dentro? Niente, sta fermo perché non lo menzioniamo. Quindi l'implicito è che in tutte queste label qui e qui il primo nastro è leggo qualsiasi cosa, riscrivo quella stessa cosa e sto fermo. Ok? Come lo otteniamo? Non scrivendo niente. Alri? Quindi andiamo in Q2. Che dobbiamo fare qua? Cioè, continuiamo a leggere sul primo nastro. Yeah. E poi dobbiamo leggere la stessa cosa sul secondo. Ma andiamo avanti solo sul secondo, però o no? Attenzione, eh, il terzo Ah, ok. Ok. Perché detto vado avanti solo sul secondo, ma sul primo che fa? Ah, ok. Pensavo che il primo rimane fermo. No, no, no, no. A ah domanda per voi. Supponiamo di avere una etichetta così. Sul primo nastro c'è alfa, lascio alfa e vado e sto fermo. Sul secondo nastro c'è alfa, lascio alfa e vado avanti. Che significherebbe? due essere una ripetizione del simbolo dovrebbe potrebbe essere una ripetizione sempre lo stesso simbolo, sì, cioè sul secondo nastro quello che noi stiamo essenzialmente andando a verificare è che c'è sempre lo stesso simbolo, quello su cui ci siamo appiccicati sul primo nastro. Ok? In questo caso non è quello che vogliamo, quindi dobbiamo stare attenti a questa cosa. Ok? Ok. Quindi sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro c'è alfa, lascio alfa e vado avanti. Quand'è che ci fermiamo? Cancelletto e due. Primo nastro cancelletto. Trovo, lascio cancelletto e vado avanti. Sul secondo c'è blank, lascio blank e sto fermo. Andiamo in Q3. Dopodiché che dobbiamo fare? Stessa cosa. Primo nastro alfa alfa avanti. Terzo nastro alfa alfa avanti. Ci fermiamo. Quando sul primo nastro c'è cancelletto lasciamo cancelletto e stiamo fermi. Sul terzo nastro c'è blank. Lascio blank e sto fermo. Andiamo in Q4 e accettiamo. Ok. E scusi, non abbiamo cancell terza stringa? Eh sì, giusto. Qua è blank. Oplà. Blank. Blank. Ok. Chiaro per tutti? Che cosa succede al funzionamento di questa macchina? Se per esempio nell'ultimo pezzo di stringa in input, in questo qua, abbiamo che quella non è la stringa w ma è un VO differente. Che succede durante la computazione? Ferma contratto. Come si ferma in contratto. La macchina si inceppa qua a un certo punto si arresta in uno stato non accettante e quindi rifiuta. Ok, chiaro per tutti? Alright. 10 minuti di pausa. [Musica] Ok, vogliamo riconoscere A B a cancelletto B tale che A e B sono provengono da AB star e A è una sottostringa di B. Ok? Quindi l'insieme delle stringhe A B separate da un cancelletto tale per cui la stringa A sono entrambe definite su AT, quindi possono essere eventualmente vuote. La stringa A deve essere una sottostringa di B. Per sottostringa intendiamo che A può apparire dentro B in qualunque posizione, ok? Non all'inizio, non necessariamente all'inizio o alla fine. Queste può essere dopo un simbolo, può essere dopo tre simboli, dopo 10, eccetera, da qualche parte. Ok? Quindi, ad esempio, se abbiamo quindi è per esempio A B cancelletto B A B Noi abbiamo che questa è la porzione in cui appare la stringa. A, ok? E noi quella ce la dobbiamo andare a cercare. Ok. Sì. No, dire come Sì. Ah, ok. Ok. No, no, it's al Ok. È chiaro per tutti? La difficoltà di questo esercizio è che la stringa A all'interno della stringa B può apparire ovunque. Ok? Noi non lo sappiamo dall'inizio dove appare. Ok, prendetevi 20 secondi per pensarci, 30 secondi e poi studiamo. C'è qualche trucco? Non c'è nessun trucco, perché se si risolvesse con un trucco sarebbe una gran cosa, no? Quindi la prima domanda che ci possiamo porre è: "Ma esiste o no un trucco che ci semplifica la vita? questo. Ok. Il trucco c'è o il trucco non c'è? C'è un barbatrucco che ci risolve la questione. Sì. Ah! Ah! Eh, ipotizio io ricopio A e poi inizio a leggere B. Eh, ok. No, la mia domanda è io posso identificare a colpo sicuro la posizione di A in B con qualche trucco del cavolo? Dice Milla come ci risolve la questione questa cosa qua? Esiste o non esiste? Perché ci toglierebbe un po' le parate dal fuoco, no? Lo riuscite a intravedere questo fantastico trucco? No, possibile? M No, no, lo sapete perché non lo intravedete? Perché non c sta. Ok, non c'è nessun trucco che ci ci risolve la questione. Qua dobbiamo fare una cosa molto semplice. La macchina che abbiamo a disposizione è una macchina scema, come tutti i computer. Che dobbiamo fare? Prendiamo A, ce lo ricopiamo sul secondo nastro. Dopodiché andiamo a verificare se A parte dalla prima posizione di B. Se va bene accettiamo. Seò proviamo dalla seconda posizione di B. Se va bene accettiamo, senò partiamo dalla terza posizione, poi dalla quarta, dalla quinta, eccetera, fino a quando troviamo se c'è un punto da cui parte A dentro B. Se lo troviamo a un certo punto transiamo verso la stato accettate e diciamo yes, altrimenti ci incertiamo da qualche parte. Ok. Sì. Ehm, cioè io comunque mentre che leggo a a una cer potrei non avere eh il match, no? Sì. A quel punto cosa cosa sa? Cioè devo riavvolgere deve riavvolgere cosa? Eh, devo riavvolgere A perché sarà andato avanti su A. Eh, attenzione perché Sì. deve riavvolgere B perché se lei Allora, ragioniamo assieme su questa cosa perché è un principio di funzionamento di questa macchina. Ok? Allora, devo trovare un controesempio. M non mi viene un controesempio, ci devo pensare più attentamente. Allora, la questione è questa. Qua abbiamo B e qui abbiamo A. Ok, adesso io potrei matchare, supponiamo che sto matchando A e B a questo livello. Ok, questi li ho già verificati e non vanno bene. Ok, supponiamo che sto matchando A e B partendo da questa posizione. Ok? Allora, quello che può accadere è che mentre sto matchando A e B, l'errore si verifichi qua. Ok? Quindi in corrispondenza l'errore su A sarebbe questo. Se noi riavvolgiamo A per ripartire dall'inizio, ok? Ma non riavvolgiamo B, cioè lasciamo la testina di B ferma qua, noi stiamo perdendo tutta questa zona qua e se la partenza di A è qua dentro, che facciamo? Ce la siamo persa. Quindi noi non dobbiamo riavvolgere B, ma di una posizione in meno in maniera tale che il check successivo avviene dalla cella successiva. Ok? È chiaro? Cioè, quindi nel momento in cui il principio sarà questo, prendo A dal primo nastro, la copio sul secondo nastro, dopodiché la provo ad appiccicare sotto B partendo, che ne so, dal primo simbolo. Che faranno le testine? Guarderanno B sul primo nastro, A sul secondo nastro. Sono uguali i simboli, andiamo avanti. Sono uguali i simboli, andiamo avanti. Sono uguali i simboli, andiamo avanti. Sono uguali i simboli, andiamo avanti. Sono uguali i simboli, no? Allora, noi che cosa sappiamo? Sappiamo che dobbiamo far ripartire il test su primo nastro da una casella successiva, cioè dalla seconda. Come lo possiamo fare? Ci sono 1000 modi. Un modo è questo. Nel momento in cui ci troviamo di fronte alla differenza dei due simboli, indietreggiamo il il primo nastro di uno. Ok? Poi li indietreggiamo assieme. Così che faccio? No, indietreggio. Il secondo. Infatti mi sembrava str. Allora, troviamo i due simboli che sono differenti. Indietreggio, il secondo di uno. Andiamo indietro assieme. Quando arriviamo al bordo, guardate la differenza. Ritorniamo avanti e c'abbiamo la testina sul primo nastro sfalzata di una posizione, che è quello che ci serve. Ok? Quindi adesso dobbiamo ricodificare questa strategia all'interno di una macchina di touring. Non è molto difficile, però è un esercizio importante perché dobbiamo prendere pratica col fatto che se la macchina di Turing sta computando e a un certo punto si accorge che c'è stato un errore, deve andare a provare un'altra cosa. Questo è un esercizio che ci serve perché quando introdurremo le macchine non deterministiche gli potremo fare vari trucchetti che ora non possiamo. Ok? Chiaro per tutti? Domanda? Avevo una domanda? No. Sì. Se una volta che abbiamo letto che A è detto B, ci interessa completare il controllo che B sia praticamente detto A una sequenza di A. Sì, sì, sì. Poi alla fine dobbiamo verificare che B non ci abbia spazzatura strana, tipo un cancelletto che ricompare eccetera. Questo è un controllo finale che facciamo. Però il nocciolo della questione qua è individuare dove inizia A dentro B. Se A inizia dentro B. Ok? Alrght. [Musica] Q0. Ok, quindi ricopiamo. L'idea è ricopiamo A sul secondo nastro. Quindi sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro c'è blank, scrivo alfa e vado avanti. Facciamo questo fino a quando? cancelletto sul primo e sul secondo blank. Lascio blank e torno dietro. Riavvolgo il secondo nastro perché dobbiamo posizionarci con la testina all'inizio di a copiato sul secondo nastro. Ok? Quindi sul secondo nastro c'è alfa, lascio alfa e torno dietro. A un certo punto sul secondo nastro c'è blank, lascio blank e vado avanti e sono pronto a giocare. Ok. M ok, vi propongo un'altra soluzione invece perché ci serve per dopo. Ok, sorry. È molto simile, eh? Ok. Perché distingo due casi. Se ho letto qualcosa sul primo nastro o meno, quindi sul secondo c'è alfa, lascio alfa. Vi spiego dopo perché. Q2 sul secondo c'è alfa. Ah, dov'è alfa? E torno dietro. A un certo punto mi fermo. Sul secondo c'è blank. Lascio blank e vado avanti. Q3. Ok. Mi serve questa cosa qua per una cosa che vediamo dopo, ok? Perché a potrebbe essere vuota e quindi devo poter distinguere se in A ho scritto qualcosa o in A non ho scritto niente mentre ricopiavo A. Quindi mi faccio dopo ramo. Questo primo ramo è in A. Ho scritto qualcosa. Ok? Poi ci sarà il caso che esce fuori da qua in A non ci stava niente e quindi poi ce la gestiamo. Ok? Era un pezzo che mi serviva. Ok. Quindi dobbiamo iniziare a verificare, no, che su primo e secondo nastro ci sia la stessa stringa. Ok? Quindi abbiamo la testina del primo nastro in posizione dopo il cancelletto, la testina sul secondo nastro in posizione sul primo simbolo della copia di A che sta sul secondo nastro. Ok? Allora, cosa c'eravamo inventati? Queste testine vanno spostate assieme e verificare che sia tutto ok. Ok. Alright. Quindi su primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro che c'è? Alfa. C'è alfa. Lascio alfa e vado avanti. Ok. Supponiamo che fili tutto liscio. Ok, quindi adesso dovremo verificare un po' di cose. Fila tutto liscio, c'è un problema da qualche parte, quindi va analizzato un po' per caso supponiamo che fili tutto liscio. Che succederà se fila tutto liscio? Arrivo blank al secondo. Arrivo blank al secondo. Quindi qua condizione di uscita. Sul secondo nastro c'è blend. Lascio blank e sto fermo e vado per esempio in Q4. Ok? Dopodiché che dobbiamo verificare? Dobbiamo semplicemente vedere che non ci sia spazzatura sulla parte rimanente di B, cioè che non ci sia un cancelletto in fondo, per dire, nel senso, ci stanno solo simboli A e B e a un certo punto a un certo punto ci sarà blank e lì poi accettiamo. Quindi sul primo nastro c'è alfa. Lascio alfa e vado avanti. Poi sul primo nastro c'è blank, lascio blank e sto fermo e vado qui e5 accetto. Ok, questa è la via. In caso Li vedete? Li vedete? Sì. Ok. Questo è il pezzo di computazione che si occupa di gestire il caso quando tutto fila liscio. Ok? Però qui noi abbiamo scritto che stiamo verificando il contenuto del primo nastro col contenuto del secondo nastro. Se abbiamo beccato il punto sbagliato di B, cosa succederà? A un certo punto si blocca. E quindi che dobbiamo fare? Dobbiamo tornare indietro. Come ci si accorgiamo che ci non ci va bene quel posto? Alfa, ma sotto alfa. Come? Scusi. Leggo alfa nel primo ma sotto non ho alfa. E sotto abbiamo qualcosa di diverso. Ok. Quindi la condizione è Sì, come no? La condizione è questa. Sul primo nastro leggo alfa, lascio alfa, poi vedremo la testina. sul secondo nastro c'è beta e lascio beta e poi vedremo la testina. Ok? In questo caso noi dobbiamo specificare che cosa sono alfa e beta. Ok? Alfa e beta appartengono all'insieme 0 1 e in più abbiamo che alfa è diverso da beta. Ok? che era 01 o AB? AB. A B. Vedete? Sì, più o meno qua. Ah, bello basso. Ok. M Ok. E quindi a un certo punto abbiamo detto che stiamo avanzando le testine. Se fila tutto liscio, qui arriviamo al bianco e avanziamo questo e ciao. Se invece c'è un problema, li avanziamo assieme, arriviamo al punto di errore, avremo alfa su uno e beta sull'altro, il che significa che ci sta A sopra e B sotto oppure B sopra ed A sotto. Ok? Che facciamo? Abbiamo detto per creare lo sfalsamento di una cella teniamo questa testina ferma. Questa la spostiamo di uno, poi le indietreggiamo assieme, le avanziamo assieme e ci troveremo magicamente alla testina del primo nastro una posizione in avanti. Ok? Quindi sul primo nastro c'è alfa. Lascio alfa e sto fermo. Sul secondo nastro c'è beta. Lascio beta e vado indietro. Ok. Q3, Q4, Q5. Q6. Ok, dopodiché li dobbiamo avvolgere. Alri, cosa abbiamo sul primo nastro? Il nei principio può essere tutto scombinato ora, eh, perché li abbiamo sfalsati di uno. Erano la stessa cosa fino a quel punto, l'abbiamo sfalsato di uno. Ora che tornano indietro assieme ci può essere la qualunque. Ok? Come la scriviamo sta cosa? Quindi sul primo nastro troviamo alfa. Lasciamo alfa e torniamo dietro sul secondo nastro. Mh gamma. Ok. Ci serve un altro simbolo. C'è gamma, lascio gamma e torno dietro. E quindi insieme al resto c'è gamma. Gamma alfa e beta. Qua mo lo vedete l'ho aggiunto alla leggenda. Dal gamma alfa e beta sono simboli su AB. Abbiamo un vincolo fra alfa e beta che alfa è diverso da beta. Gamma non ha vincoli né su alfa né su beta. Ok? In questo modio, dov'è? Qua. Alright. In questo modo qui possiamo indietreggiare le due testine assieme. Come facciamo a sapere che siamo arrivati alla fine? Blank sul secondo. Blank sul secondo. E andiamo qua. Quindi sul primo lo vedremo. Sul secondo c'è blank. Lascio blank e vado avanti. E sul primo alfa, cioè alfa. Lascio alfa e vado avanti. Ok. Alright. Quindi questo pezzo di macchina, stiamo andando veloce. Questo pezzo di macchina si occupa da un lato di verificare che la stringa A appaia dentro la stringa B a un certo punto. Ok? Se ci fila tutto liscio prendiamo questo ramo. Se non fila tutto liscio prendiamo quest'altro. E il trucco lì è che dobbiamo provare tutte le possibili combinazioni. Non ci possiamo esigere da questa cosa. Ok? Chiaro come funziona? Ultima cosa, se A è vuota, se A è vuota, per definizione la stringa vuota è sottostringa di qualsiasi altra stringa. Quindi se A è vuota, dobbiamo accettare. Come lo facciamo? Come lo aggiungiamo a questo pezzo? Un attimo. Sì, finisci Q1 e Q4. Sì, la cera secondo nastro è vuoto. Yeah. Però, prof, da Q1 noi abbiamo giicato che abbiamo letto un file oppure non necessariamente. Per uscire da Q1 l'unica garanzia che dobbiamo avere è che ci sia un cancelletto. Se non abbiamo letto niente lì all'uscita noi avremo che, cioè dopo questo passaggio qua, se non avevamo scritto niente sul secondo nastro, sul secondo nastro andando indietro ci sarà ancora niente, ok? Quello ci permette di stabilire che questa è la condizione di accettazione, ok? in caso di stringa a vuota, chiaro? Noi ci colleghiamo a Q4 perché in Q4 in Q4 noi dobbiamo verificare che la stringa W sia qualcosa di no B la stringa B sia qualcosa di sensato e non ci siano cancelletti in fondo o cose strambe, tipo compare un altro cancelletto, altri caratteri eccetera. Ok? Chiaro? Quindi chiaro per tutti? A che ci servirà questo esercizio? a fare esperienza diretta che in queste circostanze quando noi non possiamo sapere da principio una certa cosa, noi la dobbiamo testare. In caso di errori torniamo indietro e via. Ok? Questo esercizio poi lo riprenderemo con macchine di touring non deterministiche dove scopriremo che insomma con il non determinismo si possono fare cose un po' più furbe. Ok? Altro esercizio. Facciamo questo. L = V tale che W appartiene a 01. 01 Plus credo sia. Sì. Ok. Prendetevi qualche minuto per pensare, perché questo sembra un po' una gran rottura di balle, no? Come facciamo a sapere dov'è il bordo fra la fine della W e la ripetizione della doppia V? Non tirate a indovinare, pensateci un attimo, perché un modo a forza bruta sarebbe provare tutte un attimo tutte le possibili combinazioni, no? Dice magari allungo uno, magari allungo due, magari allungo tre. Ok, allora pensateci un pochino. Già un po' di persone in coda. 2 + tre. Ok, non prendo più in coda un attimo. Lasciamo il tempo agli altri pensare. Ce facciamo tre. [Musica] Ok, più o meno avete un'idea. Ok, lei è il primo, mi ricordo. No, avevo sempre. Ah, ok. Sullo stesso nastro. Come posso avere due testini sullo stesso nastro? No, allora posso ricopiare la prima e poi ricomincio entr, cioè mi riporto. Eh, lei deve decidere quanto pezzo della stringa input è la prima doppia B. Lei non ha una separazione, non è B cancelletto B, non è W cancelletto B. Non abbiamo una separazione. Come facciamo a stabilire? Dopo nel secondo nastro contenitore del primo. Ah, poi mi riporto entrambi all'inizio. Sì. Il primo lo scorro di un di un carattere, il secondo di due ogni volta. Quando nel secondo sono arrivato al blank sono a metà. Ok. È un approacho. Lei cosa suggeriva? Eh, dobbiamo fare Allora, adesso proprio però dobbiamo fare un po' avanti e indietro per due stati, cioè noi facciamo al fine di fare cosa? Qual è l'obiettivo? Eh, l'idea è che io all'inizio magari fuori. Ok. Ma a parte la procedura nello specifico a lei che informazione serve? Cioè a noi serve una sola informazione la lunghezza a no a noi serve cioè devo sapere se lì tutta lunghezza pari che mi serve la metà della lunghezza. Ok? Questa è l'informazione che ci serve. Ci serve la metà della lunghezza dell'input. Ok? Una volta che conosciamo quant'è la metà della lunghezza dell'input, se l'input è di lunghezza dispari, rifiutiamo perché, insomma, non va. Ok? Noi dobbiamo sapere se siete in tanti un secondo, eh dobbiamo sapere quant'è la metà della lunghezza dell'input. Ok, c'era lei? Sì. Allora, appunto, in base a quello che collega lei, eh gioco sulla metà delle dell'input e per far ciò, personalmente eh giocherei sullo sfasamento delle destine, ovvero che eh inizialmente le due testine partono lo stesso punto, poi però su eh una delle due testine passo prima avanti. Ogni volta che faccio un passo avanti, la seconda testina si sposta esponenzialmente, quindi la prima assumo sfasamento di uno. Ah, già il secondo passo siamo al quarto spasamento. È difficile da calcolare, cioè c'è un modo più semplice. Lei poi c'è lei. Ok. Io farei che sul secondo nastro copio, cioè scrivo qualcosa in due letture. Sì. Alla prima nota così. La terza no. Sì. Facciamo così, ci leggiamo un simbolo sul primo nastro e scrivo x. Ci leggiamo un simbolo sul primo nastro e non scriviamo niente sul secondo. Un simbolo sul primo nastro scrivo x. Un simbolo sul primo nastro non scrivo niente. Quindi un simbolo sì, un simbolo no. Noi scriviamo qualcosa che deve affinire sul secondo nastro. Ok? In questo modo noi possiamo pure valutare al termine di questo cicletto se la lunghezza del primo nastro era pari o dispari. Se è pari continuiamo a fare quello che ci serve. Se è dispari ci blocchiamo da qualche parte e rifiutiamo e una volta che sappiamo quant'è la la metà della lunghezza dell'inputamo. Sì, eh. R rimpiazziamo tutte le x con le lettere della prima stringa. Sì, sì. Poi resettiamo la la seconda stringa a quando finiscono le x e vediamo se combatto. Sì. Ok. Cioè questa strategia ce ne stanno tante altre. Va benissimo. Ok. Verò il trucco qui è invece di andarsi a sbattere come nell'esercizio precedente, ok? A provare tutte le sante possibili combinazioni di quanto deve essere lunga questa w B. Quello che possiamo fare lì era l'intizione che dovevamo avere. Ok? È vero che abbiamo una macchina deterministica, però sappiamo dividere per due, quindi ci prendiamo la metà della lunghezza della stringa di input. E noi una volta che sappiamo quanto vale vale 5, vale 7, noi ci prendiamo i primi cinque o sette simboli sul nastro, noi sappiamo che quello è W e poi controlliamo che il resto sia uguale a quello che ci siamo selezionati. Chiaro per tutti? Avevo visto una mana sì che nel primo nastro sono già nel fondo, lo posso ricopiare doppio al contrario. Dici per risparmiare tempo puoi farlo. Sì, sì, sì. L'importante è che funzioni, perché se funziona va bene, ok? Sì, l'importante è non incasinarsi, ok? Tutto qua. Però va benissimo, eh, se riesce a a gestire la cosa, perché no? Alrght. Ok. Allora, quindi l'idea è che abbiamo 0 1 1. Ok? L'idea questo è il primo nastro. Sul secondo nastro quello che noi facciamo è che ci andiamo a scrivere la lunghezza, la metà della lunghezza dell'input e come suggeriva il vostro collega, un modo molto semplice è questo: leggo un carattere, scrivo una x, leggo un carattere, non scrivo niente. Leggo un carattere, scrivo x, leggo un carattere e non scrivo niente. E così vado avanti. Ok? Alla fine io sul secondo nastro avrò un numero di x pari alla metà della lunghezza della stringa di input. Ok? Questo è lo trucco Q0. Sul primo nastro leggo alfa, lascio alfa e vado avanti. Sul secondo nastro c'è blank, scrivo X e vado avanti. Vado in Q1. Dopodiché devo saltare un carattere su primo nastro senza fare niente sul secondo. Quindi su primo nastro c'è alfa, lascio alfa e vado avanti. Dopodiché, quindi questo qui è simbolo di posto dispari. Nel simbolo di posto dispari scrivo una X. simbolo di posto pari, non faccio niente. Al ritorno, questo è il simbolo di posto dispari. Quindi sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro c'è blank, scrivo X e vado avanti. Ok? Quand'è che mi fermo? Sì, non possiamo farlo direttamente tra q0 e q1 questo passaggio, visto che facciamo la q ci serve ci serve questo è più ci serve almeno una cosa senò sì si però si poteva fare là. Ok, quindi prendo un simbolo, lo marco, prendo un simbolo, lo smarco, non ci faccio niente. Uno sì, uno no, sì, uno no. Quant'è che ci fermiamo? Quindi sul primo nastro leggo blank, lascio blank e sto indietro e vado dietro. Sul secondo c'è blank, lascio blank e e vado dietro. Ok, a quel punto noi dobbiamo indietreggiare tutto. Ah, questo qua. Vado vado dietro. Questo è Q3, quindi mi riavvolgo, dovrò riavvolgermi il secondo e il primo nastro. Adesso in quale ordine lo faccio? Poco conta. Posso fare prima il primo e poi il secondo, prima il secondo e poi il primo. L'importante è farlo. Quindi sul secondo c'è x, lascio x e torno indietro. Fino a quando sul secondo c'è blank, lascio blank e vado avanti e vado in Q4. Dopodiché sul primo c'è alfa, lascio alfa e torno dietro fino a quando sul primo c'è blank. Lascio blank e vado avanti e sono in Q5. Ok. Alright. Adesso noi dobbiamo cosa cosa dobbiamo fare ora? Qual era la strategia che avevamo in mente? Sì, cioè adesso finché leggo delle Ok, un attimo, un attimo. In che condizioni siamo al momento? Adesso siamo all'inizio di tutti e due i di tutto il mondo. Ok. Sì. Quindi sul primo nastro il sim abbiamo la testina sul primissimo simbolo, sul secondo nastro abbiamo la testina sulla primissima X. Che facciamo? per quante sono le x. Ricop l'input per quante sono le x sul secondo nastro e ad esempio le mettiamo sul terzo nastro. Possiamo fare quello che vogliamo. Ok. Scusate Q3 con Q3. Ah, sì, sì, sì, sì, sì. Questa qua. Yes. Grazie. Ok. Alright. Vediamo come vedete là. Vedete? Ok, quindi sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul secondo nastro c'è X, scrivo X e vado avanti. Tu sul terzo nastro c'è blend, scrivo alfa e vado avanti. Ok. Quand'è che mi fermo? Arriva blank al secondo. Quando arriva blank al secondo. Sul secondo c'è blank, lascio blank e sto fermo. Sul terzo c'è blank, lascio blank e torno dietro. Siamo in Q6. E qui che facciamo? Sul primo nastro? Qua, qua, qua, in questa etichetta dobbiamo dire qualcosa su per il primo nastro, no? Primo nastro lo molliamo là dov'è, perché deve rimanere in mezzo al mare, in maniera tale che lo ripegliamo da là e vediamo che ci sia dopp. Ok, quindi sul terzo nastro c'è alfa, lascio alfa e torno dietro, mi fermo quando sul terzo nastro c'è blank, lascio blank e vado avanti. Q7. A quel punto che dobbiamo fare? Così vedete? Q7. Che facciamo in Q7? Come? Confrontare 1 e 3. Confrontiamo 1 e 3. Quindi sul primo nastro c'è alfa, lascio alfa e vado avanti. Sul terzo nastro c'è alfa, lascio alfa e vado avanti. Quand'è che ci fermiamo? Blank di chi? Di entrambi. Di entrambi. Sul primo nastro c'è blank. Lascio blank e sto fermo. Su terzo nastro c'è blank, lascio blank e sto fermo. Andiamo in Q8 e accettiamo. Chiaro per tutti? Chiaro come funziona? Ok. C'ho un esercizio carino, ma non abbiamo il tempo, quindi ve lo lascio e ci pensate da soli. il linguaggio delle stringhe W cancelletto A tale che W e A appartengono a 01+ ed inoltre A è uguale a W oppure A è ugale. 5 minuti non ci basterebbero per guardarlo assieme. Esercitatevi un po' a casa, ok? Se doppindromo è accettata. Se do V palindromi è accettata, però tu devi accettare, si deve accettare qualsiasi sia dalla doppia B, non solo se palindro. Sì, l'importante è che A sia o writta o dopp al rovescio. Però questo non lo si può sapere dall'inizio, così deve vedere in corso d'opera. Ok, grazie mille. Buona serata. [Musica]