I codici (a lunghezza variabile) sono stati considerati da Shannon verso la fine degli anni ’40 e successivi contributi furono dati da Schützenberger, Kraft, Sardinas, Patterson, McMillan. Un codice è un insieme di parole su un alfabeto finito e che è accettabile nella trasmissione dell’informazione: giustapponendo tali parole si ottengono messaggi che possono essere decifrati univocamente, ossia senza ambiguità.
Le proprietà di decifrabilità unica e di decifrabilità finita sono centrali della Teoria dei Codici. Esse formalizzano se un messaggio codificato può essere decodificato in maniera non ambigua, se tale decodifica è possibile senza prima ricevere l’intero messaggio. Sardinas e Patterson nel 1950 hanno fornito una condizione necessaria e sufficiente perché un insieme sia un codice, che nel caso di insiemi regolari, e quindi anche finiti, si trasforma in una proprietà decidibile.

Capocelli e Hoffmann hanno disegnato un algoritmo per testare l’univoca decifrabilità di un insieme di parole basato sul test di Sardinas e Patterson. Consiste nel costruire un grafo R(C) in base all’insieme delle parole C specificato e nell’esplorare questo grafo attraverso una ricerca in ampiezza (BFS) per determinare l’esistenza di un particolare percorso da un insieme distinto di vertici ad un vertice che rappresenta una parola di codice. Il grafo consente di catturare anche altre proprietà dell’insieme di parole. Che sono il ritardo di decifrazione e la sincronizzazione.

Il primo passo dell’algoritmo, prevede la costruzione di una Pattern Matching Machine utilizzata in generale per individuare in una stringa testuale le occorrenze dei patterns forniti in input. L’implementazione della Patten Matching Machine è stata effettuata seguendo l’algoritmo di Aho-Corasick; L’ultimo passo consiste nell’effettuare una ricerca in ampiezza (BFS) sul grafo R(C) per trovare almeno un cammino non banale dai vertici di un insieme S(C), contenente i vertici che rappresentano parole che siano prefissi di altre parole dell’insieme C, a vertici che rappresentano parole dell’insieme C. Dopo aver verificato che l’insieme delle parole C sia un codice, si passa alla verifica della decifrabilità finita e della sincronizzazione. Un codice ha decifrabilità finita se sul grafo non esistono cicli dai vertici di S(C) a vertici in C; mentre la proprietà di sincronizzazione è provata se il grafo R(C) risulta essere aciclico. La verifica di entrambe le proprietà è stata effettuata sfruttando il teorema che afferma che un grafo è aciclico se e solo se una visita in profondità (DFS) sul grafo non produce archi all’indietro, ossia che connettono un vertice ad un suo antenato.

Il progetto realizzato in Java 1.4 ha seguito le linee guide di tale algoritmo. A completamento si è prodotto un output grafico visualizzando le fasi salienti dell’algoritmo di decisione. Il progetto è stato sviluppato utilizzando l’ambiente di sviluppo Java Eclipse; si tratta di un framework basato su un sistema di API pubbliche e di plug-in che fornisce funzionalità testuali (editor, debug, ecc…) e grafiche.