Pagine

Google
in tutto il Web in questo blog e nei suoi archivi

Visitate anche http://ilpixelmatto.altervista.org

venerdì 7 novembre 2008

Programmazione logica: Prolog

Comincio adesso a parlarvi della programmazione logica.
Questo articolo è in aggiornamento, ogni volta che potrò aggiungerò le informazioni che potrete trovare utili, quindi tornate spesso a controllare l'articolo!!!!

Che cos'è il Prolog?

Il Prolog è un linguaggio di programmazione dichiarativo. Ciò significa che in Prolog non scrivete che cosa dovrebbe fare il calcolatore linea per linea, come nei linguaggi procedurali C e Java. L'idea generale dietro i linguaggi dichiarativi è descrivere una situazione. Sulla base di questo codice, l'interprete o il compilatore vi dirà una soluzione. Nel caso del Prolog, vi dirà se una frase di Prolog sia vera o no, e, se contiene le variabili, quali valori devono avere. Ciò può suonare come una panacea per i programmatori, ma la verità è che il Prolog è usato raramente in questo modo. Benché l'idea dichiarativa sia alla base del Prolog, è possibile vedere il codice di Prolog come procedurale. Un programmatore di Prolog lavorerà secondo la parte del codice che sta leggendo o scrivendo. Il Prolog tuttavia, come esperienza di programmazione procedurale, non è utile (si dice spesso che è più facile da imparare per qualcuno che non abbia alcun'esperienza di programmazione procedurale). Il Prolog è considerato un linguaggio difficile da padroneggiare, particolarmente quando l'allievo prova a scorrere velocemente le cose, principalmente a causa del modo differente di pensare che l'allievo deve adottare e della quantità di ricorrenza nei programmi in Prolog.
Una volta imparato ad usarlo correttamente, tuttavia, il Prolog può essere molto potente.

Il Prolog (PROgramming in LOGic) è un linguaggio di programmazione che adotta il paradigma di programmazione logica.
È stato ideato da Robert Kowalski (aspetto teorico), Marten Van Emdem (dimostrazione sperimentale), ed implementato da Alain Colmerauer negli anni 70, costituendo un tentativo di costruire un linguaggio di programmazione che consentisse l'espressione del problema in forma logica invece della traduzione di un algoritmo di soluzione in forma di istruzioni da eseguire da parte della macchina.
Il Prolog è impiegato in molti programmi di Intelligenza artificiale, la sua sintassi e la semantica sono molto semplici e chiare (lo scopo primitivo era quello di fornire uno strumento di lavoro a linguisti privi di conoscenze informatiche).
I concetti fondamentali sono l'unificazione, la ricorsione in coda e il backtracking.

Imparare il Prolog certamente non sarà sempre fruttuoso quanto imparare C++, Java o Python. Il Prolog è più utile nelle zone relative alla ricerca in intelligenza artificiale, quali soluzione dei problemi, la progettazione o l'interpretazione di linguaggio naturale.

Logica Proposizionale del prolog

Nella logica proposizionale esistono due fondamentali elementi di base , termini e connettivi. I termini sono rappresentati da lettere (di solito maiuscole), e rappresentano i valori vero e falso, quindi un termine può essere vero o falso, benché non sia sempre chiaro cosa rappresenti veramente. In questo senso essi sono come le variabili in matematica perché rappresentano un valore.

I connettivi, come suggerisce la parola, connettono due termini. Il risultato di questa connessione prende il valore di vero o falso basandosi proprio sul valore dei due termini. Consideriamo per esempio il connettivo AND. Questo connettivo può mettere in relazione i termini A e B per creare la proposizione "A AND B". La proposizione "A AND B" è vera quando sono vere A e B. Se una o entrambe sono false, la proposizione è falsa. I connettivi sono solitamente rappresentati da simboli piuttosto che da parole. La seguente tabella mostra i connettivi più comunemente usati, il loro significato ed i simboli più correntemente usati per rappresentarli.


Nome Uso Significato Simbolo
congiunzione A \land B vera quando entrambe sono vere  \land \quad ,
disgiunzione A \lor B vera quando una o entrambe sono vere  \lor \quad ;
or esclusivo A \oplus B vera quando una e solo una è vera \oplus \quad \underline {\lor} \quad
negazione \lnot A vera quando una è falsa e viceversa  \sim  \quad \lnot \quad \bar {q}
implicazione A \rightarrow B vera quando A è vera e B è vera; vera quando A è falsa  \rightarrow \quad \Rightarrow \quad \models
uguaglianza A \leftrightarrow B vera se entrambe false o entrambe vere  \leftrightarrow \quad \Leftrightarrow \quad =
Fonti wikipedia.

Adesso spieghiamo il backtracking

E' il meccanismo con il quale il motore differenziale risponde alle domande. Se non trova una risposta al primo tentativo, torna indietro e prova a soddisfare il predicato cambiando il valore alle variabili.
Cominciamo a programmare in prolog
Dopo la teoria, un pò di pratica!!
Allora, poniamo le basi per una programmazione in prolog.
Come abbiamo visto, nel prolog non abbiamo necessità di descrivere l'algoritmo, ma basta descrivere i dati e il programma deduce l'algoritmo e ci da la soluzione più probabile.
Per lavorare in prolog, è necessario, prima di tutto, fornire all'interprete la base di conoscenza, cioè i dati di cui deve disporre e da cui intuirà poi la soluzione.
es:
persona(mario rossi).
persona è il predicato, che è costituito dai vari elementi o atomi (in questo caso mario rossi).
il punto ha il significato dell'OR, mentre la virgola significa AND.
la base di conoscenza che noi forniamo al programma viene considerata dal programma sempre vera.

In prolog è anche importante il modo in cui si scrivono gli atomi, in quanto ogni parola che inizia con la lettera maiuscola verrà interpretata come variabile e il prolog cercherà di dargli un valore affinche l'espressione risulti vera.
Per poter scrivere una parola con la lettera maiuscola senza che venga interpretata come una variabile bisogna inserirla tra 'apici': animale('gatto').

Facciamo un esempio di programma.
Forniamo le conoscenze per descrivere una situazione come questa:

Ecco un esempio di continente dove ci sono delle terre (a,b,c...) che hanno un determinato colore (giallo, rosso...) e attorno c'è il mare che è di colore blu.
Cominciamo a descrivere il tutto:
colore(a, rosso).
colore(b, verde).
colore(c, giallo).
colore(d, rosso).
colore(e, verde).
colore(f, giallo).
confinanti(a, b).
confinanti(a, c).
confinanti(a, e).
confinanti(a, mare).
confinanti(b, a).
confinanti(b, c).
confinanti(b, d).
confinanti(b, mare).
confinanti(c, a).
...
...
...
una volta terminato di scrivere la base di conoscenza del nostro programma, possiamo cominciare a fare delle domande al nostro interprete.
Se noi, per esempio, gli chiediamo:
colore(a,X).
lui interpreterà come:
qual'è il colore di a?
Il motore differenziale scorre la base di conoscenza finchè non trova un valore da dare alla variabile (X) in modo che l'espressione risulti vera.
Se trova un valore che inizialmente risulta vero, ma dopo un controllo di un'altra espressione, risulta falsa, allora inizia il backtracking, che va a cambiare il valore della variabile scorrendo nuovamente tutta la base di conoscenza escludendo i valori scartati.
In questo modo il sistema aumenta la conoscenza (base dei sistemi di intelligenza artificiale).

Nessun commento: