laurea magistrale in “cinema e media” corso di ...vincenzo/rea1415/dispensa-rea_3.pdf ·...

23
1 Laurea Magistrale in “Cinema e Media” Corso di “Rappresentazione e Algoritmi” 2014-15 Modulo I - 6 CFU mutuato da Laurea Magistrale in “Scienze del Corpo e della Mente” 6 CFU Laurea Magistrale in “Scienze della Mente” Corso di “Intelligenza artificiale” 2013-14 Modulo I - 4 CFU Vincenzo Lombardo Note per il corso Queste note per i corsi di “Rappresentazione e algoritmi” sono parte del programma d’esame 2014/15. L’idea di scrivere le note scaturisce dalla considerazione che, essendo frequentato il corso anche da studenti provenienti da altre sedi in Italia o all’estero, spesso la preparazione di base dell’informatica non è sufficiente per affrontare lo studio dei testi adottati (come da guida degli studi). Dopo una ricerca sul web di testi e dispense possibili, mi sono convinto che sono tutti pensati per scopi diversi da un corso nell’ambito dei media o della psicologia. Gli esempi riportati, la presentazione degli argomenti, l’obiettivo a cui è destinato lo studio non sono familiari agli studenti di “Cinema e media” e di “Scienze del Corpo e della Mente”. Capitolo 3 La logica proposizionale Commenti benvenuti! Aggiornamento: 31 ottobre 2017 (grazie ai commenti di Domenico Bruzzese, Roberta Tudisco, Beatrice Osella, Nicola Benvenuti)

Upload: others

Post on 12-Oct-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

1

Laurea Magistrale in “Cinema e Media”

Corso di “Rappresentazione e Algoritmi” 2014-15 Modulo I - 6 CFU

mutuato da

Laurea Magistrale in “Scienze del Corpo e della Mente” 6 CFU

Laurea Magistrale in “Scienze della Mente” Corso di “Intelligenza artificiale” 2013-14

Modulo I - 4 CFU

Vincenzo Lombardo

Note per il corso

Queste note per i corsi di “Rappresentazione e algoritmi” sono parte del programma d’esame 2014/15. L’idea di scrivere le note scaturisce dalla considerazione che, essendo frequentato il corso anche da studenti provenienti da altre sedi in Italia o all’estero, spesso la preparazione di base dell’informatica non è sufficiente per affrontare lo studio dei testi adottati (come da guida degli studi). Dopo una ricerca sul web di testi e dispense possibili, mi sono convinto che sono tutti pensati per scopi diversi da un corso nell’ambito dei media o della psicologia. Gli esempi riportati, la presentazione degli argomenti, l’obiettivo a cui è destinato lo studio non sono familiari agli studenti di “Cinema e media” e di “Scienze del Corpo e della Mente”.

Capitolo 3 La logica proposizionale

Commenti benvenuti!

Aggiornamento: 31 ottobre 2017

(grazie ai commenti di Domenico Bruzzese, Roberta Tudisco, Beatrice Osella, Nicola Benvenuti)

2

Capitolo 3

La logica proposizionale

Dopo aver compreso come si può scrivere un motore algoritmico comune che ricerca la soluzione di un problema, in questo capitolo ci occupiamo invece della rappresentazione della conoscenza. In questo modo, allarghiamo i nostri orizzonti, dalla conoscenza specifica di uno stato del mondo (ad esempio, lo stato iniziale del problema o altri stati che si possono raggiungere grazie alle azioni) alla conoscenza generica (il cosiddetto modello del mondo, che permette di comprendere il mondo nei termini che non sono compresi nella formulazione specifica di un problema). Ad esempio, la soluzione del problema dei missionari e dei cannibali, come codificato in precedenza, non codifica il fatto che la barca non possa viaggiare da sola; non succederà mai che la barca viaggi con 0 passeggeri solo perché non vi sono azioni che lo consentano, ma manca la consapevolezza su questa conoscenza, in modo da poterla utilizzare in altre occasioni (le barche non viaggiano mai da sole). La conoscenza generica sul mondo rende espliciti quegli stati, regole, vincoli, … - a seconda del tipo di conoscenza avranno nomi diversi - , che non sono già rappresentati dagli stati e dalle azioni di un problema. Un agente che possiede la conoscenza del mondo sa comportarsi in un ambiente noto solo parzialmente (come avviene per gli esseri umani, del resto); colma la mancanza di riscontri immediati (quelli ottenuti dalla percezione) con le inferenze che è in grado di compiere grazie alla conoscenza. Per fare questo salto concettuale, non possiamo escogitare, per ogni problema, una formalizzazione ad hoc. La rappresentazione della conoscenza necessita di un linguaggio di rappresentazione adeguato: da un lato, deve essere sufficientemente espressivo da rappresentare la conoscenza del mondo, dall’altro deve consentire forme di ragionamento automatico, che si realizzano applicando gli algoritmi di ricerca nello spazio degli stati alle frasi espresse nel linguaggio formale. Il linguaggio formale che si è dimostrato efficace, ancorché con dei limiti nel potere espressivo e nell’applicazione degli algoritmi per il ragionamento, è la logica. Vedremo due formalismi logici, che hanno un diverso potere espressivo: la più semplice logica proposizionale e la più articolata ed espressiva logica dei predicati. Cominciamo dalla logica proposizionale.

Indice

1. La base di conoscenza 2. Introduzione alla logica 3. Logica proposizionale 4. Inferenza per enumerazione dei modelli 5. Inferenze mediante applicazione di regole

3

1. La base di conoscenza Riprendiamo il programma che abbiamo considerato nel capitolo precedente, che calcola la prossima azione da eseguire sulla base della conoscenza o modello del mondo e delle sue azioni, tenendo presente il suo obiettivo.

Abbiamo compreso che la quadrupla <S0, G, A, C> codifica la conoscenza dichiarativa: in particolare, lo stato iniziale e la funzione di costo codificano il modello del mondo, il goal test codifica gli obiettivi, l’insieme A codifica tutte le azioni possibili. In qualche modo, la quadrupla compila tutta la conoscenza dichiarativa in una modalità funzionale al raggiungimento della soluzione mediante una ricerca nello spazio degli stati. Questo capitolo rende ancora più esplicito l’uso della conoscenza allo scopo di trovare una soluzione. Si introduce una modalità unica, che permette di rappresentare la conoscenza in modo dichiarativo e codificare in tale modalità tutti gli elementi necessari alla risoluzione di un problema. Questa prospettiva utilizza le cosiddette basi di conoscenza (o Knowledge Base – KB). La KB rappresenta la conoscenza generale sul mondo (“Il giorno si alterna alla notte.”, anche nella forma “La Terra compie una rotazione sul proprio asse in 24 ore.”), sulle azioni (“Prendere un oggetto con una mano produce come risultato di avere l’oggetto in mano.”), eventualmente sull’agente stesso (“L’agente può spostarsi su un piano.”) e la conoscenza dei fatti contingenti sul mondo e sull’agente (“Sebastian Vettel è un pilota di Formula 1”, “L’agente ha in mano una lancia”). La KB è un insieme di enunciati (frasi, affermazioni), scritti in un linguaggio formale. La KB viene consultata (letta) e ampliata (scritta) dal Motore Inferenziale, una componente algoritmica invariante dell’agente (cioè non cambia con il contenuto della KB), che è in grado di inferire nuova conoscenza a partire dalla conoscenza contenuta nella KB. Il Motore Inferenziale funziona come un algoritmo di ricerca nello spazio degli stati, solo che stavolta gli stati e le azioni sono insieme alla conoscenza generale del mondo e dell’agente nella KB; quindi, il Motore è indipendente dalla conoscenza specifica e funziona sempre nello stesso modo sia per un agente che sa muoversi in autonomia sul pianeta Marte e inviare fotografie e video di ciò che incontra sia per un agente che gioca a scacchi. KB e Motore Inferenziale costituiscono il pensiero dell’agente; il resto è il processo decisionale e la

4

comunicazione con l’esterno, ad esempio mediante sensori e attuatori. In particolare, il programma deve 1) scrivere ciò che sa nella KB (ad esempio, un enunciato che rappresenta i percetti acquisiti dai sensori) - si usa una funzione primitiva che chiamiamo tell, cioè dire alla KB ciò che si sa; 2) leggere ciò che deve fare (ad esempio, l’azione da eseguire, che è stata inferita) - si usa una funzione primitiva che chiamiamo ask, cioè chiedere alla KB qualcosa che essa sa (o che può inferire dalla conoscenza). Questo nuovo agente, si può realizzare secondo il seguente algoritmo:

sequenza_azioni agente_basato_su_KB (input p) static KB (una base di conoscenza) t (contatore, inizialmente 0, indica il tempo) tell(KB, input_to_sentence(p, t)) sequenza_azioni ← ask(KB, action_sequence_query(t)) tell(KB, actions_to_sentence(sequenza_azioni, t)) t ← t + 1 return sequenza_azioni;

L’agente basato su KB è una funzione che prende un input p e restituisce una sequenza di azioni da eseguire (eventualmente nulla, se non si trova la soluzione – si trascurano qui i dettagli di questi aspetti). La KB, dove si legge e si scrive la conoscenza è una memoria permanente, che viene mantenuta anche nel tempo tra due chiamate della funzione; la variabile t è un contatore (0, 1, 2, …), posto inizialmente a 0, che tiene conto del passare del tempo. Si noti che non si lavora con nessuna unità di misura (secondi, minuti, …), ma l’aumento del contatore indica che è passata un’unità temporale significativa (anche un decennio, si pensi al racconto in un film). Per prima cosa, il programma scrive nella KB un enunciato, nel linguaggio formale della KB, che corrisponde all’acquisizione dell’input (ad esempio nel caso di un sensore visivo, si acquisisce la distribuzione spaziale degli oggetti intorno alla posizione): in questo modo il programma può prendere in considerazione anche il nuovo input nel fare le inferenze che lo portano a determinare l’azione da eseguire; la subroutine (che noi assumiamo come primitiva) è la input_to_sentence(p, t), che costruisce l’enunciato a partire dall’input e dal tempo attuale; si potrebbe dire che l’enunciato sia qualcosa del tipo “ho acquisito l’input p a tempo t” (il tempo è necessario per distinguere input uguali a tempi diversi); la funzione tell prende l’enunciato elaborato dalla input_to_sentence e lo aggiunge alla KB. A questo punto, il programma chiede alla KB l’azione da eseguire: la primitiva action_sequence_query(t) si occupa proprio di impacchettare una richiesta alla KB per una sequenza di azioni (una query, come nel linguaggio delle basi di dati). Con l’aiuto del motore inferenziale, la KB restituisce la sequenza di azioni da eseguire. L’agente inserisce anche questa azione, o meglio un enunciato che ne rappresenta l’esecuzione a tempo t (elaborato dalla primitiva actions_to_sentence(sequenza_azioni, t)) nella KB. Infine, si aggiorna il contatore del tempo e si restituisce l’azione, che viene inviata agli attuatori per l’esecuzione. La KB, corredata del motore inferenziale, deve essere in grado, da un lato (quello statico, la KB vera e propria) di rappresentare tutta la conoscenza di interesse, generale (ad esempio, proprietà del mondo) e specifica (stati del mondo, percetti e azioni), e dall’altro (quello dinamico, il motore inferenziale) la capacità di aggiornare lo stato del mondo, dedurre le azioni da eseguire, dedurre proprietà nascoste del

5

mondo. La KB deve essere espressa in un linguaggio formale sufficientemente espressivo da riuscire a rappresentare la conoscenza di interesse e manipolabile da un motore inferenziale (un algoritmo), che lavora sul linguaggio stesso, in grado di dedurre nuova conoscenza e aggiornare lo stato del mondo. Esempio: il mondo del wumpus [Russell, Norvig] Prima di introdurre il linguaggio, introduciamo un esempio, in modo da comprendere la conoscenza e le capacità da formalizzare. L’esempio è il mondo del wumpus. E’ un gioco al computer, un tempo realizzato mediante linea di comando: sulle linee si leggevano i risultati della percezione e sulle linee si scrivevano le azioni dell’agente, impersonato dal giocatore. L’ambiente del gioco è il seguente.

L’ambiente è suddiviso in celle in una struttura a matrice. L’obiettivo per l’utente, che parte da una cella di ingresso ([1,1]) è trovare l’oro (il lingotto con la G di gold in figura), che si trova in una delle celle, ma deve affrontare alcuni pericoli:

• in alcune celle ci possono essere pozzi profondi (P – pit, cerchi neri in figura), in cui si può precipitare, senza possibilità di uscita;

• in una cella si trova il wumpus (W), un mostro che divora coloro che capitano nella sua cella.

Per fortuna dell’utente, i pericoli sono annunciati nelle celle adiacenti (destra, sinistra, sopra, sotto, non in diagonale) da alcuni segnali: i pozzi producono correnti d’aria (B – breeze) e il wumpus fa sentire la sua puzza (S – stench). L’utente può girarsi verso destra (R – right turn), andare in avanti (F – forward), prendere l’oro (G – grab): cioè, l’utente ha una direzione di marcia (UP, DOWN, RIGHT, LEFT), che cambia ruotando verso destra (R), mentre F fa avanzare in una cella adiacente nella direzione di marcia. Riassumendo, abbiamo il seguente mondo:

• Input: Percetti (dai Sensori): puzza (S – stench), corrente d’aria (B – breeze); • Output: Azioni (agli Attuatori): gira verso destra (R – right turn), avanti (F –

forward), prendi (G – grab); • Regole del gioco:

