Semantica Operazionale

Transcript

Semantica Operazionale
Nondeterminismo
„
Semantica Operazionale
Alberi SLD
„
La computazione di un goal può avere molte
refutazioni, ognuna associata ad una diversa
risposta, e tutte valide ai fini della risoluzione
del problema.
Ci sono due fonti di nondeterminismo:
„ scelta dell'atomo selezionato;
„ scelta della clausola fra quelle la cui testa
unifica con l'atomo selezionato.
2
1
Albero SLD
Dati un programma logico P, una clausola goal G ed
una regola di selezione R, un albero SLD per P∪{G} via R è
definito come segue:
„ ogni nodo dell'albero è un goal;
„ la radice dell'albero è il goal G;
„ il nodo ?- A,B,C, dove B è l'atomo selezionato dalla regola
di calcolo R, ha come figli tutti i goal che si ottengono con
un passo di derivazione. Tali figli sono ordinati da sinistra a
destra seguendo l'ordine delle clausole utilizzate per
risolvere B.
„ ogni foglia è un goal vuoto o un goal di fallimento.
esercizio - 1
Disegnare l'albero SLD per
{volo_diretto(venezia, londra).,
volo_diretto(roma, atene).,
volo_diretto(roma, venezia).,
volo(x,y) ← volo_diretto(x,y).,
volo(x,y) ← volo_diretto(x,z) and volo(z,y).}
∪ { ← volo(roma,w).}
con regola di selezione leftmost.
3
4
Esercizio - 2
Disegnare l'albero SLD per
Alberi di successo, fallimento …
Un albero SLD si dice di successo se esiste almeno
una foglia che è il goal vuoto.
Un albero SLD si dice di fallimento infinito se esiste
almeno un cammino infinito.
Un albero SLD si dice di fallimento finito se è finito ed
ogni foglia è un goal di fallimento finito.
Un cammino su di un albero SLD si dice di successo
se va dalla radice ad una foglia che è il goal vuoto.
Un cammino su di un albero SLD si dice di fallimento
finito se va dalla radice ad una foglia che è un goal di
fallimento finito.
„
{volo_diretto(venezia, londra).,
volo_diretto(roma, atene).,
volo_diretto(roma, venezia).,
volo(x,y) ← volo_diretto(x,y).,
volo(x,y) ← volo_diretto(x,z) and volo(z,y).}
∪ { ← volo(roma,w).}
„
„
„
„
con regola di selezione rightmost.
5
6
Indipendenza dei successi
Dipendenza dei fallimenti
„
Siano T1 e T2 due alberi SLD per lo stesso
programma e goal iniziale ma per due diverse
regole di selezione.
„
Ogni cammino di successo in T1 corrisponde
ad un cammino di successo in T2, con la
stessa c.a.s., e viceversa.
„
7
E' possibile che una regola di selezione generi
un albero di fallimento finito ed un'altra ne
generi uno di fallimento infinito.
P={ p(x) :- q(x), r(x)., q(a) :- q(a)., r(b).}
G= ?-p(x)
con la regola leftmost si ottiene un albero
infinito, mentre con la regola rightmost si
ottiene un albero di fallimento finito.
8
Strategia di ricerca
Una strategia di ricerca stabilisce come
esplorare l'albero SLD per cercare i nodi di
successo.
„
„
„
„
Strategia di ricerca e alberi infiniti
„
ricerca in profondità (depth-first) con
backtracking
ricerca in ampiezza (breadth-first)
Se l'albero è infinito una strategia depth-first
puo' risultare incompleta.
'
non può
essere
individuato
9
10
Strategia di ricerca Prolog
Esercizio
Consideriamo i seguenti tre modi per definire il
predicato volo ed il goal volo(x,y).
P1: volo(x,y) ← volo_diretto(x,y).
volo(x,y) ← volo_diretto(x,z), volo(z,y).
P2: volo(x,y) ← volo_diretto(x,y).
volo(x,y) ← volo(z,y), volo_diretto(x,z).
P3: volo(x,y) ← volo(z,y), volo_diretto(x,z).
volo(x,y) ← volo_diretto(x,y).
Quale è il comportamento dell'interprete Prolog nei
tre casi?
L'interprete Prolog adotta la strategia di
ricerca depth-first.
La strategia Prolog è quindi incompleta: non
trova tutte le c.a.s.
11
12
Soluzione -1
Soluzione -2
Con P1
l'albero è finito (risolvendo volo_diretto(x,y) si
ottengono terminbi ground).
Quindi l'interprete Prolog trova tutte le soluzioni in
tempo finito.
Con P2
si ottiene un albero che ha un ramo infinito, ma per
fortuna è quello piu'a destra.
Quindi l'interprete Prolog trova tutte le soluzioni in
tempo finito, poi diverge.
Con P3
si ottiene un l'albero che ha il ramo più a sinistra
infinito.
Quindi l'interprete Prolog diverge subito e non trova
alcuna soluzione.
13
14
programmi logici e procedure
„
Lettura procedurale
„
„
di un programma Prolog
„
„
„
15
Una dichiarazione di procedura è un insieme di clausole
definite aventi lo stesso simbolo di predicato nella testa.
il nome della procedura è il simbolo di predicato che
compare nelle sue teste.
i parametri formali sono i termini che compaiono nelle
teste.
la chiamata di procedura è realizzata da una clausola goal.
i parametri attuali sono i termini che compaiono nella
chiamata della procedura.
una procedura può essere non deterministica e le modalità
di input o di output possono variare con la chiamata.
16