TESI :
Se
S (
S=
s0
s1 ...
sn)
NON è una sottostringa di
S' e
G è il grafo generato
da
S' (seguendo l'
[algoritmo di costruzione del grafo]),
allora
G NON accetta
S.
DIM :
Se
S non è sottostringa di
S' allora esiste un
j tale che:
s0 s1 ...
sj
è sottostringa di
S'
ma
s0 s1 ...
sj+1
non è sottostringa di
S'
Dal
[teorema 0] si ha che
s0 s1 ...
sj
è accettato da
G.
Dal
[lemma 1] si ha che esiste unico il percorso
N0 N1 ...
Nj
che accetta la stringa
S.
Tutti i cursori che partendo da
N0 (=
STARTS[s0])
con from=
s0 percorrono
j-1 nodi
con label nell'ordine
s1 s2 ...
sj
passano per gli stessi archi, quindi quando raggiungono
Nj
hanno lo stesso campo from=
f.
N0 N1 ...
Nj
Nj+1, con
Nj+1.label=
sj+1
sono un percorso (essendolo
N0 N1 ...
Nj)
solo se
Nj e
Nj+1 sono
collegati da un arco
L.
Un arco
L con questa caratteristica può essere diretto o laterale,
iniziamo a considerare l'ipotesi che esso sia laterale.
L, per collegare lateralmente
Nj e
Nj+1
in relazione ad un cursore con from=
f, deve avere
L.from=
f, ma tale arco esiste solo
se un cursore con from=
f si è trovato in
Nj
ed il carattere letto è stato
sj+1.
Ma dall'osservazione 1 un cursore su
Nj
individua univocamente un percorso, nel nostro caso formato da nodi con label
s0 s1 ...
sj.
Non essendo
s0 s1 ...
sj+1
sottostringa di
S', tale sequenza di lettere non si presenta mai durante
la creazione di
G e quindi non esiste un
L laterale che collega
Nj ad un
Nj+1
con
Nj+1.label=
sj+1
in relazione ad un cursore con from=
f.
L non può essere laterale, se esiste allora deve essere diretto.
Denominando
Li l'arco che collega i nodi
Ni e
Ni+1
nel percorso
N0 N1 ...
Nj
(percorso la cui esistenza è garantita dal dal teorema 1 in quanto la sequenza
s0 s1 ...
sj
è accettata da
G), considero l'arco
Lk,
0<=
k<
j, tale che
Lk sia
laterale e non esista un altro arco
Lk' laterale
con indice
k' maggiore (ma minore comunque di
j, tenendo conto che
Lj è
L).
Lk deve esistere altrimenti significherebbe avere un percorso
N0 N1 ...
Nj+1
formato da soli archi diretti, il che è falso perchè deriva banalmente
dall'algoritmo di creazione del grafo che ciò può avvenire se e solo se
la sequenza
s0 s1 ...
sj+1
compare in
S', falso per ipotesi.
In pratica il percorso
Nk+1 Nk+2 ...
Nj
Nj+1
è formato da soli archi diretti, quindi significa, come banale deduzione
dell'algoritmo di costruzione del grafo, che la sequenza di caratteri
sk+1 sk+2 ...
sj
sj+1 è presente in
S'.
Un cursore che raggiunge
Nk+1 dopo aver percorso
N0 N1 ...
Nk
partendo da
N0 con con from=
s0
può avere un unico possibile campo from=
f' (partendo con
from=
s0 e seguendo forzatamente
la sequenza di archi
L0
L1 ...
Lk-1).
Ma l'esistenza di
Lk laterale percorribile da
cursori con from=
f' posto sul nodo
Nk
che porta a
Nk+1
è possibile solo se durante la creazione del grafo un cursore con
from=
f' si è trovato su
Nk
e ha incontrato il carattere
sk+1.
Ma dall'osservazione 1 un cursore su
Nk
individua univocamente un percorso, nel nostro caso formato da nodi con label
s0 s1 ...
sk.
A quel punto per generare
Lk laterale
è stato passato
sk+1 e quindi si
deve essere incontrata in
S' la sequenza
s0 s1 ...
sk
sk+1.
La presenza di un percorso
Nk+1 Nk+2 ...
Nj
Nj+1 diretto significa però che dopo aver incontrato
s0 s1 ...
sk
la lettura di
S' è proseguita non solo con
sk+1,
ma con
sk+1 sk+2 ...
sj
sj+1 e quindi
s0 s1 ...
sj
sj+1
deve essere presente in
S', il che è falso per l'ipotesi e quindi
L
non può essere neanche diretto, quindi non esiste.
E quindi non esiste un percorso
N0 N1 ...
Nj+1,
Ni.label=
si,
N0=
STARTS[s0],
per
C posto su
N0 con
C.from=
s0.
Quindi dalla definizione 2
G NON accetta
S.