• Celle adiacenti al Wumpus sono puzzolenti (S – stench);

6

• Celle adiacenti ai Pozzi (P – pit) sono ventose (B – breeze); • Prendere (G – grab) preleva l’oro se si è nella stessa cella.

Ora esploriamo un po’ il mondo del wumpus, con l’obiettivo di muoverci sempre in celle sicure; assumiamo cioè di riuscire a ragionare sul mondo per capire quali sono le celle sicure. Percetti, azioni, posizione attuale, la direzione di marcia e lo stato del mondo (cella sicura: ok[i,j], sospetto pozzo: P?[i,j], sicuro pozzo: P[i,j], sospetto wumpus: W?[i,j], sicuro wumpus: W[i,j], oro afferrato: O) finiscono anch’essi nella KB. Introduciamo il tempo nei passi successivi. Tempo t = 0 (stato iniziale) Posizione attuale agente s = <[1,1], 0>; Direzione di marcia d = <UP, 0>; Percetto p = <NULL, 0> KB = {<ok[1,1], 0>, <ok[2,1], 0>, <ok[1,2], 0>} Sequenza azioni = <F, 0> All’inizio (tempo 0), l’agente si trova in [1,1], con direzione di marcia verso l’alto (UP), non percepisce nulla (NULL) e deduce che la cella stessa e le due celle adiacenti siano sicure (ok[i,j]). Decide che l’azione da eseguire sia andare avanti (F), portandosi nella cella sicura [2,1]. Tempo t = 1 Posizione attuale agente s = <[2,1], 1>; Direzione di marcia d = <UP, 1>; Percetto p = <B, 1>; KB = KB ∪ {<P?[3,1], 1>, <P?[2,2], 1>} Sequenza azioni = <R, 1>, <R, 1>, <F, 1>, <R,

1>, <R, 1> <R, 1>, <F, 1> Nella cella [2,1], l’agente percepisce una corrente d’aria (B), sospetta (facendo una deduzione) pozzi nelle celle adiacenti (potrebbero esserci entrambi o solo uno dei due) e decide che l’azione migliore sia tentare un’altra strada, tornando indietro verso l’altra cella sicura trovata prima ([1,2]). Per far questo, deve girarsi due volte verso destra (R), andare avanti (F), ancora tre volte verso destra e ancora avanti. Tempo t = 2 Posizione attuale agente s = <[1,2], 2>; Direzione di marcia d = <RIGHT, 2>; Percetto p = <S, 2>; KB = KB ∪ {<ok[2,2], 2>, <P[3,1], 2>,

<W[1,3], 2>} Sequenza azioni = <R, 2>, <R, 2>, <R, 2>, <F, 2> In [1,2] si percepisce puzza (S) e si deduce immediatamente che ci deve essere il wumpus in [1,3] (se fosse stato in [2,2], avrebbe già sentito la puzza in [2,1]); deduce anche che dei pozzi sospetti, è sicuro quello in [3,1], perché sicuramente non c’è in

7

[2,2] (altrimenti avrebbe sentito la puzza in [1,2] anche); infine, deduce che [2,2] è una cella sicura. Decide di andare verso la nuova cella sicura [2,2], facendo tre giri verso destra e un avanti. Tempo t = 3 Posizione attuale agente s = <[2,2], 3>; Direzione di marcia d = <UP, 3>; Percetto p = <NULL, 3>; KB = KB ∪ {<ok[3,2], 3>, <ok[2,3], 3>} Sequenza azioni = <R, 3>, <F, 3> In [2,2], non percependo nulla, deduce che anche [3,2] e [2,3] sono sicure, e decide di proseguire verso una delle due, la [2,3]. Tempo t = 4 Posizione attuale agente s = <[2,3], 4>; Direzione di marcia d = <RIGHT, 4>; Percetto p = <B, 4>, <S, 4>; KB = KB ∪ {<P?[2,4], 4>, <P?[3,3], 4>} Sequenza azioni = <R, 4>, <R, 4>, <F, 4>, <R, 4>, <F, 4> Nella cella [2,3] percepisce, ovviamente, la puzza del wumpus che si trova in [1,3] (avrebbe potuto prevederlo, ma non l’ha fatto), e una corrente d’aria (B), sospettando quindi pozzi in [3,3] e [2,4]. Si noti che, anche se la cella [3,2] è sicura per essere visitata, non è detto che non ci sia una brezza; anzi, la brezza ci sarà di sicuro perché provocata almeno dal pozzo in [3,1]. Decide quindi di visitare la cella sicura in [3,2], girandosi due volte verso destra, andando avanti, girandosi una volta a destra e ancora avanti. Tempo t = 5 Posizione attuale agente s = <[3,2], 5>; Direzione di marcia d = <UP, 5>; Percetto p = <B, 5>, <G, 5>; KB = KB ∪ {} Sequenza azioni = <G, 5> In [3,2], l’agente percepisce una corrente d’aria, sicuramente per la presenza del pozzo in [3,1], ma possibilmente anche per la sospetta presenza di un pozzo in [3,3], e anche un luccichio (G), che segnala la presenza dell’oro nella cella. L’agente decide (anch’essa una deduzione) di eseguire l’azione di prendere (G – grab), entrando così in possesso dell’oro.

8

Tempo t = 6 Posizione attuale agente s = <[3,2], 6>; Direzione di marcia d = <UP, 6>; Percetto p = <B, 6>; KB = KB ∪{<O, 6>} Sequenza azioni = <R, 6>, <R, 6>, <F, 6> Il possesso dell’oro è rappresentato dallo stato O; ora l’unico percetto in [3,2] è la corrente d’aria; l’agente decide di tornare verso l’uscita, in particolare verso la cella sicura già visitata [2,2]. Tempo t = 7 Posizione attuale agente s = <[2,2], 7>; Direzione di marcia d = <DOWN, 7>; Percetto p = <NULL, 7>; KB = KB ∪ {} Sequenza azioni = <F, 7> Si torna quindi ancora indietro verso [1,2]. Tempo t = 8 Posizione attuale agente s = <[1,2], 8>; Direzione di marcia d = <DOWN, 8>; Percetto p = <S, 8>; KB = KB ∪ {} Sequenza azioni = <R, 8>, <F, 8> Con un’ultima azione di giro verso destra e avanzata si arriva a [1,1]. Tempo t = 9 Posizione attuale agente s = <[1,1], 9>; Direzione di marcia d = <LEFT, 8>; Percetto p = <NULL, 9>; KB = KB ∪ {} Sequenza azioni = <STOP, 9> In questa simulazione, abbiamo eseguito alcune delle possibili deduzioni e azioni dell’agente. Il lettore potrebbe eseguire una simulazione più accurata, deducendo tutto il possibile (abbiamo già fatto notare che alcuni risultati della percezione si sarebbero potuti anticipare, anche se il tipo di enunciato sarebbe dovuto essere distinto da quello della percezione vera e propria). Ora introduciamo un linguaggio formale che permette di rappresentare la conoscenza insieme con un meccanismo di inferenza che permetta di eseguire le deduzioni che abbiamo qui compiuto. In realtà, introduciamo due linguaggi formali, due cosiddette logiche, di diverso potere espressivo e inferenziale.

