Books
in black and white
Main menu
Home About us Share a book
Books
Biology Business Chemistry Computers Culture Economics Fiction Games Guide History Management Mathematical Medicine Mental Fitnes Physics Psychology Scince Sport Technics
Ads

Lintelligenza artificiale - Piero S.

Piero S. Lintelligenza artificiale - Fanco muzzio editore , 1987. - 282 p.
Download (direct link): lapinteligenseartificaile1987.djvu
Previous << 1 .. 85 86 87 88 89 90 < 91 > 92 93 94 95 96 97 .. 112 >> Next


E Prolog esegue il "programma" in risposta a una domanda dell'utente, scritta in questa foima:

?- a (X) ,b (Y) , ... , (Z) .

La domanda una congiunzione di goal (obiettivi) che devono essere soddisfatti. Prolog usa l'insieme di clause che compongono il programma per soddisfarle. SISTEMI DI SVILUPPO 214

Per esempio un "fatto" (3)

soddisfa subito il goal a (X) di cui sopia, istanziando anche Xa 3. Una regola invece scatenail meccanismo di risoluzione: se esiste an match con uno dei goal, esso viene applicato, istanziando Ie variabili:

b (S) :-d (S, M) , e (M) .

crea, dal goal dell'esempio, un sotto-goal:

b (Y) :-d(Y, M) , e (M) .

e istanzia S a Y. Per soddisfare questo sotto-goal, il Prolog tenta di usare Ie altre clause a disposizione. Se alia fine del processo il goal originale non stato sod-disfatto, il Prolog disfa tutto, rimettendo al loro posto Ie variabili che erano state instanziate, e riparte cercando una strada alternativa (in backtracking). E cosi via finche esiste una speranza di trovare Ia soluzione. Tra laltro l'utente puo esplicitamente r ichiedere backtracking, anche quando il Prolog gli ha f ornito una soluzione, premendo ";", e il Prolog andra a cercare di soddisfare Io stesso goal con una seconda soluzione. Ovviamente nel caso in cui Ia domanda sia formata da una congiunzione di goal, il Prolog smette il backtracking, e risponde con una soluzione, soltanto quando ha trovato una soluzione per ciascuno dei goal. Siccome il backtracking non certo il modo piu efficiente di scandire fatti e regole, esistono diversi modi per influire sul modo di procedere del Prolog, il piu usato dei quali il cut, indicate con un punto esclamativo ("!"). Di fatto il cut significa che il sistema non deve tornare in backtracking indietro da questo punto. In altre parole: "Se sei arrivato fin qua, va bene cosi". Questo puo voler dire sia che Ia soluzione stata trovata, sia che non stata trovata, sia che per trovarla non si vuole rimettere in discussione cio che il Prolog ha finora stabilito. Per esempio vediamo come si definisce Ia negazione in Prolog:

not (X): -call (X) ,!, fail, not (X) . SISTEMI DI SVILUPPO 215

per dimostraie la negazione di qualcosa (pei esempio not(a(l))), il Piolog ceica innanzitutto di soddisfaie il suo goal (appunto not(a(l))), con la piima clause. per far cio applica il principio di lisoluzione e ricava:

not(a (1)):-call(a(l)), !,fail.

Il predicato call non fa altio che vedeie se il suo aigomento vero falso. In questo caso veio, perche a(l) faceva parte del nostio programma. Quindi il Prolog incontra il cut, e si segna che non deve fare backtracking indietro da questo punto. Subito dopo ' un fail che un predicato un po' equivalente al false del Pascal: fa fallire la ricerca. Il Prolog, vistosi anivato in un vicolo cieco, voirebbe fare backtracking per vedere di trovare una soluzione in un altro modo (per 1 'esattezza prendendo in considerazione la seconda clause della definizione di not, e se cosi facesse la troverebbe), ma il cut Io obbliga a smettere la sua riceica di una soluzione e a restituiie "no". Se invece il programma non contenesse il fatto a(l), il Prolog troveiebbe falso call(a(l))t quindi abbandoneiebbe subito questa clause, senza andaie a vedeie cosa viene dopo (in una congiunzione basta che uno dei teimini sia falso affinche l'inteia congiunzione iisulti falsa), e (potendo questa volta fare backtiacking) passeiebbe a ceicaie una strada alternativa, cioe la seconda clause della definizione di not, che instanziata si legge:

not (a (1) ) .

Questa, per il Prolog, una affeimazione, e quindi ha successo. Il Prolog restituisce "yes".

Il Prolog compete con il LISP pei quanto iiguaida liste e iicorsione. La sua simbologia molto diversa peio:

[X|Y]

significa che la stiinga composta da un primo elemento, che viene assegnato , e una parte rimanente, che viene asseg-nata a Y. Se si vuole piendere soltanto una delle due paiti della stiinga, il Prolog consente di definire variabili "anoni-me", indicate con "_" (sottolineatura): [Zl_] instanzia soltanto X al valore del SISTEMI DI SVILUPPO 216

primo-elemento della lista, ed ignora il resto.

Per quanto riguarda la ricorsione, vediamo il caso tipico della definizione di un predicato che cerca un carattere all'interno di una stringa (considerata come lista di caratteri):

search(X,[X|_]).

search(X,[_IY]):-search(X,Y) .

La prima clause dice che "il carattereX appartiene alla stringa se esso uguale al primo carattere della stringa". La seconda dice che "il carattere X appartiene alla stringa se appartiene alla sottostringa formata da tutti caratteri meno il primo".

Vediamo come procede il Prolog quando deve rispondere a una domanda come questa:

?- search (a,[d,c,a,b]) .

Prima cerca di applicare la prima clause, ma non ha successo, perche a non il primo elemento della lista. Allora (backtracking) passa alla seconda clause, e instanzia X in "a" e Y in "[c,a,b]'\ che trasforma il secondo membro nel nuovo goal
Previous << 1 .. 85 86 87 88 89 90 < 91 > 92 93 94 95 96 97 .. 112 >> Next