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
1
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
0 1
cancelletto
1.
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
1.
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, 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]