9

2. Introduzione alla logica La logica, o meglio le logiche (dato che ce ne sono tante), sono linguaggi formali che rappresentano la conoscenza in modo tale che si possano trarre delle inferenze, cioè conoscenze nuove deducibili in modo sicuro dalle conoscenze in possesso dell’agente. Come tutti i linguaggi, anche per una logica, si definiscono sintassi e semantica. La sintassi, con le sue regole, definisce quali sono le frasi ben formate del linguaggio, cioè le frasi che è possibile interpretare, alle quali cioè si può assegnare un significato; la semantica definisce il significato delle frasi ben formate. La semantica delle logiche che prenderemo in considerazione si dice basata sul valore di verità degli enunciati (truth-value based) rispetto a un mondo di riferimento, cioè a ogni enunciato (o frase del linguaggio) si assegna il valore vero o falso. Ad esempio, nel linguaggio implicito utilizzato per definire gli stati del problema dei missionari e dei cannibali (capitolo 2),

• l’enunciato (cioè lo stato) <3, 3, 1> è corretto sintatticamente; • l’enunciato <3, 3, 1, 0> è scorretto sintatticamente, per numero di componenti

nel secondo caso; • nello stato iniziale, l’enunciato <M, 3, 1> è vero se e solo se M=3 è vero;

A differenza dei linguaggi naturali, i linguaggi formali devono consentire le deduzioni automatiche, cioè dei meccanismi che permettono di dedurre nuova conoscenza a partire da quella già in nostro possesso. A tale scopo, introduciamo alcune nozioni rilevanti. Per conseguenza logica si intende che un enunciato segue da un altro enunciato o da un insieme di enunciati. Con l’espressione

𝑲𝑩 ⊨ 𝜶 si intende che la base di conoscenza KB ha come conseguenza logica l’enunciato α. Si afferma inoltre che KB ha come conseguenza logica se e solo se α è vera in tutti i mondi in cui è vera KB. Ad esempio, la KB che contiene gli enunciati

• “Giorgio ha preso il coltello” • “La cucina è al buio”

ha come conseguenza logica che “Giorgio ha preso il coltello e la cucina è al buio” (la cosiddetta congiunzione dei due enunciati, vedi dopo). Allo stesso modo, nel linguaggio del problema dei missionari e dei cannibali la KB data dallo stato

<2, 3, 1> ha come conseguenza logica <1, 0, 0> La conseguenza logica è una relazione tra gli enunciati che è basata sulla semantica. Finora abbiamo parlato genericamente di mondi per definire la semantica. Tuttavia, per definire la semantica dei linguaggi logici ci si riferisce in generale alle astrazioni dei mondi, dette modelli. Un modello rappresenta solo una parte della conoscenza su un mondo, in generale la conoscenza che è di interesse per la soluzione di un

10

problema. Il modello è strutturato in modo formale da consentire la valutazione del valore di verità. Si dice che

“m è un modello per l’enunciato α se α è vera nel modello m”. e indichiamo con M(α) l’insieme di tutti i modelli di α. Riprendendo la definizione precedente, si può dire che KB ha come conseguenza logica l’enunciato α se e solo se α è vera in tutti i modelli in cui è vera KB, cioè se tutti i modelli di KB sono anche modelli di α. Si scrive

𝑲𝑩 ⊨ 𝜶 sse 𝐌(𝐊𝐁) ⊆ 𝐌(𝛂) dove sse sta per “se e solo se”. Questa espressione indica delle condizioni necessarie e sufficienti: cioè si intende che se KB ha come conseguenza logica α, allora i modelli di KB sono necessariamente modelli di α, e anche che se i modelli di KB sono anche modelli di α, allora KB ha come conseguenza logica α. Graficamente, si indica nel modo seguente:

Ad esempio, tutti i modelli che rendono vera la KB costituita dall’enunciato “Giorgio ha preso il coltello e la cucina è al buio” rendono vero anche l’enunciato “Giorgio ha preso il coltello”. Connessa alla nozione di conseguenza logica è la nozione di inferenza. Con l’espressione

𝑲𝑩 ⊢𝒊 𝜶 si intende che l’enunciato a possa essere derivato da KB mediante la procedura i-esima. Mentre la conseguenza logica stabilisce il “cosa”, cioè una relazione tra enunciati, la procedura di inferenza stabilisce il “come”, cioè una procedura effettiva per derivare una conseguenza logica a partire da una KB. Di procedure di inferenza ne possono esistere molte; ecco perché si usa l’indice i per indicarne una. Una procedura di inferenza, per essere di interesse, deve essere corretta e completa. Per correttezza, si intende la seguente proprietà:

La procedura di inferenza i-esima è corretta se ogni enunciato a, derivato dalla KB mediante la procedura i-esima, cioè 𝐾𝐵 ⊢0 𝛼, è conseguenza logica di KB, cioè 𝐾𝐵 ⊨ 𝛼. In altre parole, la procedura di inferenza i-

11

esima è corretta se per tutti i casi in cui 𝐾𝐵 ⊢0 𝛼, è anche vero che 𝐾𝐵 ⊨𝛼.

Per completezza, si intende la seguente proprietà:

La procedura di inferenza i-esima è completa se ogni enunciato a, è conseguenza logica di KB, cioè tale per cui 𝐾𝐵 ⊨ 𝛼, è derivato dalla KB mediante la procedura i-esima, cioè 𝐾𝐵 ⊢0 𝛼. In altre parole, la procedura di inferenza i-esima è completa se per tutti i casi in cui 𝐾𝐵 ⊨ 𝛼, è anche vero che 𝐾𝐵 ⊢0 𝛼.

Per comprendere come si possa costruire un modello e quindi comprendere le nozioni di conseguenza logica e inferenza, si pensi alle possibilità vero/falso che produce una certa caratteristica. Facciamo un esempio tratto dal mondo del wumpus, limitandoci a parlare solo della presenza di pozzi nelle celle. Un pozzo in una cella può esserci o non esserci e pensiamo ai possibili modelli che generano tre celle non visitate dall’agente: dall’alto in basso, [3,1], [2,2], [1,2].

Prima di applicare la conoscenza che abbiamo nella KB, consideriamo tutti i modelli possibili. Avendo considerato solo tre celle, ci sono 8 (=23) modelli possibili: il 3 all’esponente rappresenta le tre celle, il 2 alla base rappresenta le possibilità per ogni cella (assenza o presenza di pozzo).

