| Home/ | www.icosaedro.it | ![]() |
PROLOGUn interprete del linguaggio PROLOG, quasi completo (vedere la sezione limitazioni) che ho sviluppato per sperimentare l'intelligenza artificiale con questo suggestivo linguaggio. L'interprete è disponibile come sorgente scritto nel linguaggio Modula-2, il cui compilatore è disponibile per varie piattaforme.
Ero un ragazzo quando, a metà degli anni '80, il governo giapponese lanciò la grade sfida dei computer della V generazione (o forse era la IV? bho...). L'obiettivo ambizioso era da una parte quello di produrre computer intelligenti in grado di districarsi nella complessità destrutturata del mondo reale, dall'altra parte era un incentivo verso l'industria elettronica nazionale a diventare protagonista del futuro con un progetto originale ed innovativo.
Il sistema di sviluppo per questi sistemi era incentrato nel linguaggio PROLOG, che sta per "PROgrammazione LOGica", scelto proprio per la sua capacità di trovare risposte a domande opportunamente poste, e basandosi su di un data base di regole logiche e informazioni varie.
Tutta 'sta storia mi affascinò a tal punto che volli assolutamente provarci anch'io. Purtroppo non disponevo di un interprete PROLOG, nè mi risultava esistere un prodotto simile per il mio computer. Non rimaneva che una soluzione: scrivere da me il mio interprete PROLOG...
Piattaforma hardware a mia disposizione: un Apple ][ Europlus. Per chi non se lo ricorda, il sistemone disponeva di un potente processore 6502 a 8 bit, 64 KB di RAM e due floppy disk drive da 140 KB per un totale di ben 280 KB in linea! Il sistema di sviluppo era l'UCSD Pascal, una moderna rivisitazione del Pascal con il supporto delle unità di compilazione esterne. Qualche settimana di applicazione nei ritagli di tempo, ed ecco il mio interprete PROLOG funzionante!
Poiché tutto ha una fine, un bel giorno il mio fido Apple ][ smise di clockare, e con esso se ne andarono il programma e i sorgenti... Ancora una volta, la carta stampata si dimostrò essere il supporto di memoria di massa più affidabile in assoluto: listato alla mano, riscrissi l'interprete in Modula-2 sul mio fiammante Apple Macintosh LC II, ed eccolo qui resuscitato e a disposizione in questa pagina WEB.
L'elemento fondamentale della sintassi di questa implementazione di PROLOG sone le liste, costituite da un elenco di elementi separati da virgole e racchiusi tra parentesi tonde. Una lista vuota è costituita da una parentesi tonda aperta seguita da una parentesi tonda chiusa.
La sintassi è libera: spazi, tabulazioni e a-capo vengono ignorati. Nei nomi degli atomi non sono ammessi caratteri di spaziatura, tabulazione o a-capo. Nelle stringhe letterali questi caratteri vengono invece a far parte delle stringa stessa.
I predicati prolog sono costituiti da un elenco di elementi
terminati da un punto. Ecco ad esempio il consueto predicato
member:
(member X (X|_)).
(member X (_|C)) (member X C).
Questa sintassi corrisponde alla forma più consueta seguente:
member(X, [X|_]).
member(X, [_|C]) :- member(X, C).
così come la si trova ad esempio in Cloksin-Mellish.
Un programma PROLOG (detto anche data base PROLOG) è una raccolta di predicati, in numero arbitrario.
I predicati predefiniti sono i seguenti:
cut
(eq arg1 arg2)
fail
nl
(read arg)
repeat
true, soddisfa
sempre il backtracking. In genere va combinato con il cut.
true
stop
(write arg)
(write "Hello, world!")
(write X) (write atomo1). Ecco come vengono stampati alcuni elementi
speciali:
_ è un elemento ignoto;
() è una lista vuota;
Ha sempre successo ed è trasparente al backtracking.
writeeq
Write, ma non mette le virgolette.
La limitazione più grave del mio PROLOG è la mancanza dei
predicati assert e retract, essenziali nelle
applicazioni importanti: l'UCSD Pascal non disponeva di un supporto adeguato
alla gestione della memoria dinamica, nè avevo voglia di riscriverlo.
Altra limitazione meno importante è la mancanza del supporto alla aritmetica: in effetti questa mancanza è in parte voluta, poiché le mie prime sperimentazioni con l'interprete erano dedicate proprio all'aritmentica implementata in PROLOG.
Dopo avere sperimentato con la sintassi classica del PROLOG come appare ad esempio in Cloksin-Mellish, trovai che in fondo l'interprete è un manipolatore di liste, e che era più logico che anche i sorgenti riflettessero questa caratteristica, sia pur peggiorando la leggibilità. La sintassi del PROLOG da me implementata si ispira dunque al micro-PROLOG.
Il programma è assolutamente gratuito (free) e di pubblico dominio; anche i sorgenti sono utilizzabili liberamente e sono di pubblico dominio.
| Umberto Salsi | Contatto | Mappa | Home/ |