Home/
 www.icosaedro.it 

 PROLOG

In breve

Un 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.

In lungo (ovvero: per esteso)

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.

Sintassi e funzionalità

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
Predicato che è sempre soddisfacibile attraversandolo da sinistra verso destra, ma che causa il fallimento del predicato durante il backtracking. Corrisponde al più tradizionale simbolo del punto esclamativo ``!''.

(eq arg1 arg2)
Esegue l'unificazione dei due parametri e, se questa ha successo, il predicato ha successo.

fail
Questo predicato fallisce sempre, forzando il backtracking.

nl
Produce la stampa di un a-capo, ha sempre successo ed è trasparente al backtracking.

(read arg)
Legge da tastiera un termine, che deve avere la sintassi valida per un termine (atomo, stringa o lista). Ha sempre successo ed è trasparente al backtracking.

repeat
Ha sempre successo ma, a differenza del true, soddisfa sempre il backtracking. In genere va combinato con il cut.

true
Ha sempre successo ed è trasparente al backtracking.

stop
Termina il programma.

(write arg)
Stampa il parametro specificato. Esempi: (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
Come Write, ma non mette le virgolette.

 

Limitazioni

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.

Licenza

Il programma è assolutamente gratuito (free) e di pubblico dominio; anche i sorgenti sono utilizzabili liberamente e sono di pubblico dominio.

DOWNLOAD


Umberto Salsi

Contatto
Mappa
Home/