Come si vede sono contemplate tutte le possibilità teoriche per le tre celle, limitandoci al caso dei pozzi (si trascurano cioè presenza di wumpus e di oro e le eventuali percezioni). Consideriamo ora l’enunciato a1=P[2,2], cioè “C’è un pozzo in [2,2].”. Si ha che quattro modelli rendono vera a1, come si vede nella figura seguente (confrontare con la figura precedente, con tutti i modelli possibili). I quattro modelli sono detti M(a1).

12

Se invece consideriamo i modelli che rendono vero l’enunciato a2=ok[1,2], cioè “Non c’è un pozzo in [1,2].”, si hanno di nuovo quattro modelli, non gli stessi di prima (vedi figura seguente e confronta con le figure precedenti), M(a2).

Infine, si considerino i modelli che rendono vera la KB, la quale, tenendo conto del fatto che

• non si percepisce corrente d’aria in [1,1], quindi non può esserci pozzo in [1,2];

• si percepisce corrente d’aria in [2,1], quindi c’è pozzo in [1,2], [3,1], entrambi. I modelli della KB (cioè M(KB)) sono i seguenti tre.

13

Come si può notare, si ha che tutti i modelli di KB sono anche modelli di a2 (𝑀(𝐾𝐵) ⊆ 𝑀(𝛼3)), ma questo contenimento non succede per a1 (𝑀(𝐾𝐵) ⊈ 𝑀(𝛼5)); si ha quindi che a2 sia una conseguenza logica di KB, mentre a1 non lo è. Occorre introdurre un linguaggio logico che sia espressivo a sufficienza da rappresentare la conoscenza di interesse e per la quale esista una procedura di inferenza corretta e completa, cioè, una procedura di inferenza che deriva tutti i possibili enunciati che sono conseguenza logica di una KB. Cominciamo dalla logica proposizionale. 3. Logica proposizionale La logica proposizionale è la logica più semplice, e rappresenta la base per logiche più sofisticate che hanno un potere espressivo sufficiente per rappresentare la conoscenza. Cominciamo dalla sintassi. Sintassi della logica proposizionale I simboli proposizionali P1, P2, …, sono proposizioni, dette proposizioni (o enunciati o formule) atomiche. Inoltre, ricorsivamente, si definiscono le proposizioni composte:

• Se S è una proposizione, ¬S è una proposizione (negazione); • Se S1 e S2 sono proposizioni, S1 ⋀ S2 è una proposizione (congiunzione); • Se S1 e S2 sono proposizioni, S1 ⋁ S2 è una proposizione (disgiunzione); • Se S1 e S2 sono proposizioni, S1 ⇒ S2 è una proposizione (implicazione); • Se S1 e S2 sono proposizioni, S1 ⇔ S2 è una proposizione (bi-condizionale).

Ad esempio, chiamiamo P1,1 la proposizione che rappresenta la presenza di un pozzo in [1,1], B1,2 la proposizione che rappresenta la presenza di una corrente d’aria in [1,2], S2,1 la proposizione che rappresenta la presenza di puzza in [2,1], W3,1 la proposizione che rappresenta la presenza del wumpus in [3,1]. Inoltre, possiamo scrivere che la presenza di una corrente d’aria in [1,1] dipende dalla presenza di un pozzo in [1,2], in [2,1], o in entrambi. Questo si può scrivere nel modo seguente:

B1,1 ⇔ (P1,2 ⋁ P2,1) Semantica della logica proposizionale Ogni modello attribuisce il valore vero (T – true) o il valore falso (F – False) ai simboli proposizionali. Ad esempio, B1,1 ha il valore falso (F) nel modello considerato in precedenza, mentre P3,1 ha il valore vero (T). Uno dei pregi della logica proposizionale è che presenta una semantica di tipo composizionale, cioè il valore di verità delle proposizioni composte si può calcolare a partire dalle proposizioni che le costituiscono. Ecco le regole per valutare il valore di verità di una proposizione composta, rispetto a un modello m:

• ¬S è vero (T) se e solo se S è falso; • S1 ⋀ S2 è vero (T) se e solo se S1 è vero (T) and S2 è vero (T);

14

• S1 ⋁ S2 è vero (T) se e solo se S1 è vero (T) oppure S2 è vero (T); • S1 ⇒ S2 è vero (T) se e solo se S1 è falso (F) oppure S2 è vero (T), cioè a dire

è falso (F) se e solo se S1 è vero e S2 è falso; • S1 ⇔ S2 è vero (T) se e solo se S1 ⇒ S2 è vero (T) e S2 ⇒ S1 è vero (T).

Ad esempio, il valore di verità di ¬P1,2 ⋀ (P2,2 ⋁ P3,1) è dato da

T ⋀ (T ⋁ F) = T ⋀ T = T E’ comodo compilare una tabella di verità per tutti i connettivi:

P Q ¬P PÙQ PÚQ PÞQ PÛQ T T F F

T F T F

F F T T

T F F F

T T T F

T F T T

T F F T

Ogni riga di una tabella di verità contiene un modello: infatti, ogni simbolo proposizionale può essere valutato vero o falso; le righe sono quindi 2n, dove n è il numero totale di simboli proposizionali. Se vogliamo calcolare il valore di verità di un’espressione costruiamo un’adatta tabella di verità. Ad esempio, supponiamo di voler calcolare il valore di verità della proposizione

(𝑃5 ∨ 𝑃3) ∧ ¬(𝑃5 ∧ 𝑃3) Costruiamo la tabella di verità corrispondente.

P1 P2 𝑃5 ∨ 𝑃3 𝑃5 ∧ 𝑃3 ¬(𝑃5 ∧ 𝑃3) (𝑃5 ∨ 𝑃3) ∧ ¬(𝑃5 ∧ 𝑃3) T T F F

T F T F

T T T F

T F F F

F T T T

F T T F

Nelle prime due colonne troviamo tutti i simboli proposizionali; nelle colonne intermedie si trovano i valori di verità di proposizioni composte preparatorie; nell’ultima colonna si trovano i valori finali dell’espressione iniziale. Come si vede, la formula rappresenta il comportamento dell’OR esclusivo, che è vero solo nel caso in cui o è vero l’uno o è vero l’altro enunciato, ma è falso quando sono falsi entrambi o sono veri entrambi. 4. Inferenza per enumerazione dei modelli Le tabelle di verità si possono utilizzare per calcolare le inferenze di una KB; si ha un metodo che è corretto e completo per la logica proposizionale. Il metodo implementa direttamente la definizione di conseguenza logica, per cui tutti i modelli di KB devono essere anche modelli per le proposizioni che sono conseguenze logiche. In pratica, si

15

