Algoritmi di Inferenza per il Calcolo Proposizionale
Algoritmi di Inferenza per il Calcolo Proposizionale Algoritmi di Inferenza per il Calcolo Proposizionale
Algoritmi di Inferenza per il Calcolo Proposizionale Antonino Freno freno@dii.unisi.it Corso di Intelligenza Artificiale – A.A. 2008/2009
- Page 2 and 3: Clausole di Horn (I) ◮ Una clauso
- Page 4 and 5: Forward Chaining
- Page 6 and 7: Forward Chaining: Validità e compl
- Page 8 and 9: Forma normale congiuntiva ◮ Qualu
- Page 10 and 11: Forma normale congiuntiva: Esempio
- Page 12 and 13: Validità della regola di risoluzio
- Page 14 and 15: Completezza della regola di risoluz
- Page 16 and 17: L’algoritmo di Davis-Putnam-Logem
- Page 18 and 19: L’algoritmo WalkSAT (I)
- Page 20 and 21: L’algoritmo GSAT ◮ GSAT è un a
<strong>Algoritmi</strong> <strong>di</strong> <strong>Inferenza</strong> <strong>per</strong> <strong>il</strong> <strong>Calcolo</strong><br />
<strong>Proposizionale</strong><br />
Antonino Freno<br />
freno@<strong>di</strong>i.unisi.it<br />
Corso <strong>di</strong> Intelligenza Artificiale – A.A. 2008/2009
Clausole <strong>di</strong> Horn (I)<br />
◮ Una clausola <strong>di</strong> Horn è una <strong>di</strong>sgiunzione <strong>di</strong> letterali <strong>di</strong> cui al<br />
massimo uno è positivo;<br />
◮ Esempi: ¬α ∨ ¬β ∨ γ è una clausola <strong>di</strong> Horn, mentre<br />
¬α ∨ β ∨ γ non lo è;<br />
◮ Caratteristiche:<br />
◮ Qualunque clausola <strong>di</strong> Horn può essere riscritta come<br />
un’implicazione in cui l’antecedente è una congiunzione <strong>di</strong><br />
letterali positivi, e <strong>il</strong> conseguente è un singolo letterale positivo;<br />
◮ <strong>Inferenza</strong> con le clausole <strong>di</strong> Horn si può fare con gli algoritmi <strong>di</strong><br />
forward chaining e backward chaining;<br />
◮ Il tempo necessario a decidere un’implicazione rispetto a una<br />
base <strong>di</strong> conoscenza in clausole <strong>di</strong> Horn cresce solo linearmente<br />
con le <strong>di</strong>mensioni della base.
Clausole <strong>di</strong> Horn (II)<br />
◮ Una clausola che contiene esattamente un letterale positivo si<br />
chiama ‘clausola definita’. Il letterale positivo forma la testa<br />
della clausola, e i letterali rimanenti formano <strong>il</strong> corpo;<br />
◮ Una clausola definita priva <strong>di</strong> letterali negativi si chiama<br />
‘fatto’;<br />
◮ Le clausole definite sono la base della programmazione logica;<br />
◮ Una clausola <strong>di</strong> Horn che sia priva <strong>di</strong> letterali positivi si<br />
chiama ‘vincolo <strong>di</strong> integrità’.
Forward Chaining
Forward Chaining: Esempio<br />
◮ Base <strong>di</strong> conoscenza:<br />
◮ Regole: P ⇒ Q, L ∧ M ⇒ P, B ∧ L ⇒ M, A ∧ P ⇒ L,<br />
A ∧ B ⇒ L;<br />
◮ Fatti: A, B;<br />
◮ Query: Q;<br />
◮ Derivazione:<br />
1. L<br />
2. M<br />
3. P<br />
4. Q
Forward Chaining: Vali<strong>di</strong>tà e completezza<br />
◮ Vali<strong>di</strong>tà: ogni inferenza è semplicemente un’applicazione del<br />
modus ponens (⇒ E);<br />
◮ Completezza:<br />
◮ Consideriamo <strong>il</strong> momento in cui l’algoritmo ha raggiunto un<br />
punto fisso (quando nessun’altra inferenza è possib<strong>il</strong>e);<br />
◮ Supponiamo che ci sia un atomo α derivab<strong>il</strong>e dalla base <strong>di</strong><br />
conoscenza, ma non derivato dall’algoritmo;<br />
◮ Se α è derivab<strong>il</strong>e, allora ci sarà una regola del tipo<br />
β1 ∧ . . . ∧ βn ⇒ α, dove i letterali β1, . . . , βn sono tutti veri;<br />
◮ La possib<strong>il</strong>ità che β1, . . .,βn siano veri e α non sia stato<br />
derivato dall’algoritmo contrad<strong>di</strong>ce l’ipotesi che l’algoritmo<br />
abbia raggiunto un punto fisso, <strong>per</strong>chè in questo caso dovrebbe<br />
aver derivato anche α!
Backward Chaining<br />
◮ La strategia <strong>di</strong> backward chaining lavora ‘all’in<strong>di</strong>etro’ anzichè<br />
‘in avanti’;<br />
◮ L’idea è <strong>di</strong> partire dai goal anzichè dalle premesse, e <strong>di</strong><br />
generare via via i fatti che abbiamo bisogno <strong>di</strong> provare <strong>per</strong><br />
derivare la conclusione che ci interessa;<br />
◮ Il backward chaining <strong>di</strong> solito è più parsimonioso del forward<br />
chaining, <strong>per</strong>chè si limita a lavorare sui fatti che sono<br />
strettamente r<strong>il</strong>evanti <strong>per</strong> la conclusione. E’ usato nell’ambito<br />
del planning;<br />
◮ In pratica, strategie miste forward-backward possono essere<br />
usate nel modo che conviene <strong>di</strong> più.
Forma normale congiuntiva<br />
◮ Qualunque FBF può essere ridotta ad una FBF in forma<br />
canonica, detta ‘forma normale congiuntiva’ (FNC). Una FBF<br />
φ è in FNC se φ = (ψ11 ∨ ... ∨ ψ1l ) ∧ ... ∧ (ψn1 ∨ ... ∨ ψnm),<br />
cioè se φ è una congiunzione <strong>di</strong> <strong>di</strong>sgiunzioni <strong>di</strong> letterali.<br />
◮ Per ridurre una qualunque FBF a FNC, usiamo la seguente<br />
procedura:<br />
1. Eliminiamo ⇔ usando ⇒ e ∧;<br />
2. Eliminiamo ⇒ usando ¬ e ∨;<br />
3. Spostiamo ¬ verso l’interno ogni volta che ¬ è davanti a una<br />
proposizione complessa;<br />
4. Distribuiamo ∨ su ∧ ogni volta che è possib<strong>il</strong>e.
Forma normale congiuntiva: Esempio (I)<br />
◮ (α ∧ (α ⇒ β)) ⇒ (α ∧ β)<br />
1. ¬(α ∧ (α ⇒ β)) ∨ (α ∧ β)<br />
2. ¬(α ∧ (¬α ∨ β)) ∨ (α ∧ β)<br />
3. ¬α ∨ ¬(¬α ∨ β) ∨ (α ∧ β)<br />
4. (¬α ∨ (α ∧ ¬β)) ∨ (α ∧ β)<br />
5. ((¬α ∨ α) ∧ (¬α ∨ ¬β)) ∨ (α ∧ β)<br />
6. ((α ∧ β) ∨ (¬α ∨ α)) ∧ ((α ∧ β) ∨ (¬α ∨ ¬β))<br />
7. (α ∨ ¬α ∨ α) ∧ (α ∨ ¬α ∨ β) ∧ (¬α ∨ ¬β ∨ α) ∧ (¬α ∨ ¬β ∨ β)
Forma normale congiuntiva: Esempio (II)<br />
◮ (((α ∧ β) ⇒ γ) ∧ (β ⇒ α) ∧ β) ⇒ γ<br />
1. ((¬(α ∧ β) ∨ γ) ∧ (¬β ∨ α) ∧ β) ⇒ γ<br />
2. ((¬α ∨ ¬β ∨ γ) ∧ (¬β ∨ α) ∧ β) ⇒ γ<br />
3. ¬((¬α ∨ ¬β ∨ γ) ∧ (¬β ∨ α) ∧ β) ∨ γ<br />
4. ¬(¬α ∨ ¬β ∨ γ) ∨ ¬(¬β ∨ α) ∨ ¬β ∨ γ<br />
5. (α ∧ β ∧ ¬γ) ∨ (β ∧ ¬α) ∨ ¬β ∨ γ<br />
6. (((α ∧ β ∧ ¬γ) ∨ β) ∧ ((α ∧ β ∧ ¬γ) ∨ ¬α)) ∨ ¬β ∨ γ<br />
7. ((β ∨ α) ∧ (β ∨ β) ∧ (β ∨ ¬γ) ∧ (¬α ∨ α) ∧ (¬α ∨ β) ∧ (¬α ∨<br />
¬γ)) ∨ ¬β ∨ γ<br />
8. ((¬ ∨ β ∨ α) ∧ (¬β ∨ β) ∧ (¬β ∨ β ∨ ¬γ) ∧ (¬β ∨ ¬α ∨ α) ∧<br />
(¬β ∨ ¬α ∨ β) ∧ (¬β ∨ ¬α ∨ ¬γ)) ∨ γ<br />
9. (γ ∨ ¬ ∨ β ∨ α) ∧ (γ ∨ ¬β ∨ β) ∧ (γ ∨ ¬β ∨ β ∨ ¬γ) ∧ (γ ∨<br />
¬β ∨ ¬α ∨ α) ∧ (γ ∨ ¬β ∨ ¬α ∨ β) ∧ (γ ∨ ¬β ∨ ¬α ∨ ¬γ)
Regola <strong>di</strong> risoluzione<br />
◮ Risoluzione unitaria:<br />
α1 ∨ . . . ∨ αn<br />
α1 ∨ . . . ∨ αi−1 ∨ αi+1 ∨ . . . ∨ αn<br />
dove αi e β sono dei letterali complementari, cioè hanno la<br />
forma p e ¬p (o viceversa).<br />
◮ Risoluzione generalizzata:<br />
α1 ∨ . . . ∨ αm<br />
β<br />
β1 ∨ . . . ∨ βn<br />
α1 ∨ . . . ∨ αi−1 ∨ αi+1 ∨ . . . ∨ αm ∨ β1 ∨ . . . ∨ βj−1 ∨ βj+1 ∨ . . . ∨ βn<br />
dove αi e βj sono dei letterali complementari. Restrizione: <strong>il</strong><br />
risultato della risoluzione deve contenere soltanto una copia <strong>di</strong><br />
ciascun letterale.
Vali<strong>di</strong>tà della regola <strong>di</strong> risoluzione<br />
◮ Consideriamo <strong>il</strong> caso:<br />
φ ∨ α ψ ∨ ¬α<br />
φ ∨ ψ<br />
dove φ = α1 ∨ ... ∨ αm e ψ = β1 ∨ ... ∨ βn.<br />
◮ Ci sono due possib<strong>il</strong>ità:<br />
◮ Se α è vero, ¬α è falso, quin<strong>di</strong> ψ è vero, ed è vero anche φ ∨ψ;<br />
◮ Se α è falso, φ è vero, quin<strong>di</strong> è vero anche φ ∨ ψ.<br />
◮ In entrambi i casi, φ ∨ ψ è garantito.
Algoritmo <strong>di</strong> risoluzione
Completezza della regola <strong>di</strong> risoluzione<br />
◮ Dato un insieme Σ <strong>di</strong> FBF, la chiusura rispetto alla risoluzione<br />
<strong>di</strong> Σ è l’insieme RC(Σ) <strong>di</strong> tutte le FBF derivab<strong>il</strong>i da Σ tramite<br />
applicazione ricorsiva della regola <strong>di</strong> risoluzione;<br />
◮ Se Σ è ricavato da un insieme finito <strong>di</strong> simboli primitivi<br />
p1,... ,pn, RC(Σ) è sempre finito (in quanto non accettiamo<br />
letterali ripetuti dentro ciascuna clausola). Questo garantisce<br />
che l’algoritmo <strong>di</strong> risoluzione termini sempre;<br />
◮ Ground resolution theorem. Se un insieme Σ <strong>di</strong> clausole<br />
non è sod<strong>di</strong>sfacib<strong>il</strong>e, allora RC(Σ) contiene la clausola vuota.
L’algoritmo <strong>di</strong> Davis-Putnam-Logemann-Loveland (I)<br />
◮ E’ un algoritmo <strong>per</strong> la verifica della sod<strong>di</strong>sfacib<strong>il</strong>ità;<br />
◮ L’input è un enunciato in FNC, e l’idea <strong>di</strong> base è <strong>di</strong> enumerare<br />
tutti i possib<strong>il</strong>i modelli;<br />
◮ Rispetto ad un’enumerazione a forza bruta, si introducono tre<br />
miglioramenti:<br />
1. Terminazione rapida;<br />
2. Euristica dei simboli puri;<br />
3. Euristica delle clausole unitarie.
L’algoritmo <strong>di</strong> Davis-Putnam-Logemann-Loveland (II)<br />
◮ Terminazione rapida. Se un’enunciato si scopre<br />
necessariamente vero (o falso) anche quando <strong>il</strong> modello è solo<br />
parzialmente specificato, l’algoritmo si arresta senza<br />
completare <strong>il</strong> modello;<br />
◮ Euristica dei simboli puri. Un simbolo è puro se ha lo stesso<br />
segno in tutte le clausole. Se l’enunciato in FNC ha un<br />
modello, allora ha anche un modello in cui tutti i simboli puri<br />
ricevono <strong>il</strong> valore che rende <strong>il</strong> loro letterale vero;<br />
◮ Euristica delle clausole unitarie. Una clausola è unitaria se<br />
contiene un solo letterale. Le clausole unitarie forzano<br />
l’assegnazione <strong>di</strong> un certo valore sul simbolo che contengono,<br />
<strong>per</strong> cui è conveniente elaborarle prima <strong>di</strong> enumerare modelli<br />
alternativi (‘propagazione <strong>di</strong> unità’).
L’algoritmo <strong>di</strong> Davis-Putnam-Logemann-Loveland (III)
L’algoritmo WalkSAT (I)
L’algoritmo WalkSAT (II)<br />
◮ Vantaggi: semplice da implementare, minimo consumo <strong>di</strong><br />
memoria, può funzionare bene <strong>per</strong> scopi pratici;<br />
◮ Svantaggi: WalkSAT non può essere usato <strong>per</strong> <strong>il</strong><br />
theorem-proving in senso stretto. Se WalkSAT restituisce una<br />
soluzione, allora <strong>il</strong> nostro insieme <strong>di</strong> clausole è sod<strong>di</strong>sfacib<strong>il</strong>e,<br />
ma se WalkSAT fallisce, non possiamo concludere che non sia<br />
sod<strong>di</strong>sfacib<strong>il</strong>e. In altre parole: se un modello (<strong>per</strong> <strong>il</strong> nostro<br />
insieme <strong>di</strong> clausole) esiste, WalkSAT ha una certa probab<strong>il</strong>ità<br />
<strong>di</strong> trovarlo, ma WalkSAT non può verificare che un modello<br />
non esiste.
L’algoritmo GSAT<br />
◮ GSAT è un altro algoritmo <strong>di</strong> ricerca locale <strong>per</strong> <strong>il</strong><br />
sod<strong>di</strong>sfacimento <strong>di</strong> insiemi <strong>di</strong> clausole;<br />
◮ GSAT è quasi uguale a WalkSAT, eccetto che non si usa <strong>il</strong><br />
parametro probab<strong>il</strong>istico p <strong>di</strong> WalkSAT, ma si o<strong>per</strong>a sempre in<br />
modo greedy. In altre parole, presa una clausola falsa, si<br />
apporta sempre la mo<strong>di</strong>fica che massimizza <strong>il</strong> numero <strong>di</strong><br />
clausole sod<strong>di</strong>sfatte dall’assegnazione <strong>di</strong> verità ottenuta;<br />
◮ Il problema dei minimi locali si affronta lanciano l’algoritmo<br />
più volte, partendo ogni volta da un’assegnazione casuale<br />
<strong>di</strong>versa.
Importanza della sod<strong>di</strong>sfacib<strong>il</strong>ità<br />
◮ Il problema della sod<strong>di</strong>sfacib<strong>il</strong>ità delle formule booleane è<br />
NP-completo (Cook 1971);<br />
◮ Vari importanti problemi si riducono alla sod<strong>di</strong>sfacib<strong>il</strong>ità <strong>di</strong><br />
formule booleane (puzzle <strong>di</strong> Sam Loyd, clique, knapsack, ...).