Agenti logici e logica proposizionale - inferenza e risoluzione
In questa pagina 9
Argomento del corso da 9 CFU. Fonte: slide del corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD.
Agenti basati sulla conoscenza
Un agente basato sulla conoscenza (knowledge-based agent) ha una base di conoscenza (KBKnowledge Base: insieme di enunciati scritti in un linguaggio formale, con cui l'agente rappresenta ciò che sa del mondo.) e un motore di inferenza che ne ricava conseguenze.
- La KB contiene i contenuti specifici del dominio; il motore usa algoritmi indipendenti dal dominio.
- Approccio dichiarativo: si dice all'agente cosa sa (Tell), poi gli si chiede cosa fare (Ask): la risposta deve seguire dalla KB. Non si programma "come" decidere.
- Due livelli di lettura: livello della conoscenza (cosa sa l'agente, a prescindere da come è realizzato) e livello di implementazione (strutture dati della KB e algoritmi che le manipolano).
L'agente deve saper rappresentare stati e azioni, incorporare nuove percezioni, aggiornare la rappresentazione del mondo, dedurre proprietà nascoste e azioni appropriate. Lo schema è un agente come quelli di Agenti intelligenti - ambienti, PEAS e tipi di agenteUn agente è una funzione dalle sequenze di percezioni alle azioni; è razionale se per ogni sequenza sceglie l'azione che massimizza il valore atteso della misura di prestazione, date le percezioni e la conoscenza incorporata. L'ambiente di lavoro si descrive con PEAS (Performance, Environment, Actuators, Sensors) e si classifica con sette coppie di proprietà (osservabile, deterministico, episodico, statico, discreto, singolo/multi-agente, noto). Le architetture crescono in complessità: reattivo semplice, reattivo basato su modello, basato su obiettivi, basato su utilità, più l'agente che apprende (elemento esecutivo, di apprendimento, critico, generatore di problemi).Agenti intelligenti - ambienti, PEAS e tipi di agente →, con la KB al posto della tabella o delle regole fisse:
def kb_agent(kb, percept, t): # t = contatore del tempo
kb.tell(make_percept_sentence(percept, t))
action = kb.ask(make_action_query(t))
kb.tell(make_action_sentence(action, t))
return action # il chiamante incrementa tIl mondo del Wumpus
Mondo giocattolo per provare il ragionamento logico: griglia con un mostro (Wumpus), pozzi, un tesoro.
| Misura di prestazione | oro , morte , per passo, per usare la freccia |
| Ambiente | caselle adiacenti al Wumpus puzzano (stench); adiacenti a un pozzo hanno brezza (breeze); luccichio (glitter) se e solo se l'oro è nella casella; sparare uccide il Wumpus se è davanti (una sola freccia); grab raccoglie l'oro se è nella casella |
| Attuatori | gira a sinistra, gira a destra, avanti, grab, release, shoot |
| Sensori | brezza, luccichio, puzza |
Caratterizzazione: parzialmente osservabile (solo percezioni locali), deterministico, sequenziale, statico (Wumpus e pozzi non si muovono), discreto, a singolo agente (il Wumpus è una caratteristica del mondo, non insegue l'agente).
Esplorazione. L'agente parte da , sicuro, senza percezioni: quindi e sono sicure. Va in e sente brezza: c'è un pozzo in (escluso), o . Torna e va in : sente puzza ma non brezza. Allora:
- niente brezza in : nessun pozzo in (né in ), quindi la brezza di viene da un pozzo in ;
- niente puzza in : il Wumpus non è in , quindi la puzza di viene da un Wumpus in .
Sono deduzioni che nessuna singola percezione dà: servono più percezioni combinate con le regole del mondo. (Nelle slide un indice è scritto "": è un refuso di .)
Logica, sintassi e semantica
Una logica è un linguaggio formale per rappresentare informazione in modo da trarne conclusioni corrette se l'informazione è corretta.
- Sintassi: quali sequenze di simboli sono enunciati. Esempio aritmetico: è un enunciato, no.
- Semantica: il significato, cioè la verità di un enunciato in un mondo. è vero se il numero non è minore di : vero in un mondo con , falso con .
- Un modello è un assegnamento di valori a tutti i simboli, cioè un "mondo possibile". Se è vero nel modello si dice che soddisfa .
Definizione (conseguenza logica, entailment). La KB implica logicamente , e si scrive , se e solo se è vero in tutti i modelli in cui la KB è vera.
Esempi. La KB con "Giovanni ha vinto" e "Maria ha vinto" implica "o Giovanni o Maria ha vinto". L'enunciato implica . È una relazione tra enunciati, definita attraverso i modelli. È ciò che serve all'agente: dedurre solo ciò che è vero in ogni mondo compatibile con la KB.
Logica proposizionale
È la logica più semplice. I simboli proposizionali sono enunciati atomici, veri o falsi. Se sono enunciati lo sono anche:
- (negazione);
- (congiunzione);
- (disgiunzione);
- (implicazione);
- (doppia implicazione, biconditional).
La semantica è composizionale: la verità di un enunciato complesso in un modello si calcola da quella dei componenti con le tavole dei connettivi (verificate con Python).
| V | V | F | V | V | V | V |
| V | F | F | F | V | F | F |
| F | V | V | F | V | V | F |
| F | F | V | F | F | V | V |
Attenzione a : è falso solo se è vero e falso. Dire vieta "piove e il pavimento è asciutto", ma ammette il pavimento bagnato senza pioggia (per un'altra causa). Se è falso l'implicazione è vera "a vuoto".
Equivalenze logiche. Due enunciati sono equivalenti () se hanno gli stessi modelli. Servono per trasformare le formule (tabella verificata con Python su tutte le righe):
| Equivalenza | Nome |
|---|---|
| , | commutatività |
| (idem per ) | associatività |
| doppia negazione | |
| contrapposizione | |
| eliminazione dell'implicazione | |
| eliminazione della doppia implicazione | |
| , | De Morgan |
| distributività di su | |
| distributività di su |
Un enunciato è valido (tautologia) se è vero in tutti i modelli, soddisfacibile se è vero in almeno uno, insoddisfacibile se in nessuno. Legame fondamentale, usato dalla risoluzione:
(Se avesse un modello, quel modello renderebbe vera la KB e falsa , contro la definizione di .)
Enunciati del mondo del Wumpus
Siano "c'è un pozzo in " e "c'è brezza in ". Sempre vero:
- (nessun pozzo nella casella di partenza);
- (brezza se e solo se c'è un pozzo adiacente);
- ;
- e così via per ogni casella: una frase per casella.
Dalle percezioni, con l'agente in (nessuna brezza) e poi in (brezza):
- ;
- .
La KB è . Domanda: ?
Inferenza per model checking
Dalla definizione di discende un algoritmo: (1) enumerare tutte le righe (assegnamenti ai simboli); (2) dove la KB è vera, controllare che anche lo sia.
Esempio. I simboli sono : simboli, modelli. La KB è vera solo in :
- impone falso; impone falso.
- con falso: deve essere falso, quindi F.
- impone vero; allora richiede vero. Con falso resta : le coppie possibili sono .
| F | V | F | F | F | F | V |
| F | V | F | F | F | V | F |
| F | V | F | F | F | V | V |
In tutti e i modelli è falso: sì (e anche , ). Invece non è conseguenza (è falso nel secondo e nel terzo modello), e neppure (falso nel secondo): l'agente non può concludere nulla di sicuro su quelle caselle, ed è giusto non entrarci.
from itertools import product
syms = ["B11", "B21", "P11", "P12", "P21", "P22", "P31"]
def kb(m):
return (not m["P11"] # R1
and m["B11"] == (m["P12"] or m["P21"]) # R2
and m["B21"] == (m["P11"] or m["P22"] or m["P31"]) # R3
and not m["B11"] and m["B21"]) # R4, R5
modelli = [dict(zip(syms, v)) for v in product([False, True], repeat=7)]
buoni = [m for m in modelli if kb(m)]
print(len(modelli), len(buoni)) # 128 3
print(all(not m["P12"] for m in buoni)) # TrueIl model checking è corretto e completo ma costa con simboli: inutilizzabile appena la KB cresce.
Inferenza per risoluzione
Idea: dimostrazione per assurdo. Per mostrare si mostra che è insoddisfacibile (nessun mondo la rende vera): allora è vera.
Forma normale congiuntiva (CNF)
Un letterale è un simbolo o la sua negazione; una clausola è una disgiunzione di letterali; la CNF (conjunctive normal form) è una congiunzione di clausole, per esempio . Ogni enunciato proposizionale si converte in CNF con quattro passi.
Esempio sulla regola : .
- Eliminare , sostituendo con :
- Eliminare , sostituendo con :
- Portare all'interno con De Morgan e doppia negazione: :
- Distribuire su e appiattire: , quindi
Tre clausole. Con , che ha tre simboli a destra, ne escono quattro: (controllato con sympy).
Regola di risoluzione
Regola di risoluzione. Date due clausole con letterali complementari e : la risolvente contiene tutti i letterali tranne la coppia complementare.
Esempio: da e si ottiene . La regola è corretta: in ogni modello che rende vere le due clausole, e non possono esserlo entrambi, quindi una delle due clausole deve essere vera grazie a un altro letterale, che compare nella risolvente.
Casi particolari: risolvendo e si ottiene la clausola vuota , che è sempre falsa e quindi segnala una contraddizione. Una risolvente con una coppia complementare () è una tautologia e si scarta.
Algoritmo
def risoluzione(kb_clausole, alfa_negata):
clausole = set(kb_clausole) | {alfa_negata} # clausole = frozenset di letterali
while True:
nuove = set()
for ci, cj in coppie(clausole):
for r in risolventi(ci, cj): # una per ogni coppia complementare
if not r: # clausola vuota
return True # KB |= alfa
nuove.add(r)
if nuove <= clausole: # niente di nuovo
return False # KB non implica alfa
clausole |= nuoveTermina perché i simboli sono finiti, quindi le clausole distinte sono finite. È corretta e completa per refutazione: se è insoddisfacibile, la clausola vuota viene prima o poi derivata.
Esempio: nessun pozzo in
L'agente è in e non sente brezza. Si può inferire che non c'è un pozzo in ?
Si deve mostrare che è insoddisfacibile. Clausole in CNF:
| clausola | origine | |
|---|---|---|
| percezione | ||
- e (complementari e ) danno .
- e (complementari e ) danno .
Quindi è insoddisfacibile e , come col model checking. (Le altre coppie danno clausole sempre vere, per esempio con su dà , che si scarta.) Il vantaggio rispetto al model checking: si lavora solo sulle clausole rilevanti, senza enumerare modelli.
Pregi e limiti
- La logica proposizionale è dichiarativa (frammenti di sintassi corrispondono a fatti), ammette informazione parziale, disgiuntiva e negata (a differenza di molti database), è composizionale e indipendente dal contesto (a differenza del linguaggio naturale).
- Ha però espressività molto limitata: per dire "i pozzi causano brezza nelle caselle adiacenti" serve una frase per ogni casella. La Logica del primo ordine - unificazione, forward e backward chainingLogica del primo ordine (oggetti, relazioni, funzioni, quantificatori e errori tipici), sostituzioni, istanziazione universale ed esistenziale (Skolem), proposizionalizzazione e suoi limiti, unificazione con occur check, risoluzione nel primo ordine con conversione in CNF, esempio Criminal(West), clausole definite, forward e backward chaining, ingegneria della conoscenza.Logica del primo ordine - unificazione, forward e backward chaining → aggiunge oggetti, relazioni e quantificatori per scrivere una regola sola. Quando la KB ha solo clausole con al più un letterale positivo (clausole di Horn) l'inferenza si fa in modo molto più efficiente, ed è il caso di Prolog - fatti, regole, ricorsione, liste e cutProlog come logica del primo ordine ristretta alle clausole di Horn: fatti, regole, query, motore di inferenza (backward chaining in profondità con backtracking, ordine delle clausole), termini, unificazione e occur check, aritmetica con is, ricorsione, liste e operatore barra, length e append, cut verde e rosso, cut e fail, negazione come fallimento.Prolog - fatti, regole, ricorsione, liste e cut →.
Per ragionare con incertezza (se non si sa se il pozzo c'è, ma con quale probabilità) si passa a Incertezza - probabilità, regola di Bayes e indipendenza condizionataUn agente con osservazioni parziali non può usare regole logiche rigide ("mal di denti implica carie" è falso): usa la probabilità come grado di credenza e, con la teoria dell'utilità, sceglie l'azione con utilità attesa massima. Strumenti: distribuzione congiunta completa (tabella di $2^n$ valori), marginalizzazione $P(Y\mid e)=\alpha\sum_h P(Y,e,h)$ con costante di normalizzazione $\alpha=1/P(e)$, regola del prodotto $P(a,b)=P(a\mid b)P(b)$, regola di Bayes $P(\text{causa}\mid\text{effetto})=\frac{P(\text{effetto}\mid\text{causa})P(\text{causa})}{P(\text{effetto})}$ e indipendenza condizionata $P(a,b\mid c)=P(a\mid c)P(b\mid c)$, che permette di scomporre la congiunta in tabelle più piccole. Un test con sensibilità 73% e falsi positivi 12% su una malattia con prior 1/700 dà una probabilità a posteriori di appena 0,9%.Incertezza - probabilità, regola di Bayes e indipendenza condizionata →. I connettivi e le tavole di verità sono gli stessi dell'algebra booleana (Algebra di Boole - assiomi, teoremi e complemento di una funzioneL'algebra di Boole opera su variabili a due valori con AND, OR, NOT. Identità fondamentali (neutro, idempotenza, complemento, commutativa, associativa, distributiva in entrambe le forme), dualità (si scambiano AND/OR e 0/1), De Morgan $\overline{X+Y}=\overline X,\overline Y$, assorbimento $X+XY=X$, $X+\overline XY=X+Y$, adiacenza $XY+X\overline Y=X$, consenso $XY+\overline XZ+YZ=XY+\overline XZ$. Si dimostrano per induzione perfetta (tabella) o algebricamente. Il complemento di una funzione si ottiene con De Morgan o con duale + negazione dei letterali. Costo: numero di letterali o di ingressi delle porte.Algebra di Boole - assiomi, teoremi e complemento di una funzione →) e dei quantificatori in Logica e quantificatoriProposizioni, connettivi, predicati e quantificatori (per ogni, esiste), con le regole per negarli.Logica e quantificatori →.
Domande d'esame
- La KB è . Vale ? Sì: la KB è vera solo con vero, quindi vero, quindi vero, e in quell'unico modello è vera. Con la risoluzione: CNF , , , più ; con dà , con dà , con dà .
- Quanti modelli su ha ? : con vero serve vero ( libero, modelli); con falso serve vero ( libero, modelli). Totale su .
- Risolvere e . La risolvente è (si elimina la coppia complementare e e si uniscono i letterali restanti). Non è la clausola vuota, quindi qui non c'è contraddizione.
- è valida? No: con falso e vero l'antecedente è vero e il conseguente è falso, quindi l'intera formula è falsa. (Scambiare un'implicazione con il suo inverso è l'errore di "affermare il conseguente".)
Versione ripasso
- Agente basato sulla conoscenza: KB (enunciati) più motore di inferenza (algoritmi generali). Ciclo:
tell(percezione),ask(azione),tell(azione), . Approccio dichiarativo: si dice cosa si sa, la decisione segue dalla KB. Vedi Agenti intelligenti - ambienti, PEAS e tipi di agenteUn agente è una funzione dalle sequenze di percezioni alle azioni; è razionale se per ogni sequenza sceglie l'azione che massimizza il valore atteso della misura di prestazione, date le percezioni e la conoscenza incorporata. L'ambiente di lavoro si descrive con PEAS (Performance, Environment, Actuators, Sensors) e si classifica con sette coppie di proprietà (osservabile, deterministico, episodico, statico, discreto, singolo/multi-agente, noto). Le architetture crescono in complessità: reattivo semplice, reattivo basato su modello, basato su obiettivi, basato su utilità, più l'agente che apprende (elemento esecutivo, di apprendimento, critico, generatore di problemi).Agenti intelligenti - ambienti, PEAS e tipi di agente →. - Wumpus: parzialmente osservabile, deterministico, sequenziale, statico, discreto, singolo agente. Sensori: brezza, luccichio, puzza. Da percezioni in più caselle si deducono pozzi e Wumpus (niente brezza in esclude il pozzo in , quindi la brezza di viene da ).
- Conseguenza logica: se è vero in tutti i modelli in cui la KB è vera. Modello = assegnamento a tutti i simboli.
- Connettivi: . è falso solo con vero e falso; con falso è vera "a vuoto".
- Equivalenze: ; ; De Morgan; distributività di su .
- Legame: insoddisfacibile.
- Wumpus: ; ; ; ; .
- Model checking: si enumerano i modelli. Qui simboli, modelli, KB vera in ( vero, , il resto falso). è falso in tutti: . e non seguono. Corretto e completo, costo .
- CNF (congiunzione di clausole, clausola = disgiunzione di letterali): 1 eliminare ; 2 eliminare ; 3 portare dentro (De Morgan); 4 distribuire su . dà .
- Risoluzione: da e si ottiene l'unione dei resti. Corretta; (clausola vuota) = contraddizione; si scartano le tautologie. Completa per refutazione, termina (clausole finite).
- Esempio: con dà ; con () dà . Quindi .
- I modelli della KB (si ricavano a mano): danno e falsi; con falso dà F; e danno vero: . Quindi , ma non né : l'agente non entra in né in senza altri dati.
- Codice:
modelli = [dict(zip(syms, v)) for v in product([False, True], repeat=7)],buoni = [m for m in modelli if kb(m)],all(not m["P12"] for m in buoni)dàTrue. - Algoritmo di risoluzione:
clausole = KB + {¬α}; si risolvono tutte le coppie con letterali complementari; se compare , ; se non esce nulla di nuovo, no. Termina (clausole finite). - CNF di : : una clausola lunga più una per ogni pozzo adiacente.
- Tavola di e : = V,F,V,V per (VV, VF, FV, FF); = V,F,F,V. Pioggia PavimentoBagnato vieta "piove e asciutto", ma ammette bagnato senza pioggia.
- Domande tipiche: sì; ha modelli su ; risolvente di e è ; non è valida ( falso, vero).
- Limiti: poca espressività (una frase per casella); da qui la Logica del primo ordine - unificazione, forward e backward chainingLogica del primo ordine (oggetti, relazioni, funzioni, quantificatori e errori tipici), sostituzioni, istanziazione universale ed esistenziale (Skolem), proposizionalizzazione e suoi limiti, unificazione con occur check, risoluzione nel primo ordine con conversione in CNF, esempio Criminal(West), clausole definite, forward e backward chaining, ingegneria della conoscenza.Logica del primo ordine - unificazione, forward e backward chaining →. Con clausole di Horn l'inferenza è efficiente (Prolog - fatti, regole, ricorsione, liste e cutProlog come logica del primo ordine ristretta alle clausole di Horn: fatti, regole, query, motore di inferenza (backward chaining in profondità con backtracking, ordine delle clausole), termini, unificazione e occur check, aritmetica con is, ricorsione, liste e operatore barra, length e append, cut verde e rosso, cut e fail, negazione come fallimento.Prolog - fatti, regole, ricorsione, liste e cut →).
- Errori tipici: leggere come "se e solo se"; dimenticare di negare prima di risolvere; non scartare le tautologie; scambiare un'implicazione con la sua inversa.
Esercizi su questo argomento
- Esercizio - Conversione in CNF e risoluzione proposizionale (slide del corso)
- Esercizio - Forma normale congiuntiva dell'equivalenza con una disgiunzione (esempio d'esame 2)
- Esercizio - Logica proposizionale e logica del primo ordine a confronto (esempio d'esame 1)
- Esercizio - Tabelle di verità, equivalenze e model checking (slide del corso)