calcolano tutte le righe (i modelli possibili) di una KB, date da tutte le disposizioni dei valori T/F per tutti i simboli proposizionali atomici che compaiono nella KB; quindi, si cercano le righe (cioè i modelli) che rendono vera la KB (M(KB)) e si controlla se in questi modelli è vera anche la proposizione a che si vuol dimostrare essere una conseguenza logica. Il metodo è corretto e completo perché applica direttamente la definizione di conseguenza logica. Applichiamo subito questa procedura di inferenza definita in modo informale all’esempio del mondo del wumpus. Sia Pi,j vero se c’è un pozzo nella cella [i, j]; sia Bi,j vero se c’è una brezza in [i, j]. Consideriamo tutto ciò che sappiamo e che costituisce la KB (ci limitiamo al caso di brezze e pozzi nei primi due passi illustrati prima con i modelli).

• “Non c’è un pozzo in [1,1]”, R1: ¬ P1,1 • "I pozzi causano brezze nelle celle adiacenti” R2: B1,1 ⇔ (P1,2 ⋁ P2,1) e R3:

B2,1 ⇔ (P1,1 ⋁ P2,2 ⋁ P3,1) • “Non c’è brezza in [1,1], R4: ¬B1,1 • “C’è brezza in [2,1], R5: B2,1

In totale, la nostra KB è la seguente:

• R1: ¬ P1,1 • R2: B1,1 ⇔ (P1,2 ⋁ P2,1) • R3: B2,1 ⇔ (P1,1 ⋁ P2,2 ⋁ P3,1) • R4: ¬B1,1 • R5: B2,1

a è l’enunciato “Non c’è un pozzo in [1,2]”, quindi a: ¬P1,2.

B1,1 B2,1 P1,1 P1,2 P2,1 P2,2 P3,1 R1 R2 R3 R4 R5 KB a 1 T T T T T T T F T T F T F F 2 T T T T T T F F T T F T F F

… … … … 64 T F F F F F F T F T F F F T 65 F T T T T T T F F T T T F F … … … … … … 80 F T T F F F F F F 81 F T F T T T T T F T T T F … … … … … … … … T … … … … … 88 F T F T F F F T F T T T F 89 F T F F T T T T F T T T F … … … … … … 92 F T F F T F F F F 93 F T F F F T T T T T T T T T 94 F T F F F T F T T T T T T T 95 F T F F F F T T T T T T T T 96 F T F F F F F T T F T T F T 97 F F T T T T T F F F … … … … …

127 F F F F F F T T T F T F F F 128 F F F F F F F T T T T F F F

Spieghiamo il contenuto della tabella. La prima colonna a sinistra rappresenta il numero progressivo del modello. Poiché esistono 7 simboli proposizionali, ci sono 27

16

(=128) modelli possibili. Nelle successive 7 colonne, abbiamo inserito i simboli proposizionali, che con il loro valore di verità (T o F), realizzano i 128 modelli. Le successive 5 colonne rappresentano ciascuna il valore di verità di una proposizione della KB (da R1 a R5); la penultima colonna rappresenta il valore di verità della KB intera (che sarebbe la congiunzione di tutte le proposizioni); l’ultima colonna rappresenta il valore di verità di a, che poi sarebbe il valore negato del valore del quarto simbolo proposizionale P1,2. L’enumerazione dei 128 modelli parte da <T,T,T,T,T,T,T> e finisce a <F,F,F,F,F,F,F>, sistematicamente, come avviene nell’enumerazione binaria, alternando tra T e F:

• l’ultimo simbolo (il settimo, nel nostro caso, P3,1) ogni riga (cioè il valore rimane fisso solo per una riga);

• il penultimo simbolo (cioè il sesto, P2,2) ogni 2 righe (21); • il terzultimo simbolo (il quinto, P2,1) ogni 4 righe (22); • il quartultimo simbolo (anche il quarto, nel nostro caso, P1,2) ogni 8 righe (23); • il quintultimo simbolo (il terzo, P1,1) ogni 16 righe (24); • il sestultimo simbolo (il secondo, B2,1) ogni 32 righe (25); • il primo simbolo (B1,1) ogni 64 righe (26).

Un algoritmo (che vedremo tra un attimo) farebbe un’enumerazione sistematica dei modelli, calcolando il valore di verità di ogni proposizione della KB e quindi verificando se il valore di a è T nei casi in cui KB (cioè la congiunzione di tutte le sue proposizioni) sia T. Infatti, data la definizione, per stabilire una conseguenza logica tra KB e a, ci interessa considerare quei modelli per i quali KB è vera e anche la proposizione a è vera. Tuttavia, essendo noi umani, proviamo a fare qualche considerazione qualitativa sulla tabella, provando a interpretare i modelli e i risultati del calcolo dei valori di verità della KB.

• I primi 64 modelli, poiché hanno in comune il fatto che B1,1 sia vero (cioè che esiste una brezza in [1,1]), rendono sempre falsa l’intera KB, perché rendono falso la proposizione R4 (¬B1,1) di KB, che stabilisce che B1,1 sia falso; quindi, ci spostiamo subito sui modelli numerati da 65 a 128;

• I modelli dal 65 all’80 sono caratterizzati dal valore T del simbolo proposizionale P1,1 che è richiesto negato dalla proposizione R1 (¬ P1,1) della KB; quindi questi modelli rendono falsa la KB;

• I 12 modelli dall’81 al 92, falsificano la regola R2 (B1,1 ⇔ (P1,2 ⋁ P2,1)) in quanto B1,1 è F, e quindi si richiede che anche P1,2 ⋁ P2,1 sia F, cioè entrambi P1,2 e P2,1 siano F, e non è il caso in questi 12 modelli;

• I tre modelli dal 93 al 95 sono gli unici a rendere vera (T) la KB: per questi tre modelli anche a è vera. Per cui a è conseguenza logica di KB.

• Il modello 96 rende falsa R3, e quindi la KB; • Dal modello 97 al modello 128 la proposizione B2,1 è F, mentre la regola R5

della KB prevede che sia T. Nella tabella le celle con i “…” indicano che il valore in alto nella colonna si ripete per tutti i modelli non rappresentati. Questo metodo di inferenza, che abbiamo appena illustrato con un esempio, è detto inferenza per enumerazione, in quanto si tratta di enumerare tutti i modelli. Per n

17

simboli, si generano (enumerano) 2n modelli (complessità temporale esponenziale, complessità spaziale lineare – si tiene un solo modello per volta), e si verificano le condizioni previste dalla definizione di conseguenza logica, cioè modelli veri della proposizione inferenza a fronte di modelli veri della KB. La seguente funzione realizza questo tipo di procedura di inferenza.

boolean TT_entails?(KB,alpha) symbols ← tutti i simboli proposizionali in KB e alpha return TT_check_all (KB, alpha, symbols, []) boolean TT_check_all(KB,alpha,symbols,model) if symbols è l’insieme vuoto then if PL_true(KB,modello) then return PL_true(alpha, modello) else return true else P ← first(symbols); rest ← rest(symbols) return TT_check_all (KB,alpha,rest,extend(<P,T>, modello)) and TT_check_all (KB,alpha,rest,extend(<P,F>, modello))

