Come si sa in informatica è impossibile dimostrare la correttezza formale di un programma. Se ne può solo dimostrare la non correttezza trovando degli errori. Il sistema comunque è stato a lungo testato, e molti bug sono stati trovati e risolti. A volte è risultato molto difficoltoso riuscire a scovare cosa non funzionava perchè alcuni malfunzionamenti si presentavano soltanto eseguendo il programma da un browser, mentre eseguendo con l'interprete java tutto funzionava alla perfezione. Alla fine si è scoperto che si trattava dell'uso di alcuni metodi che erano stati introdotti a partire dalla versione jdk 1.2, e che quindi il browser non riconosceva e semplicemente non eseguiva (senza dare nessun errore).
Dato l'utilizzo di java il sistema che è stato ottenuto non è certo al top dell'efficienza. D'altra parte la lentezza del programma non è dovuta soltanto al fatto che Java sia un linguaggio interpretato, ma anche al fatto che tutto lo sviluppo del software è stato prevalentemente impostato seguendo uno stile funzionale, il che, come si sa è computazionalmente più costoso rispetto ad una corrispondente versione iterativa. Da questo punto di vista quindi il programma è certamente ottimizzabile, ma d'altra parte questo non era lo scopo del progetto.
Un'altra nota va spesa riguardo all'implementazione della risoluzione dei programmi prolog, per le qualei come detto si è utilizzato un thread. In particolare si è implementato il valutatore con un oggetto derivato dalla classe Thread di java, e si sono usati i metodi suspend, resume e stop. Questi metodi ora sono considerati deprecati dal jdk perchè possono essere causa di deadlock. In questo caso comunque si è preferito per semplicità usare questi metodi anzichè introdurre dei costrutti più complessi, anche perchè in questo caso non si presentavano particolari problemi di sincronizzazione tra thread, dato che c'era un solo thread di risoluzione attivo alla volta.
Infine, un altro limite dell'implementazione è dovuto alla gestione della base di conoscenza per il prolog, per la creazione della quale ad ogni richiesta di valutazione di un goal si ricostruisce da capo la rappresentazione interna delle clausole, mentre magari sarebbe stato opportuno separare la fase di creazione del data-base da quella di valutazione di un goal.
In ogni caso la realizzazione di questo progetto ha messo in evidenza la validità dell'impostazione basata sul concetto di espressione simbolica, infatti abbiamo potuto constatare la possibilità di estendere il sistema al fine di allargare il nostro dominio, grazie alle potenzialità di Java. La cosa è risultata un po' difficoltosa nel caso dell'estensione al prolog, in quanto si è dovuto effettuare un passaggio concettuale ai linguaggi logici, a cui un programmatore abituato a linguaggi imperativi e funzionali non è per niente abituato.
Come si è mostrato in questo progetto, grazie ai meccanismi messi a disposizione da un sistema ad oggetti come Java, risulta molto semplice introdurre nuove funzionalità all'interprete. Ad esempio sarebbe abbastanza semplice introdurre delle altre primitive tipiche del lisp.
Per quanto riguarda il prolog invece si potrebbe pensare di introdurre il predicato is che permette di assegnare ad una variabile un valore dato da un'espressione, ed inoltre la gestione dell'input / output implementando la write.
Per lo sviluppo dell'applicazione e della presente relazione sono stati utilizzati i seguenti software:
Sviluppo dell'applicazione:
Realizzazione pagine html e grafica:
- THE END -