Prolog

Uno dei linguaggi che si potrebbe definire impropriamente "educativo" (nel senso di non essere dedicato a programmatori professionisti) è il Prolog.

Prolog è una sintesi dell'espressione “PROgrammation en LOGique” ed è il nome dato ad un linguaggio inventato all’Università di Marsiglia all’inizio degli anni '70 da Alain Colmerauer e Philippe Roussell partendo da ricerche precedenti di Robert Kowalski all’Università di Edimburgo. Insomma, un linguaggio tutto europeo (come Pascal o PHP).

L'obiettivo iniziale di Colmerauer e Roussell era costruire un sistema in grado di effettuare delle deduzioni a partire da un testo scritto in lingua naturale, in particolare in Francese. L'incontro con Kowalski permise di dare delle fondamenta più generali e formali al progetto. Così nacquero insieme il sistema e il linguaggio per costruirlo.

La prima versione dell'interprete Prolog fu scritta in Algol-W e quella definitiva in FORTRAN. Quello che segue è un esempio della prima interazione con il sistema:

        TOUT PSYCHIATRE EST UNE PERSONNE.
        CHAQUE PERSONNE QU’IL ANALYSE, EST MALADE.
        JACQUES EST UN PSYCHIATRE A *MARSEILLE.

        EST-CE QUE *JACQUES EST UNE PERSONNE?
        OU EST *JACQUES?
        EST-CE QUE *JACQUES EST MALADE?

        OUI.
        A MARSEILLE.
        JE NE SAIS PA
Una descrizione della storia della nascita di Prolog a cura degli stessi autori può essere letta qui.

il linguaggio nasce insieme ad un nuovo paradigma di programmazione: invece di concentrarsi sulla maniera di risolvere un problema descrivendo i passi che il computer deve fare, nella programmazione logica si descrive l'obiettivo, i fatti noti e le relazioni tra i fatti nella forma di regole. E' l'inteprete del linguaggio che si preoccupa di come arrivare all'obiettivo, e non il programmatore. Inoltre, nella sua ricerca di una soluzione l'interprete può arrivare ad un vicolo cieco; ma è capace di tornare indietro ("backtracking") annullando alcune delle assunzioni fatte strada facendo.

Questo approccio cozza con tutte le idee della programmazione come attività che consiste nel "dire al computer quello che deve fare" e con l'idea di computer come automa stupido che "fa solo quello che gli diciamo". Nel caso del Prolog, il programmatore non sa in anticipo quale strada seguirà il programma per tentare di raggiungere l'obiettivo.

Prolog ha una sintassi molto semplice e pochissimi termini. Probabilmente è facile da imparare come primo linguaggio, un po' meno come secondo, soprattutto se il primo è un linguaggio procedurale tradizionale.

Prolog è basato sulla logica dei predicati di primo ordine, in cui la forma base è: "questa proprietà appartiene ad un oggetto", oppure "c'è una relazione tra due oggetti". Un programma Prolog parte da alcuni fatt, cioè espressioni che si ritengono vere. Per esempio: nonno Giovanni è una persona e racconta favole. Poi si possono aggiungere ragole, cioè espressioni che mettono in relazioni fatti tramite variabili (che si scrivono con la lettera maiuscola). Ad esempio: un narratore è una persona che racconta favole.

   persona(nonnoGiovanni).
	racconta(nonnoGiovanni,favola).
   narratore(Uno):-
                persona(Uno),
                racconta(Uno,favola).
Oltre a fatti e regole, si possono descrivere obiettivi, che sono le relazioni tra fatti e regole che l'interprete Prolog deve provare a dimostrare sulla base di quello che sa. Per esempio, possiamo chiedere all'interprete Prolog se nonno Giovanni è un narratore:
        ? narratore(nonnoGiovanni).
per ottenere come risultato:
        Yes.
che significa che è riuscito a dimostrare l'obiettivo; nonno Giovanni è un narratore. Oppure:
        ? racconta(Chi,favola).
che fornisce come risultato:
        Chi = nonnoGiovanni.
Nei linguaggi di programmazione non ci si può ripetere: in un codice sorgente non si possono creare due variabili con lo stesso nome (nello stesso contesto) oppure scrivere due funzioni che hanno lo stesso nome e lo stesso numero e tipo di argomenti.

Una caratteristica speciale di Prolog è che invece questo si può fare benissimo.

        persona(nonnoGiovanni).
	legge(nonnoGiovanni,favola).
        narratore(Uno):-
                persona(Uno),
                racconta(Uno,favola).
        narratore(Uno):-
                persona(Uno),
                legge(Uno,favola).

        ? narratore(nonnoGiovanni).
In questo programma ci sono due regole che hanno lo stesso nome. Questo non è un problema: Prolog le "prova" una alla volta, per vedere se con quella regola si può dimostrare il goal fornito. Se non riesce con la prima, torna indietro e prova con la seconda. Nel caso di sopra, la prima regola narratore(Uno) fallisce, ma la seconda riesce.

Si può pensare che Prolog sia un linguaggio utile solo in ambito linguistico; in realtà è stato usato in tutti i casi in cui sia utile una descrizione formale di una situazione e occorra un ragionamento per verificare delle ipotesi.

Per certi problemi Prolog si rivela anche molto sintetico ed efficiente. Ad esempio, il programmma Prolog che risolve un problema di Sudoku di ordine 9 è molto, molto piccolo:

        sudoku(Rows) :-
                length(Rows, 9),
                maplist(same_length(Rows), Rows),
                append(Rows, Vs), Vs ins 1..9,
                maplist(all_distinct, Rows),
                transpose(Rows, Columns),
                maplist(all_distinct, Columns),
                Rows = [As,Bs,Cs,Ds,Es,Fs,Gs,Hs,Is],
                blocks(As, Bs, Cs),
                blocks(Ds, Es, Fs),
                blocks(Gs, Hs, Is).

        blocks([], [], []).
        blocks([N1,N2,N3|Ns1], [N4,N5,N6|Ns2], [N7,N8,N9|Ns3]) :-
                all_distinct([N1,N2,N3,N4,N5,N6,N7,N8,N9]),
                blocks(Ns1, Ns2, Ns3).
Fonte: Metalevel.

Un breve tutorial di Prolog, in italiano e pensato per non-programmatori, si può trovare qui. Prolog non è l'unico linguaggio che segue il paradigma logico: ci sono anche i più recenti Datalog e Mercury.

Prolog ha avuto un grande successo negli ultimi anni del millennio scorso in connessione con il boom del mito di un’intelligenza artificiale forte che sembrava fosse lì lì, appena un passo oltre l’orizzonte, e presto sarebbe stata una realtà. Invece quel mito si è rivelato una favola, mentre un altro tipo di intelligenza – quella più opaca del machine learning – sta prendendo piede.

Prossimo pannello:  IEML



Versione: 17/10/2023 - 18:11:19

Parole: 412

Pannelli

Linguaggi                   
Linguaggi di programmazione 
Nomi dei linguaggi          
Caratteri e linguaggi       
Famiglie                    
Traduzione                  
COBOL                       
Lisp                        
APL                         
Perl                        
Javascript                  
Python                      
PHP                         
Ruby                        
Linguaggi educativi         
Pascal                      
Ada                         
Logo                        
Prolog                      
IEML                        
Linguaggi nazionali         
Linotte                     
Linguaggi esoterici         
Intercal                    
Brainfuck                   
Emmental                    
HQ9+                        
🔎