La procedura estrae tutti i simboli proposizionali dalle formule di KB e a. Quindi, una subroutine ricorsiva, TT_check_all, che compie una ricerca in profondità, enumera tutti i modelli, aggiungendo una coppia <simbolo proposizionale, valore di verità> a ogni chiamata ricorsiva. A ogni chiamata, infatti, viene estratto un simbolo (parte else della funzione), a cui viene assegnato un valore di verità (<P, T> o <P, F>). La coppia simbolo-valore è utilizzata per estendere un modello, che parte dal modello vuoto ([], prima chiamata di TT_check_all) e si amplia di una coppia a ogni chiamata ricorsiva. Quando il modello è completo di tutti i simboli (parte then, la lista dei simboli è vuota), si calcola il valore di verità della KB (PL_true) e, se questo risulta vero, si calcola anche il valore di verità della proposizione a. Nel caso quest’ultimo risulti falso, si ha che a non può essere conseguenza logica, si restituisce falso e la procedura termina; nel caso il valore di verità della proposizione a risulti vero allora si restituisce vero per proseguire la ricerca. Notare che si restituisce vero anche quando il valore per la KB è falso – questi casi non ci interessano, infatti, per il calcolo della conseguenza logica). Poiché la ricerca per enumerazione è molto lunga, ci sono soluzioni alternative che si basano su una classe di procedure di inferenza basate su regole (di inferenza). 5. Inferenze mediante applicazione di regole Le procedure di inferenza per applicazione di regole (dette regole di inferenza) sono un’alternativa all’inferenza per enumerazione, che ha tempi esponenziali rispetto al numero di simboli proposizionali presenti. L’inferenza per model checking si basa su alcune nozioni che dobbiamo prima definire. Equivalenza logica Due enunciati si dicono logicamente equivalenti se e solo se sono veri negli stessi modelli.

18

𝜶 ≡ 𝜷𝒔𝒆𝒆𝒔𝒐𝒍𝒐𝒔𝒆𝜶 ⊨ 𝜷𝒆𝜷 ⊨ 𝜶 Poiché richiediamo che una sia conseguenza logica dell’altra, e viceversa, i modelli in cui sono veri i due enunciati saranno esattamente gli stessi. Le equivalenze logiche si dimostrano mediante le tabelle di verità; a seconda della pertinenza si possono raggruppare in classi. Eccone alcune note. Commutatività di AND e OR:

(𝛼 ∧ 𝛽) ≡ (𝛽 ∧ 𝛼) (𝛼 ∨ 𝛽) ≡ (𝛽 ∨ 𝛼)

Associatività di AND e OR:

((𝛼 ∧ 𝛽) ∧ 𝛾) ≡ (𝛼 ∧ (𝛽 ∧ 𝛾)) ((𝛼 ∨ 𝛽) ∨ 𝛾) ≡ (𝛼 ∨ (𝛽 ∨ 𝛾))

Doppia negazione: una proposizione è logicamente equivalente alla negazione della sua negazione (una doppia negazione annulla).

¬(¬𝛼) ≡ 𝛼 Implicazione

Contrapposizione: (𝛼 → 𝛽) ≡ (¬𝛽 → ¬𝛼) Eliminazione dell’implicazione: (𝛼 → 𝛽) ≡ (¬𝛼 ∨ 𝛽)

Eliminazione del bi-condizionale: (𝛼 ↔ 𝛽) ≡ ((𝛼 → 𝛽) ∧ (𝛽 → 𝛼)) De Morgan

¬(𝛼 ∧ 𝛽) ≡ (¬𝛼 ∨ ¬𝛽) ¬(𝛼 ∨ 𝛽) ≡ (¬𝛼 ∧ ¬𝛽) Distributività dell’AND sull’OR e viceversa

(𝛼 ∧ (𝛽 ∨ 𝛾)) ≡ ((𝛼 ∧ 𝛽) ∨ (𝛼 ∧ 𝛾)) (𝛼 ∨ (𝛽 ∧ 𝛾)) ≡ ((𝛼 ∨ 𝛽) ∧ (𝛼 ∨ 𝛾))

Identità

𝛼 ∧ 𝑇 ≡ 𝛼 𝛼 ∨ 𝐹 ≡ 𝛼 Negazione

𝛼 ∨ ¬𝛼 ≡ 𝑇 𝛼 ∧ ¬𝛼 ≡ 𝐹 Idempotenza

𝛼 ∧ 𝛼 ≡ 𝛼 𝛼 ∨ 𝛼 ≡ 𝛼 Limiti superiore e inferiore

𝛼 ∨ 𝑇 ≡ 𝑇 𝛼 ∧ 𝐹 ≡ 𝐹 Grazie alle tabelle si possono dimostrare queste e molte altre equivalenze logiche. Quindi, se vogliamo dimostrare la verità di un certo enunciato possiamo utilizzare indifferentemente uno o l’altro di due enunciati logicamente equivalenti. Vediamo ora altri due concetti utili.

19

[Esercizio. Dimostrare le equivalenze logiche mediante tabella di verità. Suggerimento: il numero di modelli è dato dal calcolo combinatorio (disposizioni) dei simboli proposizionali presenti.] Validità Un enunciato è valido se è vero in tutti i modelli. Ad esempio, il valore di verità T (vero), cioè la proposizione che vale sempre vero, è sicuramente un enunciato valido. Altri esempi:

1. 𝛼 ∨ ¬𝛼 2. 𝛼 → 𝛼 3. (𝛼 ∧ (𝛼 → 𝛽)) → 𝛽 (Modus Ponens) 4. (¬𝛽 ∧ (𝛼 → 𝛽)) → ¬𝛼 (Modus Tollens) 5. ((𝛼 → 𝛽) ∧ (𝛽 → 𝛾)) → (𝛼 → 𝛾) (Transitività) 6. ((𝛼 ∨ 𝛽) ∧ ¬𝛽) → 𝛼, ((𝛼 ∨ 𝛽) ∧ ¬𝛼) → 𝛽 (Eliminazione della disgiunzione) 7. (𝛼 ∧ 𝛽) → 𝛽, (𝛼 ∧ 𝛽) → 𝛼 (Eliminazione della congiunzione)

La validità è connessa all’inferenza mediante il Teorema della Deduzione, che afferma:

𝑲𝑩 ⊨ 𝜶𝒔𝒆𝒆𝒔𝒐𝒍𝒐𝒔𝒆𝑲𝑩 ⇒ 𝜶è𝒗𝒂𝒍𝒊𝒅𝒐. Quindi, nel caso di

(𝛼 ∧ (𝛼 → 𝛽)) → 𝛽 si ha che una KB che contiene le proposizioni 𝛼 e 𝛼 → 𝛽 ha come conseguenza logica 𝛽. [Esercizio. Dimostrare la validità dell’enunciato, calcolando la sua tabella di verità e verificando che tutti i modelli sono modelli dell’enunciato.] Abbiamo quindi trovato due modi per calcolare che un enunciato sia conseguenza logica di una base di conoscenza. Nel primo caso, la nozione di equivalenza logica implica la nozione di conseguenza logica, per cui se un certo enunciato è equivalente a un altro, si può anche dire che uno sia conseguenza logica dell’altro (è indifferente la direzione di applicazione). Nel secondo caso, se siamo in presenza di un enunciato valido, come negli esempi 3 e 4 in precedenza, il secondo termine dell’implicazione sarà conseguenza logica dei congiunti del primo termine: operativamente, si tratta di una regola di inferenza, cioè dai congiunti del primo termine, che sono detti premesse, si può concludere il secondo termine, che è detto conclusione. L’equivalenza logica e la validità sono entrambe operative come regole di inferenza, che producono nuovi enunciati a partire dalla KB; i nuovi enunciati si possono aggiungere alla KB, che arriverà a includere l’enunciato 𝛼, se questo è conseguenza logica. La nuova dimostrazione procederà dalla KB iniziale, producendo nuovi enunciati alla ricerca di 𝛼, un’esplorazione dello spazio degli stati delle KB possibili. Applichiamo ora le regole di inferenza per dimostrare che non esiste un pozzo in [1,2], nel caso del mondo del wumpus (a: ¬P1,2). Ricordiamo che la KB è la seguente:

20

• R1: ¬ P1,1 • R2: B1,1 ⇔ (P1,2 ⋁ P2,1) • R3: B2,1 ⇔ (P1,1 ⋁ P2,2 ⋁ P3,1) • R4: ¬B1,1 • R5: B2,1

Eliminando il bi-condizionale da R2 (vedi l’equivalenza logica in precedenza), si ottiene

• R6: (𝐵5,5 ⇒ 𝑃5,3 ∨ 𝑃3,5) ∧ (𝑃5,3 ∨ 𝑃3,5 ⇒ 𝐵5,5) A questo punto si elimina la congiunzione mediante una conseguenza logica (la 4 dell’elenco precedente):

• R7: (𝑃5,3 ∨ 𝑃3,5 ⇒ 𝐵5,5) Mediante l’applicazione dell’equivalenza logica della contrapposizione, si ottiene

• R8: ¬𝐵5,5 ⇒ ¬(𝑃5,3 ∨ 𝑃3,5) A questo punto si può applicare il Modus Ponens tra R8 e R4, producendo

• R9: ¬(𝑃5,3 ∨ 𝑃3,5) che con l’applicazione di De Morgan diventa

• R10: ¬𝑃5,3 ∧ ¬𝑃3,5 Eliminando infine la congiunzione, si ha

• R11: ¬𝑃5,3 che è la proposizione cercata. Come si nota, l’applicazione delle regole di inferenza è molto efficace se si riesce a identificare tutte le volte le proposizioni rilevanti per la soluzione del problema. Corrisponde a una ricerca nello spazio degli stati. Sfruttando le nozioni di equivalenza logica e di validità, si possono trovare le conseguenze logiche di una KB. L’applicazione delle regole di inferenza però non sempre è corretta e completa. Il metodo universale di applicazione usa una sola regola, detta di risoluzione, che sfrutta la nozione di soddisfacibilità in un metodo detto di refutazione. In poche parole, una proposizione 𝛼è conseguenza logica di una KB quando la congiunzione di KB e 𝛼 forma un insieme di proposizioni insoddisfacibile, per il quale cioè non esiste un modello. Non approfondiamo qui questo aspetto. Invece, dal punto di vista della rappresentazione della conoscenza, la logica proposizionale si rivela uno strumento povero, con poco potere espressivo. In

21

particolare, l’impegno ontologico della logica proposizionale si limita alle proposizioni e non scende nel dettaglio della loro struttura. E’ così che la proposizione P1,2 non ha alcuna relazione con la proposizione P2,1, sebbene entrambe riguardino pozzi e celle del mondo del wumpus. Usiamo quindi un linguaggio logico più espressivo: la logica dei predicati. Esercizio di conseguenza logica: L’arringa dell’avvocato adattato da [http://nicolas.thiery.name/macs358/Notes/1_FormalLogic/PropositionalLogic.pdf] Arringa: “Se il mio cliente è colpevole, allora il coltello era nel cassetto. Ma, o il coltello non era nel cassetto o Tullio Malesano lo avrebbe visto, il coltello. Tuttavia, se il coltello non era lì il 10 ottobre, allora Tullio Malesano non lo ha visto, il coltello. Inoltre, se il coltello fosse stato lì il 10 ottobre, allora non solo il coltello sarebbe stato nel cassetto ma anche il martello sarebbe stato nel ripostiglio. Ma tutti sappiamo che il martello non era nel ripostiglio. Per cui, signore e signori della giuria, il mio cliente è innocente.” Si possono identificare le seguenti proposizioni atomiche (scorporando i connettivi analizzati nel linguaggio naturale e riportando le espressioni a una forma neutra al presente).

• P1: Il mio cliente è colpevole. • P2: Il coltello è nel cassetto. • P3: Tullio Malesano vede il coltello. • P4: Il coltello è lì il 10 ottobre. • P5: Il martello è nel ripostiglio.

Si ha quindi la seguente KB:

• R1: 𝑃5 ⇒ 𝑃3 • R2: (¬𝑃3 ∨ 𝑃N) ∧ ¬(¬𝑃3 ∧ 𝑃N) • R3: ¬𝑃O ⇒ ¬𝑃N • R4: 𝑃O ⇒ (𝑃3 ∧ 𝑃P) • R5: ¬𝑃P

Con • a: ¬𝑃5

Si dimostri che a è conseguenza logica di KB mediante tabella di verità (inferenza per enumerazione) e applicando equivalenza logica e validità (inferenza con regole). Suggerimento: Sull’inferenza per enumerazione, solo un modello di KB e anche modello di a; sull’inferenza con regole, per evitare inferenze che non conducono all’obiettivo, conviene ricercare quelle portano velocemente a a (si tratta di 13 inferenze, di cui 4 modus ponens, 2 contrapposizioni, 2 introduzioni dell’implicazione, 2 eliminazioni dell’AND, 1 distributività, 1 commutatività dell’OR, 1 eliminazione dell’implicazione).

22

23

Bibliografia utile per questa sezione Stuart Russell, Peter Norvig, Intelligenza artificiale 3/Ed. - Vol. 1, Un approccio moderno, Pearson Education, 2010, pp. 704. Capitoli 7, 8, 9. http://www.logicinaction.org/ http://people.hofstra.edu/stefan_waner/realworld/logic/logicintro.html