Appunti dalle lezioni Parte I: capitoli 1â3 - Vernimark
Appunti dalle lezioni Parte I: capitoli 1â3 - Vernimark
Appunti dalle lezioni Parte I: capitoli 1â3 - Vernimark
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Politecnico di Milano<br />
V Facoltà di ingegneria<br />
Corso di Ingegneria della conoscenza e sistemi esperti<br />
Anno accademico 1998/99<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong><br />
<strong>Parte</strong> I: <strong>capitoli</strong> 1–3<br />
Marco Colombetti<br />
Avvertenza<br />
Queste dispense sono disponibili sul sito web<br />
http://www.elet.polimi.it/Users/DEI/Sections/Compeng/Marco.Colombetti/ICSE.ht<br />
ml. La proprietà intellettuale è dell’autore. È consentita la riproduzione e la distribuzione con qualunque<br />
mezzo e sotto qualsiasi forma purché non a fini di lucro.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
Indice (parte I)<br />
1. Introduzione 3<br />
1.1 L’ingegneria della conoscenza<br />
1.2 Il concetto di agente<br />
1.3 Uno schema generale di agente<br />
1.4 Una tipologia degli agenti<br />
1.5 Agenti razionali<br />
2. La logica 10<br />
2.1 La validità delle argomentazioni<br />
2.2 Il linguaggio formale degli enunciati<br />
2.3 La verità<br />
2.4 La meccanizzazione della logica<br />
2.5 La logica nell’intelligenza artificiale<br />
3. La logica del primo ordine 17<br />
3.1 Il linguaggio predicativo del primo ordine<br />
3.2 La semantica formale<br />
3.3 Il calcolo: una procedura di prova per enunciati del primo ordine<br />
3.4 Teorema di deduzione e regole derivate<br />
3.5 Calcolo della validità di un’argomentazione<br />
3.6 Alcune equivalenze importanti<br />
Riferimenti bibliografici (parte I) 39<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
1 Introduzione 3<br />
1 Introduzione<br />
1.1 L’ingegneria della conoscenza e i sistemi esperti<br />
L’ingegneria della conoscenza è un’area dell’intelligenza artificiale (IA), ovvero di quel settore<br />
dell’informatica che si pone l’obiettivo di realizzare sistemi computazionali “intelligenti”.<br />
L’IA classica (detta anche IA simbolica) parte <strong>dalle</strong> seguenti ipotesi:<br />
• l’intelligenza è la capacità di utilizzare conoscenze per risolvere problemi;<br />
• le conoscenze sono rappresentate sotto forma di espressioni simboliche, ovvero di enunciati di un<br />
opportuno linguaggio formale;<br />
• nella risoluzione di problemi, le espressioni simboliche che rappresentano le conoscenze sono<br />
manipolate da algoritmi di elaborazione simbolica.<br />
Dal punto di vista dell’IA classica, quindi, un sistema intelligente possiede conoscenze rappresentate in<br />
forma simbolica ed è capace di sfruttarle con procedure algoritmiche. Sistemi di questo tipo si dicono<br />
anche sistemi basati su conoscenze (KBS, knowledge based systems). All’interno dell’IA, l’ingegneria<br />
della conoscenza si occupa in particolare dei seguenti problemi:<br />
• acquisizione delle conoscenze da rappresentare per risolvere una determinata classe di problemi;<br />
• rappresentazione delle conoscenze in una forma utilizzabile da parte di algortmi appropriati;<br />
• formulazione degli algoritmi che manipolano le conoscenze rappresentate;<br />
• realizzazione di sistemi specifici e di ambienti per lo sviluppo di KBS.<br />
La fonte delle conoscenze rappresentate è un aspetto critico nella realizzazione di un KBS: nessun sistema<br />
può avere buone prestazioni se la conoscenza che possiede è errata o eccessivamente lacunosa. In molti<br />
casi di interesse applicativo la fonte delle conoscenze è un esperto umano: si può realizzare un KBS per<br />
la diagnosi, poniamo, di certe patologie cardiache interagendo con un cardiologo e cercando di<br />
rappresentare le sue conoscenze specialistiche. Nei casi di questo genere il KBS è detto sistema esperto.<br />
Un punto di vista recente è che l’obiettivo principale dell’ingegneria della conoscenza sia progettare e<br />
realizzare “agenti intelligenti” o, per usare un termine più rigoroso, agenti razionali. Questo concetto è<br />
presentato nel prossimo paragrafo.<br />
1.2 Il concetto di agente<br />
L’informatica, come tutte le discipline scientifiche o tecniche, fa spesso appello a metafore. Un esempio<br />
noto a tutti è la metafora della scrivania sottostante le interfacce WIMP (Windows, Icons, Menus,<br />
Pointers), che mostrano il file system come il ripiano di una scrivania su cui poggiano cartellette,<br />
documenti e così via. Solo alcuni aspetti delle scrivanie reali sono riportati nella scrivania virtuale che<br />
costituisce l’interfaccia. Ma questo è ovvio, e tipico di ogni metafora: ad esempio, se diciamo che<br />
“Filippo è una lumaca” probabilmente vogliamo dire che Filippo è molto lento in qualche attività, e non<br />
che si porta la casa sulle spalle.<br />
Un’altra metafora molto nota, che ora analizzeremo più da vicino, è quella che ha portato alla definizione<br />
dei sistemi a oggetti. In un sistema a oggetti, una unità di programma è vista metaforicamente come un<br />
oggetto fisico.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
1 Introduzione 4<br />
A questo fine, degli oggetti fisici sono considerati salienti tre aspetti:<br />
• Ogni oggetto fisico ha un tipo (è una mela, un bicchiere, e così via); a loro volta, i tipi possono<br />
essere visti come sottotipi di tipi più generali (ogni mela è un frutto, ogni frutto è un oggetto<br />
fisico).<br />
• Ogni oggetto fisico ha un insieme di proprietà specifiche (ogni mela ha un colore e un sapore) e/o<br />
una struttura (un bicchiere ha un gambo e un calice).<br />
• Ogni oggetto fisico ha una dinamica propria, ovvero un modo specifico di reagire alle azioni<br />
compiute su di esso (una mela si taglia se viene premuta con un coltello; un bicchiere si rompe se<br />
lo colpisce).<br />
Questi aspetti degli oggetti fisici trovano corrispondenza negli oggetti informatici. Come è noto, infatti,<br />
gli oggetti informatici sono caratterizzati da un tipo (la classe di appartenenza diretta), e i tipi (le classi)<br />
sono inseriti in una gerarchia di sottotipi (la gerarchia delle classi); inoltre le variabili locali degli oggetti<br />
ne definiscono le proprietà possibili e la struttura, e i metodi ne definiscono la dinamica.<br />
Da alcuni anni, nell’informatica sta prendendo piede un’altra metafora. Si considera infatti importante<br />
creare programmi che possano essere considerati degli agenti. Al contrario del caso precedente, però,<br />
questo concetto non ha ancora un’interpretazione unica e universalmente condivisa. L’idea di agente<br />
informatico è piuttosto vaga, e per ora si limita a esprimere un insieme di proprietà la cui importanza<br />
viene percepita, ma che non si è ancora riusciti a tradurre in concetti chiari e univoci. Proprio per<br />
questo motivo è importante tentare di capire che cosa ci sia dietro alla metafora dell’agente.<br />
Un agente, ovviamente, è un sistema che agisce – ma questo non chiarisce nulla. Esistono in natura<br />
sistemi che agiscono, ma quali sono Il prototipo di un sistema che agisce, ovviamente, è l’essere<br />
umano. Ma anche gli organismi animali sono agenti. L’idea è che “agire” significhi interagire con<br />
l’ambiente allo scopo di realizzare una funzione o di raggiungere uno scopo. Ad esempio, un animale<br />
selvatico può abbandonare la tana allo scopo di procurarsi il cibo necessario alla sua sopravvivenza. Nel<br />
fare questo, l’animale cercherà di massimizzare il quantitativo di cibo procurato e di minimizzare il<br />
rischio di essere catturato da un predatore.<br />
Le proprietà caratteristiche degli agenti sono meno immediate di quelle degli oggetti. Tuttavia è possibile<br />
mettere a fuoco alcune caratteristiche fondamentali:<br />
• Comportamento orientato al compito. Il comportamento di un agente non è rigidamente<br />
predefinito, ma è flessibile e orientato allo svolgimento di un compito (task oriented).<br />
• Comportamento continuo. Un agente agisce in modo continuo, nel senso che è sempre disponibile<br />
ad agire per raggiungere i propri obiettivi quando se ne presenti l'opportunità.<br />
• Interazione con l’ambiente. Lo svolgimento del compito può richiedere comportamenti<br />
notevolmente diversi a seconda dello stato dell’ambiente con cui l’agente interagisce.<br />
• Ambiente parzialmente ignoto e imprevedibile. Le caratteristiche dell’ambiente sono spesso<br />
parzialmente sconosciute e difficili o impossibili da prevedere.<br />
• Reattività e proattività. Un agente non si limita a reagire agli stimoli provenienti dall'ambiente, ma<br />
pianifica le proprie attività e prende l'iniziativa per raggiungere i propri obiettivi.<br />
• Autonomia. La flessibilità del comportamento dell’agente non si basa su un’interazione con un<br />
utente esterno, ma è frutto dell’organizzazione interna dell’agente.<br />
A queste caratteristiche se ne aggiungono spesso altre che verranno discusse in seguito.<br />
Un esempio di agente potrebbe essere l’assai desiderato email assistant, ovvero un programma in grado<br />
di leggere e filtrare la posta elettronica in modo intelligente. Un buon email assistant dovrebbe essere in<br />
grado di identificare ed eliminare la posta spazzatura, di classificare i messaggi in base al contenuto, di<br />
segnalare i messaggi veramente urgenti, e così via. Un altro esempio di agente potrebbe essere un search<br />
agent, in grado di esplorare il web e di segnalare i siti il cui contenuto può interessare un certo utente di<br />
cui sono noti gli interessi e le attività. Un altro esempio ancora potrebbe essere un agente in grado di<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
1 Introduzione 5<br />
partecipare alle aste elettroniche di un certo tipo di beni e di eseguire acquisti oculati contrattando<br />
opportunamente i prezzi.<br />
Agenti di questo tipo appartengono al futuro dell’informatica, e sembrano richiedere in modo essenziali<br />
l’uso di tecniche di intelligenza artificiale (vedi Russell & Norvig, 1995; Nilsson, 1998). Oggi il termine<br />
“agente” è già utilizzato, ma di solito caratterizza sistemi software a codice mobile, in grado di trasferirsi<br />
attraverso la rete per essere eseguiti da macchine diverse. Di questo tipo di agenti non ci interesseremo<br />
qui.<br />
1.3 Uno schema generale di agente<br />
Un agente è dunque un programma progettato almeno in parte sul modello (naturalmente molto<br />
semplificato) di un essere umano o di un altro organismo animale. Possiamo quindi tracciare un primo<br />
schema di agente (fig. 1.1).<br />
Agente<br />
Ambiente<br />
Figura 1.1 Schema di agente: livello 1.<br />
La figura suggerisce che l’agente ha in ingresso informazioni sull’ambiente e a sua volta agisce<br />
sull’ambiente. In generale, l’ambiente è un sistema dinamico, pensato in tempo continuo o discreto.<br />
L’agente è anch’esso un sistema dinamico (o eventualmente algebrico, ovvero privo di stato), e viene<br />
modellato in tempo discreto. Più precisamente, penseremo che il sistema computazionale che<br />
implementa l’agente funzioni in modo ciclico, temporizzato da un opportuno clock. Se t è l’istante di<br />
tempo, il ciclo agente segue allora il seguente schema:<br />
t ← 0;<br />
loop<br />
raccogli i dati sull’ambiente;<br />
decidi che azione eseguire;<br />
esegui l’azione;<br />
t ← t + 1<br />
endloop<br />
La funzionalità principale di un agente è quindi decidere, caso per caso, che azione eseguire per svolgere<br />
il proprio compito. Spingendo un po’ più avanti la nostra analisi possiamo identificare i seguenti moduli<br />
funzionali (fig. 1.2):<br />
• il sistema sensoriale S (o percezione), che interagisce con l'ambiente e fornisce informazioni in<br />
ingresso al sistema decisionale;<br />
• il sistema decisionale D, che decide come agire sull’ambiente sulla base degli ingressi ricevuti dal<br />
sistema sensoriale;<br />
• il sistema attuativo A, che traduce le decisioni del sistema decisionale in azioni sull’ambiente.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
1 Introduzione 6<br />
A questo punto è opportuno distinguere fra agenti fisici o robotici (come i robot mobili) e agenti software<br />
(che, al contrario dei robot, non hanno un “corpo”). Nel caso degli agenti fisici l’acquisizione di<br />
informazioni sull’ambiente e l’azione sull’ambiente sono due funzionalità complesse e problematiche. Di<br />
solito questo non è vero per gli agenti software, per i quali i sistemi sensoriale e attuativo sono spesso<br />
banali.<br />
S D A<br />
Ambiente<br />
Figura 1.1 Schema di agente: livello 2.<br />
1.4 Una tipologia degli agenti<br />
Una tipologia ad alto livello degli agenti può essere tracciata sulla base della complessità del loro sistema<br />
decisionale.<br />
1.4.1 Agenti SR<br />
Il tipo più semplice di agente, detto agente stimolo-risposta o SR, realizza un legame algebrico fra<br />
l’ingresso proveniente dal sistema sensoriale e le decisioni inviate al sistema attuativo. Se s(t) è l’input<br />
proveniente dai sensori al tempo t ed a(t) è l’azione eseguita al tempo t:<br />
a(t) = f(s(t)).<br />
Molti semplici agenti, in particolare robotici, sono di questo tipo. Quando gli schemi comportamentali di<br />
un agente SR sono semplici, la sua implementazione non pone particolari problemi. Tuttavia, esistono<br />
molti casi d’interesse pratico che rendono la realizzazione di un agente SR un problema interessante. Ciò<br />
avviene quando:<br />
• L’input sensoriale e il repertorio delle risposte possibili sono così complessi da creare conflitti fra<br />
risposte alternative (ad esempio, un robot può percepire contemporaneamente due oggetti vicini<br />
fra loro, uno da cui dovrebbe allontanarsi e uno a cui dovrebbe avvicinarsi).<br />
• Il comportamento dell’agente non può essere completamente definito a priori, ma deve essere<br />
appreso almeno in parte dall’esperienza.<br />
Di questi problemi ci occuperemo in un’altra parte del corso.<br />
1.4.2 Agenti SXR<br />
Un secondo tipo di agente, appena più complesso degli agenti SR, è l’agente stimolo-stato-risposta o SXR.<br />
In questo caso l’agente può essere modellato come un sistema dinamico:<br />
a(t) = f(x(t),s(t)),<br />
x(t+1) = g(x(t),s(t)).<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
1 Introduzione 7<br />
Lo stato x(t) può essere visto come una memoria di eventi passati, o come una credenza sullo stato<br />
dell’ambiente, o ancora come una motivazione a eseguire certe azioni anziché certe altre. Ecco alcuni<br />
esempi intuitivi:<br />
Lo stato come memoria<br />
Un document processor ha n+1 stati 0, 1, ..., n. Gli stati 1, ..., n corrispondono ad altrettante modalità di<br />
salvataggio di un documento (text only, formattato, ecc.). Alla creazione di un nuovo documento lo stato<br />
è inizializzato a 0. Il document processor “percepisce” i comandi dell’utente. Al comando di save, il<br />
document processor reagisce salvando il documento secondo la modalità memorizzata nello stato se<br />
questo è diverso da 0, o chiedendo all’utente in che modalità intenda salvare il documento se lo stato è 0.<br />
Lo stato come credenza<br />
Nei sistemi SR si assume che tutte le conseguenze delle azioni dell’agente che possono influenzare le<br />
azioni future siano a loro volta percepibili dall’agente. Ad esempio, un agente può inserire un alimento<br />
surgelato nel forno a microonde; in seguito l’agente vede che il forno contiene qualcosa (attraverso lo<br />
sportello trasparente) e quindi accende il forno.<br />
A volte, però, certi fatti importanti relativi all’ambiente non sono percepibili: ad esempio, se lo sportello<br />
del forno a microonde non è trasparente, l’agente non può vedere se il forno contiene qualcosa.<br />
L’assenza di percezione reale può però essere aggirata tramite una specie di “sensore fittizio”, ovvero uno<br />
stato dell’agente che varia concordemente con gli stati non percepibili dell’ambiente (detti anche stati<br />
nascosti). Ad esempio, lo stato dell’agente-cuoco può essere inizialmente 0, ed essere mutato in 1<br />
quando l’agente inserisce un alimento nel forno. In tal caso, l’agente “sa” che il forno contiene qualcosa<br />
anche se non lo vede, e può quindi agire di conseguenza.<br />
La concordanza fra lo stato dell’agente e lo stato dell’ambiente può venire a mancare, ad esempio a causa<br />
di un malfunzionamento. Per ritornare all’esempio, è quindi più corretto dire che l’agente “crede” che il<br />
forno contenga qualcosa; pertanto, gli stati utilizzati come sensori virtuali sono da considerare come<br />
credenze dell’agente intorno all’ambiente.<br />
La differenza fra stato-memoria e stato-credenza non è oggettiva, bensì relativa all’osservatore (ovvero,<br />
dipende dal punto di vista del progettista dell’agente). In altre parole, è perfettamente possibile<br />
reinterpretare la memoria del document processor come credenza (il document processore crede che<br />
l’utente voglia salvare il documento con una data modalità), e la credenza dell’agente-cuoco come<br />
memoria (l’agente si ricorda di aver inserito un alimento nel forno).<br />
Lo stato come motivazione<br />
Ambedue gli esempi precedenti ammettono un’ulteriore interpretazione (anch’essa relativa<br />
all’osservatore). Possiamo infatti vedere gli stati come motivazioni. Nel caso del document processor, si<br />
tratta della motivazione a salvare i documenti in un certo modo; nel caso dell’agente-cuoco, si tratta della<br />
motivazione ad accendere il forno che nasce non appena il forno viene riempito. Dato che le diverse<br />
interpretazioni degli stati non hanno nulla di oggettivo (si tratta, ancora una volta, di metafore), il<br />
progettista può assumere il punto di vista che gli sembra più intuitivo e conveniente.<br />
Stati mentali e stati fisici<br />
Consideriamo un robot elettrico di sorveglianza che esplora un ambiente alla ricerca di intrusi. Quando<br />
identifica un intruso il robot interrompe l’esplorazione, dà l’allarme e lo insegue. Quando poi la carica<br />
delle batterie scende sotto una certa soglia, il robot interrompe l’esplorazione e si dirige verso la stazione<br />
di ricarica; se dirigendosi verso la stazione identifica un intruso, il robot dà comunque l’allarme ma<br />
rinuncia all’inseguimento.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
1 Introduzione 8<br />
Può sembrare che questo comportamento richieda un agente SXR, ma ciò non è vero: è sufficiente un<br />
agente SR. Infatti, il comportamento del robot è completamente determinato, istante per istante, <strong>dalle</strong><br />
sue percezioni: la percezione di un intruso e la percezione del livello di carica della batteria. Occorre<br />
evitare di confondere lo stato dell’agente, di cui si è parlato in precedenza, con le percezioni provenienti<br />
dall’interno del “corpo” dell’agente (in questo caso, dalla batteria). A tutti gli effetti, il corpo dell’agente<br />
è parte integrante dell’ambiente da cui provengono le percezioni; per distinguere il corpo del robot<br />
dall’ambiente esterno, esso viene spesso denominato ambiente interno.<br />
Sempre in via di metafora, dobbiamo quindi distinguere fra gli stati fisici di un agente robotico (ovvero,<br />
gli stati del suo ambiente interno) e i suoi stati mentali (gli stati del sistema decisionale visti<br />
precedentemente). Al contrario degli agenti SR, quindi, gli agenti SXR hanno stati mentali.<br />
1.4.3 Agenti reattivi e agenti deliberativi<br />
Gli agenti SR e gli agenti SXR hanno un’importante caratteristica in comune: non appena è disponibile<br />
un dato percettivo, essi possono reagire immediatamente generando una risposta comportamentale sulla<br />
base della funzione f; per questo motivo, essi vengono collettivamente denominati agenti reattivi. Nella<br />
terminologia adottata in questo corso, quindi, gli agenti SR sono un caso particolare degli agenti reattivi<br />
(in altri testi, il termine “agente reattivo” denota gli agenti che qui chiamiamo SR).<br />
In molte situazioni non è possibile agire in questo modo. A volte un’azione va decisa sulla base di una<br />
valutazione dei suoi effetti: l’agente considera la situazione in cui si trova, elenca le azioni possibili, si<br />
forma delle aspettative sugli effetti di ogni azione, valuta la convenienza delle varie alternative. Ad<br />
esempio, un agente scacchista non può limitarsi a reagire alla disposizione dei pezzi sulla scacchiera, ma<br />
deve anche proiettare nel futuro gli effetti delle mosse possibili. Gli agenti che operano in questo modo<br />
sono detti deliberativi. Anche nella categoria degli agenti deliberativi è possibile identificare sottocasi<br />
particolarmente semplici, come gli agenti guidati da obiettivi di cui parleremo più avanti.<br />
1.1 Agenti razionali<br />
Un termine spesso utilizzato è “agente razionale” (vedi ad esempio Russell & Norvig, 1995; Wooldridge,<br />
2000). Un agente razionale si definisce, com’è ovvio, come un agente capace di condurre azioni<br />
razionali. A sua volta un’azione razionale può essere definita come un’azione sostenuta da ragioni. Nel<br />
caso dell’azione umana, le ragioni dell’azione possono essere svariatissime: si può agire per tener fede a<br />
un impegno, per rispettare un obbligo, per ottenere un guadagno, per soddisfazione personale. Nel<br />
modello più classico e immediato della razionalità (che riprenderemo in seguito) si assume che un agente<br />
abbia sia conoscenze che desideri; agire razionalmente significa allora agire in base alle proprie<br />
conoscenze in modo da realizzare i propri desideri.<br />
Ci sono sostanzialmente due approcci agli agenti razionali. Nell’approccio simbolico si assume le<br />
conoscenze e i desideri degli agenti siano rappresentate come un sistema logico-formale. Di questo ci<br />
occuperemo nei prossimi <strong>capitoli</strong>. Un diverso approccio modella la razionalità come un problema di<br />
ottimizzazione, o meglio di controllo ottimo: agire razionalmente significa agire in modo tale da<br />
massimizzare l’utile atteso. Nel campo degli agenti (e in particolare degli agenti robotici) vengono<br />
utilizzati diversi modelli di questo genere, spesso ispirati ai metodi della programmazione dinamica.<br />
Questo aspetto verrà approfondito nelle esercitazioni del corso.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
2 La logica 9<br />
2 La logica<br />
Questo capitolo costituisce un’introduzione informale ed intuitiva ad alcuni aspetti della logica. Nel<br />
capitolo successivo affronteremo l’argomento in modo più approfondito, limitatamente alla logica<br />
predicativa del primo ordine.<br />
2.1 La validità delle argomentazioni<br />
Nella storia del pensiero occidentale la logica, intesa come disciplina autonoma, è nata nell’ambito della<br />
filosofia greca con l’obiettivo di formulare regole che consentano di stabilire se un’argomentazione è<br />
valida.<br />
Che cosa si intende per argomentazione valida Vediamo alcuni esempi. L’argomentazione:<br />
(2.1) I banchieri sono ricchi. Aldo è povero. Quindi Aldo non è un banchiere.<br />
sembra intuitivamente valida. Al contrario, la seguente argomentazione è palesemente scorretta:<br />
(2.2) I banchieri sono ricchi. Aldo è ricco. Quindi Aldo è un banchiere.<br />
La validità di un’argomentazione non dipendere soltanto dalla verità delle conclusioni. Infatti, la<br />
seguente argomentazione è logicamente scorretta, anche se la sua conclusione è vera:<br />
(2.3) I banchieri sono biondi. I biondi sono ricchi. Quindi i banchieri sono ricchi.<br />
La prossima argomentazione, invece, è valida benché la conclusione sia falsa:<br />
(2.4) I banchieri sono ricchi. I ricchi sono sempre felici. Quindi i banchieri sono sempre felici.<br />
Possiamo dire che un’argomentazione è valida non quando le conclusioni sono vere in assoluto, ma<br />
quando le conclusioni sono vere sotto l’ipotesi che lo siano le premesse. Se le premesse di<br />
un’argomentazione sono false, non è possibile dire nulla in generale sulla verità delle conclusioni: a<br />
seconda dei casi, potranno essere vere o false.<br />
Gli esempi precedenti sono argomentazioni, per così dire, di senso comune. Tradizionalmente, però, la<br />
logica è stata studiata sotto la spinta delle discipline in cui le argomentazioni sono molto complesse: la<br />
filosofia, il diritto, la matematica. Per quanto riguarda la matematica, in particolare, va sottolineato che<br />
la dimostrazione di un teorema non è altro che un’argomentazione, condotta tipicamente in un’estensione<br />
del linguaggio naturale che comprende espressioni simboliche di vario genere. Non è quindi strano che<br />
la logica moderna sia stata studiata soprattutto dai matematici, e che prenda anche il nome di logica<br />
matematica.<br />
Negli ultimi decenni si è aggiunto un altro grande motivo d’interesse per la logica: le applicazioni<br />
all’informatica e in particolare all’intelligenza artificiale. Come vedremo, infatti, uno degli scopi della<br />
logica è di formulare procedimenti puramente algoritmici per argomentare correttamente. È chiaro che<br />
un tentativo di questo genere è di enorme interesse per chi ha l’obiettivo di costruire macchine<br />
“intelligenti”.<br />
Cerchiamo ora di chiarire il concetto di argomentazione. Un’argomentazione può essere vista come una<br />
successione di enunciati linguistici di tipo descrittivo (ovvero, frasi di una lingua naturale che descrivono<br />
stati di cose, e che sono o veri o falsi). Un insieme di enunciati, Γ, sono assunti come premesse (perché<br />
“evidenti”, o perché già condivisi <strong>dalle</strong> parti interessate all’argomentazione, o semplicemente per<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
2 La logica 10<br />
analizzarne le conseguenze); un enunciato, ϕ, è invece derivato come conclusione. L’argomentazione è<br />
valida se la conclusione (ϕ) è certamente vera sotto l’ipotesi che lo siano le premesse (Γ). In tal caso, si<br />
dice anche che la conclusione è conseguenza logica delle premesse o che le premesse comportano (in<br />
inglese: entail) la conclusione e si scrive:<br />
Γ |= ϕ.<br />
Come dicevamo, ci interessa formulare un insieme di regole per argomentare correttamente. Fino al<br />
diciannovesimo secolo, i logici studiavano argomentazioni espresse in una lingua naturale, come il greco,<br />
il latino o l’arabo. Nella logica moderna, che prende le mosse dai lavori di George Boole (1854) e<br />
Gottlob Frege (1879), si utilizzano invece linguaggi formali. Le fasi essenziali nella costruzione di un<br />
sistema logico saranno allora:<br />
• definire la sintassi di un linguaggio formale adatto a rappresentare le argomentazioni di cui ci si<br />
vuole occupare; le espressioni di questo linguaggio saranno dette enunciati;<br />
• definire una semantica degli enunciati, che consenta di dire sotto quali condizioni gli enunciati<br />
sono veri;<br />
• definire un sistema deduttivo che permetta di ricavare conclusioni da premesse in modo tale da<br />
conservare la verità (ovvero: se le premesse sono vere, lo sono certamente anche le conclusioni);<br />
la sequenza di passi che consentono di ricavare le conclusioni è detta derivazione o deduzione o<br />
prova.<br />
Vediamo ora separatamente i tre aspetti.<br />
2.2 Il linguaggio formale degli enunciati<br />
Non esiste un unico linguaggio logico; diverse applicazioni, infatti, possono richiedere linguaggi<br />
differenti. Di volta in volta è necessario trovare un buon equilibrio fra due esigenze contrastanti:<br />
l’espressività del linguaggio, che deve consentire la rappresentazione degli enunciati che interessano; e la<br />
semplicità del sistema deduttivo. Un linguaggio poco espressivo può essere insufficiente, ma un<br />
linguaggio molto espressivo può essere troppo complesso da trattare.<br />
Più di un secolo di studi logici hanno portato a identificare alcune famiglie di linguaggi formali adeguati<br />
a diversi tipi di applicazione: il linguaggio proposizionale, il linguaggio predicativo del primo ordine, i<br />
linguaggi predicativi di ordine superiore, i linguaggi modali (che a loro volta possono essere<br />
proposizionali o predicativi).<br />
I linguaggi proposizionali consentono di analizzare le argomentazioni la cui validità dipende dall’uso<br />
corretto dei connettivi booleani (negazione, congiunzione, disgiunzione, condizionale, bicondizionale).<br />
Ad esempio:<br />
(2.1) D’inverno piove o nevica. È inverno e non piove. Quindi nevica.<br />
Nei linguaggi predicativi, invece, ci si occupa delle argomentazioni la cui validità dipende<br />
dall’articolazione interna degli enunciati in termini di riferimento e predicazione. Consideriamo ad<br />
esempio la seguente argomentazione:<br />
(2.2) Le banane sono gialle. Questa cosa non è gialla. Quindi questa cosa non è una banana.<br />
In questo caso, la validità dell’argomentazione può essere stabilita solo scomponendo gli enunciati al<br />
livello dei predicati (banana, giallo) e dei riferimenti (questa cosaß).<br />
I predicati che si applicano agli oggetti individuali (come quelli precedenti) si dicono del primo ordine.<br />
Del secondo ordine sono invece i predicati che si applicano ad altri predicati, come “essere un pregio”<br />
nell’argomentazione:<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
2 La logica 11<br />
(2.3) Quest’oggetto è robusto, mentre quell’altro non lo è. Essere robusto è un pregio. Quindi<br />
quest’oggetto ha un pregio che quell’altro non ha.<br />
I linguaggi predicativi di ordine superiore al primo presentano notevoli difficoltà tecniche e sono poco<br />
utilizzati nell’informatica.<br />
Altri linguaggi interessanti sono i linguaggi modali, in cui si prendono in considerazione “operatori”<br />
come necessario, possibile, obbligatorio, vietato, passato, futuro, eccetera. Ad esempio:<br />
(2.4) Pagare le tasse è senz’altro permesso, dato che è obbligatorio.<br />
Dal punto di vista formale, tutti i linguaggi logici sono comunque di tipo 2 nella gerarchia chomskyana;<br />
ovvero, sono definiti da una grammatica non contestuale. La ragione di questa scelta è, ancora una<br />
volta, la ricerca di un adeguato compromesso fra espressività e semplicità. Perché un linguaggio<br />
sufficientemente espressivo deve essere almeno di tipo 2 Ricordiamoci che lo scopo di un linguaggio<br />
logico è di formalizzare un frammento del linguaggio naturale. Per preservare almeno in parte<br />
l’espressività del linguaggio naturale è essenziale che le espressioni del linguaggio formale abbiano<br />
struttura ricorsiva; un linguaggio di tipo 3, definibile con una grammatica regolare, non sarebbe quindi<br />
sufficiente. D’altra parte, un linguaggio di tipo 1 (definibile con una grammatica contestuale)<br />
presenterebbe vantaggi limitati rispetto a un linguaggio di tipo 2 e sarebbe molto più difficile da trattare:<br />
le regole di deduzione sarebbero troppo complesse.<br />
Vediamo ora brevemente come le argomentazioni 2.1–2.4 verrebbero rappresentate in modo formale. La<br />
2.1 è, come si è già detto, un’argomentazione di livello proposizionale. Utilizzeremo i seguenti simboli<br />
proposizionali o enunciativi:<br />
• I sta per l’enunciato elementare “è inverno”;<br />
• P sta per l’enunciato elementare “piove”;<br />
• N sta per l’enunciato elementare “nevica”.<br />
Inoltre introduciamo i seguenti connettivi booleani:<br />
• ¬ per “non” (negazione);<br />
• ∧ per “e” (congiunzione);<br />
• ∨ per “o” (disgiunzione);<br />
• → per “se ... allora” (condizionale);<br />
• ↔ per “se e solo se” (bicondizionale).<br />
A questo punto, la 2.1 si può esprimere come:<br />
I → (P ∨ N), I ∧ ¬P |= N,<br />
dove il simbolo |= indica che l’enunciato N è conseguenza logica dell’insieme di enunciati<br />
{I → (P ∨ N), I ∧ ¬P}.<br />
Per l’argomentazione 2.2 introduciamo la costante a per “questa cosa” nonché i seguenti simboli<br />
predicativi:<br />
• B(–) per “– è una banana”;<br />
• G(–) per “– è giallo”.<br />
Inoltre introduciamo i due quantificatori:<br />
• ∀ per “tutti” (quantificatore universale);<br />
• ∃ per “alcuni” (quantificatore esistenziale).<br />
La 2.2 diventa allora:<br />
∀x(B(x) → G(x)), ¬G(a) |= ¬B(a).<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
2 La logica 12<br />
Si noti l’uso della variabile individuale x utilizzata come supporto alla quantificazione. Per la 2.3<br />
introduciamo la costante a per “quest’oggetto”, la costante b per “quell’altro”, il predicato del primo<br />
ordine R(–) per “– è robusto” e il predicato del secondo ordine P(–) per “– è un pregio”. Abbiamo:<br />
R(a) ∧ ¬R(b), P(R) |= ∃X(P(X) ∧ X(a) ∧ ¬X(b)).<br />
In questo caso abbiamo usato una variabile predicativa X per esprimere la quantificazione su predicati<br />
implicita in “ha un pregio”.<br />
Infine, per formalizzare l’argomentazione 2.4 introduciamo il simbolo proposizionale PagareLeTasse per<br />
“pagare le tasse”, nonché i seguenti operatori modali di tipo deontico:<br />
• O per “vietato”;<br />
• P per “possibile”.<br />
L’argomentazione 2.4 diventa allora:<br />
O PagareLeTasse |= P PagareLeTasse.<br />
La validità di quest’argomentazione dipende da una proprietà generale dell’obbligo che esprime una<br />
specifica di coerenza per i sistemi normativi (non si può coerentemente obbligare qualcuno a eseguire<br />
un’azione vietata).<br />
2.3 La verità<br />
Come abbiamo già visto, un’argomentazione è valida se conserva la verità delle premesse; dobbiamo<br />
quindi precisare che cosa sia il valore di verità di un enunciato. In effetti, il concetto di valore di verità è<br />
in qualche modo implicito nel concetto stesso di enunciato; un enunciato, infatti, è un’espressione<br />
linguistica che abbia un valore di verità definito.<br />
Nella logica classica (o booleana) si assume che ogni enunciato abbia esattamente un valore di verità, o<br />
vero (1) o falso (0): non c’è una terza possibilità (tertium non datur, per dirla con i logici classici). Nel<br />
corso di questo secolo sono stati proposti molti approcci alla logica che superano questa limitazione. Si<br />
hanno così le logiche polivalenti (in cui i valori di verità ammissibili sono più di due) e le logiche parziali<br />
(in cui si ammette che un enunciato possa non avere un valore di verità definito). Negli ultimi anni, poi,<br />
ha avuto molto successo la logica sfumata (inglese: fuzzy logic), in cui si ammette che il valore di verità di<br />
un enunciato possa essere un qualsiasi numero reale compreso nell’intervallo chiuso [0,1]. In questi<br />
appunti, però, ci manterremo nei confini della logica classica.<br />
Il problema ora è: come si assegna un valore di verità (1 o 0) a un enunciato formale Ciò che ci occorre<br />
è una semantica formale. A partire dai lavori in materia di Gottlob Frege (1879) la risposta è la seguente:<br />
il valore di verità di un enunciato complesso è definito ricorsivamente in funzione del valore di verità dei<br />
suoi componenti. Ad esempio, il valore di verità di ¬(P ∨ Q) è la negazione del valore di verità di P ∨<br />
Q, e questo a sua volta è la disgiunzione dei valori di verità di P e di Q. È chiaro che in questo modo il<br />
valore di verità di un enunciato complesso viene calcolato a partire dai valori di verità delle sue<br />
componenti elementari (nel nostro caso, gli enunciati P e Q). A questo punto il meccanismo si ferma: ai<br />
componenti elementari è necessario attribuire un valore di verità direttamente, per così dire dall’esterno.<br />
Ad esempio, se P significa “piove” il valore di verità di P non può essere stabilito su basi logiche, ma<br />
deve essere assegnato su basi fattuali: ad esempio guardando fuori dalla finestra.<br />
In generale, quindi, il valore di verità di un enunciato logico dipende da fattori extralogici. Questo non è<br />
però un problema perché, come si è già detto e come vedremo meglio in seguito, la logica non ha lo<br />
scopo di stabilire la verità di enunciati specifici, ma piuttosto di appurare se un’argomentazione è<br />
corretta, nel senso che conserva l’eventuale verità delle premesse.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
2 La logica 13<br />
Vediamo ad esempio come si potrebbe ragionare per stabilire che l’argomentazione 2.2 è valida. In<br />
forma simbolica, l’argomentazione è:<br />
∀x(B(x) → G(x)), ¬G(a) |= ¬B(a).<br />
Ragioniamo come segue. L’argomentazione riguarda certe categorie di oggetti fisici, le banane e gli<br />
oggetti gialli. Consideriamo l’insieme D, costituito da tutti gli oggetti fisici esistenti. Il predicato B(–)<br />
denota allora un ben preciso sottoinsieme di D, ovvero l’insieme di quegli oggetti che sono banane.<br />
Questo insieme, detto l’estensione del predicato B(–), sarà indicato con i(B) (la funzione i è detta funzione<br />
d’interpretazione). Analogamente, il predicato G(–) denota l’insieme i(G) ⊆ D degli oggetti gialli.<br />
La premessa ∀x(B(x) → G(x)) dice che ogni oggetto che sia una banana è giallo. Affinché tale premessa<br />
sia vera occorre che sia:<br />
(2.5) i(B) ⊆ i(G).<br />
La seconda premessa dell’argomentazione, ¬G(a), riguarda un oggetto specifico, cui faremo riferimento<br />
con la costante a. Quest’oggetto, detto la denotazione di a, sarà indicato con ∗a; dato che D è l’insieme<br />
di tutti gli oggetti, sarà naturalmente ∗a ∈ D. Affinché la premessa ¬G(a) sia vera dev’essere allora<br />
(2.6) ∗a ∉ i(G).<br />
Ragionando in termini insiemistici, dalla 2.5 e dalla 2.6 ricaviamo che<br />
(2.6) ∗a ∉ i(B).<br />
Ma questo ci dice che la conclusione, ¬B(a), è vera. Dunque, sotto l’ipotesi che le due premesse siano<br />
vere è certamente vera anche la conclusione, e l’argomentazione è valida.<br />
La cosa più importante da notare è che il nostro ragionamento vale anche se i predicati B e G sono<br />
interpretati non come “banana” e “giallo”, ma in qualunque altro modo (ad esempio come “lombardo” e<br />
“italiano”, o come “pinguino” e “parla”). Dunque la validità dell’argomentazione non dipende<br />
dall’interpretazione specifica dei predicati, ma solo dall’interpretazione che abbiamo attribuito ai simboli<br />
logici, come ∀, → e ¬. Questo fatto viene solitamente espresso dicendo che la validità di<br />
un’argomentazione dipende dalla forma degli enunciati, non dal loro contenuto.<br />
Un caso molto particolare è costituito <strong>dalle</strong> argomentazioni prive di premesse. Un’argomentazione di<br />
questo genere è corretta se e solo se la conclusione è sempre e comunque vera, qualunque sia lo stato<br />
effettivo delle cose. Ecco alcuni esempi:<br />
O Alberto è l’assassino oppure non lo è.<br />
Non può essere che Alberto sia l’assassino e contemporaneamente non lo sia.<br />
Un enunciato che non possa risultare falso, qualunque sia lo stato delle cose, si dice valido. Se ϕ è un<br />
enunciato valido, scriviamo:<br />
|= ϕ.<br />
2.4 La meccanizzazione della logica<br />
Abbiamo già detto che la logica ha l’obiettivo di formulare regole che consentano di stabilire se<br />
un’argomentazione è valida, ovvero se le conclusioni dell’argomentazione sono conseguenze logiche<br />
delle premesse. Ci resta da vedere che cosa si debba intendere con il termine “regola”.<br />
Nel corso del novecento, l’idea di regola si è venuta precisando sulla base dell’apparato concettuale della<br />
teoria della computabilità. Quando parliamo di regole per stabilire la validità di un’argomentazione<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
2 La logica 14<br />
intendiamo oggi una procedura effettivamente computabile, che prenda in ingresso l’insieme delle<br />
premesse e deduca o derivi la conclusione operando esclusivamente trasformazioni formali degli<br />
enunciati. Una procedura del genere viene denominata procedura di prova o calcolo logico o<br />
semplicemente calcolo. Se un calcolo C è in grado di derivare l’enunciato ϕ partendo da Γ scriviamo<br />
Γ |– C ϕ,<br />
o più semplicemente<br />
Γ |– ϕ.<br />
Gli enunciati appartenenti a Γ sono dette premesse, ϕ è detto conclusione e la derivazione formale di ϕ da<br />
Γ è detta dimostrazione o deduzione o derivazione o prova della conclusione a partire <strong>dalle</strong> premesse. Si<br />
dice anche che la conclusione deriva o è deducibile <strong>dalle</strong> premesse.<br />
Un calcolo può essere formulato (anzi: deve essere formulato) senza fare nessun riferimento alla<br />
semantica (e quindi alla verità degli enunciati). Naturalmente, però, lo scopo del calcolo è di derivare<br />
formalmente proprio le conseguenze logiche di un insieme di assiomi. Quindi la relazione che sussiste<br />
fra derivazione e conseguenza logica è molto importante.<br />
Diremo che un calcolo è corretto (inglese: sound) quando gli enunciati derivati da Γ sono effettivamente<br />
conseguenze logiche di Γ:<br />
se Γ |– ϕ, allora Γ |= ϕ.<br />
Viceversa, si dice completo un calcolo in grado di derivare tutte le conseguenze logiche delle premesse:<br />
se Γ |= ϕ, allora Γ |– ϕ.<br />
Attenzione però: nulla si dice sul comportamento del calcolo quando siano in ballo un insieme di<br />
premesse e un enunciato che non è conseguenza logica delle premesse: anche un calcolo completo<br />
potrebbe non essere in grado di stabilirlo in tempo finito. Per alcune logiche particolarmente semplici,<br />
tuttavia, sono disponibili algoritmi di decisione, ovvero procedure che terminano in tempo finito con una<br />
risposta positiva (ϕ deriva da Γ) o negativa (ϕ non deriva da Γ).<br />
A seconda della particolare logica considerata si possono così verificare le situazioni seguenti:<br />
• La logica è decidibile. Ovvero, esiste una procedura che termina in tempo finito con una risposta<br />
positiva (ϕ deriva da Γ) o negativa (ϕ non deriva da Γ). Come si è già detto, una procedura del<br />
genere viene chiamata algoritmo di decisione.<br />
• La logica è indecidibile, ma comunque semidecidibile. Ovvero, esiste una procedura che termina in<br />
tempo finito con una risposta positiva quando ϕ deriva da Γ, ma può non terminare quando ϕ non<br />
deriva da Γ. Una procedura del genere viene denominata procedura di semidecisione.<br />
• La logica è indecidibile e non semidecidibile. Ovvero, non esiste né un algoritmo di decisione né<br />
una procedura di semidecisione.<br />
La logica proposizionale, ad esempio, è decidibile, e lo sono pure alcuni frammenti interessanti della<br />
logica predicativa del primo ordine (come ad esempio la logica monadica del primo ordine, che ammette<br />
predicati con al più un argomento). La logica predicativa del primo ordine nella sua totalità è invece<br />
soltanto semidecidibile, e le logiche predicative di ordine superiore al primo sono indecidibili e non<br />
semidecidibili.<br />
A questo punto è interessante vedere come si presenta un calcolo logico. L’idea di base è che il calcolo<br />
si limita ad analizzare le argomentazioni dal punto di vista formale, senza fare mai appello al significato<br />
delle costanti, dei predicati e così via. In altre parole, i calcoli sono algoritmi di elaborazione simbolica<br />
che operano su espressioni formali (gli enunciati del linguaggio logico prescelto).<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
2 La logica 15<br />
Nel corso degli anni sono stati proposti diversi tipi di calcoli logici. Il motivo di questa proliferazione è<br />
che calcoli diversi rispondono a differenti esigenze. Ad esempio, un logico matematico è interessato non<br />
tanto a utilizzare un calcolo per dimostrare teoremi d’interesse matematico, quanto a studiare le proprietà<br />
matematiche della logica stessa; per questo non è importante che calcolare sia semplice e naturale, quanto<br />
piuttosto che le proprietà del calcolo siano facili da analizzare. Al contrario, un informatico sarà<br />
interessato all’utilizzo di un calcolo proprio per produrre automaticamente deduzioni, e quindi prenderà<br />
in considerazione l’efficienza del calcolo. Chi insegna la logica o la usa senza il supporto di strumenti<br />
automatici, infine, è interessato al fatto che le regole del calcolo siano intuitive e si possano facilmente<br />
applicare “a mano”.<br />
La maggior parte dei calcoli proposti nella letteratura cadono nelle seguenti categorie:<br />
• Calcoli di Hilbert. Sono adatti all’analisi dei sistemi logici, ma difficili da utilizzare a mano e<br />
inadatti all’implementazione informatica.<br />
• Calcoli della deduzione naturale. Sono abbastanza naturali da utilizzare a mano, ma richiedono<br />
una certa esperienza e non si prestano all’implementazione informatica.<br />
• Calcoli semantici e calcoli delle sequenze. Sono abbastanza semplici e naturali da utilizzare a mano<br />
e si prestano anche all’implementazione informatica.<br />
• Calcoli basati sul principio di risoluzione. Possono essere molto innaturali per l’uomo, ma si<br />
prestano molto bene all’implementazione informatica.<br />
Nel prossimo capitolo vedremo in dettaglio un calcolo di tipo semantico.<br />
2.5 La logica nell’intelligenza artificiale<br />
Ci resta ora da capire perché mai i concetti visti finora siano così importanti nell’intelligenza artificiale e<br />
in particolare nell’ingegneria della conoscenza. Un sistema intelligente può essere visto come un sistema<br />
in grado di ragionare a partire da un insieme di conoscenze. Nell’approccio “simbolico” all’intelligenza<br />
artificiale si identifica il ragionamento con una deduzione formale e un insieme di conoscenze con le<br />
premesse della deduzione. La logica simbolica fornisce quindi le basi teoriche per lo sviluppo di sistemi<br />
computazionali intelligenti.<br />
Sarebbe prematuro tentare di approfondire la questione a questo punto. Nei prossimi <strong>capitoli</strong> presenterò<br />
in modo un po’ più approfondito la logica dei predicati del primo ordine e cercherò di mostrare come<br />
possa essere utilizzata per risolvere problemi d’intelligenza artificiale.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 16<br />
3 La logica del primo ordine<br />
Questo capitolo è una breve introduzione alla logica dei predicati del primo ordine. Come abbiamo visto<br />
nel capitolo precedente, per definire una logica occorre presentarne il linguaggio formale, la semantica e<br />
il sistema deduttivo. I tre aspetti sono trattati separatamente nei prossimi paragrafi.<br />
3.1 Il linguaggio predicativo del primo ordine<br />
Il linguaggio predicativo del primo ordine è detto anche linguaggio predicativo elementare perché consente<br />
di predicare proprietà e relazioni concernenti gli elementi di un “universo del discorso”, detto<br />
comunemente dominio. Come si è già detto, questo linguaggio può essere visto come l’idealizzazione di<br />
un frammento del linguaggio umano. Come nelle lingue naturali, esistono due tipi di espressioni:<br />
• i termini, utilizzati per fare riferimento a individui del dominio;<br />
• le formule, e più in particolare gli enunciati, utilizzate per descrivere stati di cose riguardanti gli<br />
individui del dominio.<br />
Vediamo separatamente i due tipi di espressioni.<br />
3.1.1 I termini<br />
Il modo più semplice per fare riferimento a un individuo è l’uso di un “identificatore” che funzioni come<br />
un nome proprio. A questo scopo il linguaggio del primo ordine prevede l’uso di un insieme<br />
(eventualmente vuoto, al più numerabile) di identificatori, chiamati costanti individuali o più<br />
semplicemente costanti. Nel seguito le costanti saranno denotate con le lettere a, b, c, ..., eventualmente<br />
corredate da un indice numerico.<br />
A un individuo si può fare riferimento non solo con una costante, ma anche con un’espressione di tipo<br />
funzionale, come “il padre di ...”, dove “padre di” è vista come una funzione definita sugli individui del<br />
dominio. Il linguaggio prevede un insieme (eventualmente vuoto, al più numerabile) di funtori (o<br />
simboli di funzione). Per i funtori adotteremo le lettere f, g, h, ..., eventualmente corredate da un indice<br />
numerico. Ogni funtore f ha un numero prefissato n di argomenti; questo numero è detto l’arità del<br />
funtore. Si noti che è possibile ammettere anche funtori con arità zero. Questi coincidono peraltro con<br />
le costanti individuali; infatti, una funzione priva di argomenti è necessariamente costante, e quindi<br />
restituisce sempre lo stesso individuo come valore.<br />
Inoltre, nel linguaggio del primo ordine (anche se questo non ha un riscontro immediato nel linguaggio<br />
naturale) si può fare riferimento a un individuo tramite una variabile individuale (o semplicemente<br />
variabile). Le variabili disponibili, che indicheremo con le lettere x, y, z, ... (eventualmente corredate da<br />
un indice numerico), sono un’infinità numerabile. Intuitivamente, possiamo pensare che una variabile<br />
faccia riferimento a un individuo generico (anziché specifico) del dominio; di fatto, le variabili vengono<br />
introdotte come supporto per la quantificazione (vedi oltre).<br />
A questo punto è possibile dare la definizione ricorsiva di termine:<br />
• ogni costante individuale è un termine;<br />
• ogni variabile individuale è un termine;<br />
• ogni espressione della forma f(t 1 ,...,t n ) è un termine se f è un funtore di arità n e i t k sono termini.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 17<br />
Ecco alcuni esempi di termini (assumiamo che f e g siano funtori di arità uno e h sia un funtore di arità<br />
due):<br />
a x f(a) g(x) h(a,b) h(f(a),g(f(x))<br />
3.1.2 Le formule<br />
Il modo più immediato di descrivere uno stato di cose consiste nel dire che fra certi individui sussiste<br />
una data relazione, come quando diciamo “Alessandro è fratello di Barbara”. Come simboli di relazione<br />
utilizzeremo un insieme (non vuoto, al più numerabile) di predicati, per i quali adotteremo le lettere P, Q,<br />
R, ..., eventualmente corredate da un indice numerico. Ogni predicato P ha un numero prefissato n di<br />
argomenti; questo numero è detto l’arità del predicato.<br />
I predicati di arità due (o “a due posti”) sono utilizzati per rappresentare relazioni binarie. Così, se ad<br />
Alessandro e Barbara si fa riferimento rispettivamente con le costanti a e b, e la relazione “fratello” è<br />
rappresentata dal predicato P, la frase “Alessandro è fratello di Barbara” si rappresenta come P(a,b).<br />
Utilizzando predicati di arità adeguata, è possibile rappresentare relazioni anche fra terne, quaterne,<br />
eccetera, di individui.<br />
I predicati a un posto rappresentano proprietà di individui. Ad esempio, se il predicato Q rappresenta la<br />
proprietà “giovane”, la frase “Alessandro è giovane” si rappresenta come Q(a). Inoltre, è possibile<br />
utilizzare predicati a zero posti, che descrivono stati di cose in cui non interessi mettere in evidenza degli<br />
individui. Ad esempio, un predicato R di arità 0 può essere utilizzato per rappresentare la proposizione<br />
“piove”.<br />
Una relazione n-aria fra individui può essere vista anche come una funzione dall’insieme delle n-ple di<br />
individui nell’insieme booleano {0,1}. Ovvero, una relazione associa a ogni n-pla di individui un valore<br />
di verità (1 o 0) a seconda che la relazione sussista o non sussista fra gli individui dati. Allora, un<br />
predicato a zero argomenti rappresenta una funzione a zero argomenti (e quindi costante) nell’insieme<br />
dei valori di verità; ne segue che un predicato a zero argomenti rappresenta semplicemente un valore di<br />
verità.<br />
A questo punto siamo in grado di definire il tipo più semplice di formule, ovvero le formule atomiche:<br />
• ogni espressione della forma P(t 1,...,t n) è una formula atomica se P è un predicato di arità n e i t k<br />
sono termini.<br />
A partire <strong>dalle</strong> formule atomiche si possono costruire formule più complesse utilizzando i simboli logici,<br />
ovvero i connettivi booleani e i quantificatori. I connettivi e i quantificatori normalmente utilizzati sono i<br />
seguenti:<br />
• un connettivo unario (ovvero, con un solo argomento): la negazione (¬);<br />
• quattro connettivi binari: la congiunzione (∧), la disgiunzione (∨), il condizionale (→) e il<br />
bicondizionale (↔);<br />
• due quantificatori: universale (∀) ed esistenziale (∃).<br />
Ecco allora la definizione ricorsiva di formula:<br />
• ogni formula atomica è una formula;<br />
• ogni espressione della forma ¬ϕ se ϕ è una formula;<br />
• ogni espressione della forma (ϕ ∧ ψ), (ϕ ∨ ψ), (ϕ → ψ) e (ϕ ↔ ψ) è una formula se ϕ e ψ sono<br />
formule;<br />
• ogni espressione della forma ∀xϕ e ∃xϕ è una formula se x è una variabile e ϕ è una formula.<br />
Per quanto riguarda l’ultima clausola, si noti che ϕ è del tutto arbitraria: non si richiede né che ϕ<br />
contenga la variabile x, né che non contenga altre variabili.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 18<br />
Come si può notare, le regole di formazione connesse con l’uso di connettivi booleani binari (∧, ∨, →,<br />
↔) prescrivono l’uso di parentesi. Tuttavia, per evitare l’eccesso di parentesi si introducono le seguenti<br />
convenzioni:<br />
• si possono tralasciare le eventuali parentesi esterne di una formula; ad esempio:<br />
(((¬P ∧ Q) ∧ R) → S) ⎯⎯→ ((¬P ∧ Q) ∧ R) → S;<br />
• quando un connettivo binario viene ripetuto, possono essere eliminate le parentesi se il<br />
raggruppamento delle sottoformule è da sinistra verso destra:<br />
((¬P ∧ Q) ∧ R) → S ⎯⎯→ (¬P ∧ Q ∧ R) → S;<br />
• fra i simboli logici (connettivi e quantificatori) esiste la seguente gerarchia di precedenza:<br />
{¬, ∀, ∃} > {∧} > {∨} > {→} > {↔};<br />
ad esempio:<br />
(¬P ∧ Q ∧ R) → S ⎯⎯→ ¬P ∧ Q ∧ R → S,<br />
((P → Q) ↔ (Q → P)) ⎯⎯→ (P → Q) ↔ (Q → P) ⎯⎯→ P → Q ↔ Q → P,<br />
(∀xP(x) → Q(x)) ⎯⎯→<br />
3.1.3 Variabili libere e variabili vincolate<br />
∀xP(x) → Q(x).<br />
Una formula che non contenga variabili si dice fondamentale (inglese: ground). Se una formula contiene<br />
variabili ne può contenere più d’una, ognuna con una o più occorrenze. Ad esempio, la formula<br />
∀xP(x,y) ∧ Q(x) contiene tre occorrenze della variabile x (compresa l’occorrenza che segue<br />
immediatamente il quantificatore) e una occorrenza della variabile y.<br />
Ogni quantificatore ha un ambito o campo di applicazione (inglese: scope). Ad esempio, nella formula<br />
∀xP(x,y) ∧ Q(x) l’ambito di ∀x è la formula P(x,y); nella formula ∀x(P(x,y) ∧ Q(x)), invece, l’ambito di<br />
∀x è la formula P(x,y) ∧ Q(x). Un’occorrenza di una variabile x si dice vincolata se è l’occorrenza che<br />
segue immediatamente il simbolo del quantificatore oppure se sta nell’ambito di un quantificatore ∀x o<br />
∃x; ogni altra occorrenza si dice invece libera. Ad esempio, nella formula ∀xP(x,y) ∧ Q(x) le prime due<br />
occorrenze di x sono vincolate, la terza è libera, e l’unica occorrenza di y è libera.<br />
Le variabili delle formule logiche si comportano in modo analogo alle variabili locali dei linguaggi di<br />
programmazione (in questo senso, il quantificatore assomiglia alla dichiarazione di una variabile locale):<br />
si può sostituire una variabile vincolata con un’altra variabile in modo sistematico senza cambiare il<br />
senso di una formula, purché in questo modo non si alterino i vincoli di altre variabili. Ad esempio, le<br />
formule ∀xP(x,y) e ∀zP(z,y) sono sostanzialmente la stessa formula, e si dicono variante alfabetica l’una<br />
dell’altra; la formula ∀yP(y,y) è invece sostanzialmente diversa, perché la seconda occorrenza di y, prima<br />
libera, è ora vincolata.<br />
Le formule contenenti variabili libere non sono facili da interpretare in modo intuitivo: mentre P(a)<br />
significa che l’individuo a ha la proprietà P, e ∀xP(x) significa che tutti gli individui hanno la proprietà P,<br />
non è ovvio come vada interpretata la formula P(x). Supponiamo ad esempio che a denoti Alessandro e<br />
P la proprietà “giovane”. Allora P(a) significa che Alessandro è giovane, e ∀xP(x) che tutti sono giovani;<br />
ma che cosa significa P(x) Per questo motivo, si usa distinguere fra le formule aperte, che presentano<br />
occorrenze libere di variabili e la cui interpretazione è in qualche modo incompleta, e le formule chiuse,<br />
che non contengono occorrenze libere di variabili e che sono quindi completamente interpretate.<br />
Un’altra anomalia è costituita <strong>dalle</strong> formule che, per così dire, sono “troppo quantificate”. Ad esempio,<br />
è difficile assegnare un’interpretazione intuitiva alle formule ∃xP(a) o ∃x∀xP(x). Il quantificatore ∃x,<br />
infatti, è ridondante in ambedue le formule perché non ci sono nel suo ambito occorrenze libere (e<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 19<br />
quindi quantificabili) di x. Nel seguito riserveremo il termine “enunciato” a un sottoinsieme delle<br />
formule. Più precisamente, chiameremo enunciato ogni formula che sia chiusa (e quindi non abbia<br />
occorrenze libere di variabili) e priva di quantificatori ridondanti (ovvero, ogni quantificatore applicato a<br />
una variabile x deve avere nel suo ambito almeno un’occorrenza libera di x).<br />
Infine, se ϕ è una formula, x è una variabile e t un termine qualsiasi, con ϕ(t/x) indicheremo la formula<br />
che si ottiene partendo da ϕ e sostituendo ogni occorrenza libera di x con il termine t. Ad esempio, se ϕ<br />
è la formula P(x) ∧ ∀xQ(x), allora ϕ(a/x) è la formula P(a) ∧ ∀xQ(x).<br />
3.1.4 Linguaggio o linguaggi<br />
Nei paragrafi precedenti abbiamo sempre parlato di linguaggio del primo ordine, al singolare. In realtà<br />
abbiamo definito non un linguaggio singolo, ma una famiglia di linguaggi. Si ottengono linguaggi<br />
diversi, infatti, modificando l’insieme delle costanti individuali, o l’insieme dei funtori, o l’insieme dei<br />
predicati. Fisso è invece l’insieme dei simboli logici (connettivi e quantificatori) nonché l’insieme delle<br />
variabili (le variabili sono comunque un’infinità numerabile, e non importa quali simboli vengano scelti<br />
per indicarle).<br />
Effettivamente, un linguaggio del primo ordine è completamente definito solo quando gli insiemi delle<br />
costanti, dei funtori e dei predicati sono stati fissati. Ma questo è possibile solo quando sia noto<br />
l’universo del discorso, che cambia da applicazione ad applicazione. Ad esempio, se voglio parlare della<br />
mia famiglia avrò bisogno di costanti individuali per denominare i miei familiari, di funtori come<br />
padre(–) e madre(–), e di predicati come Fratello(–,–), Zio(–,–) eccetera. Per parlare dei numeri naturali<br />
avrò invece bisogno della costante 0 e del funtore successore(–). E così via.<br />
C’è però un predicato binario particolarmente significativo, che può essere introdotto indipendentemente<br />
dall’applicazione: si tratta del predicato di uguaglianza, =. Si parla allora di linguaggio del primo ordine<br />
con l’uguaglianza. In generale, per rappresentare l’uguaglianza fra due individui si preferisce la scrittura<br />
infissa,<br />
t 1 = t 2,<br />
più tradizionale della scrittura prefissa =(t 1 ,t 2 ). Inoltre scriveremo t 1 ≠ t 2 anziché ¬(t 1 = t 2 ).<br />
3.2 La semantica formale<br />
3.2.1 Modelli, verità e validità<br />
Per interpretare i simboli non logici fissiamo un insieme D di individui, detto dominio<br />
dell’interpretazione. Il dominio non può essere vuoto, ma per il resto è un insieme arbitrario. L’idea è<br />
che D contenga tutti gli individui (di qualunque natura) che costituiscono l’universo del discorso di una<br />
certa applicazione. Ad esempio, D potrebbe coincidere con l’insieme dei numeri naturali, o con<br />
l’insieme dei punti di uno spazio euclideo, o con l’insieme di tutti gli oggetti fisici contenuti in una<br />
stanza, o con l’insieme di tutte le aziende europee. Quando sarà necessario, denoteremo gli elementi del<br />
dominio con le lettere a, b, c, ..., eventualmente corredate da un indice numerico. Attenzione: è<br />
importante non confondere i simboli (come a, b, c, ...) utilizzati nel testo per denotare gli elementi del<br />
dominio con i simboli (a, b, c, ...) che costituiscono le costanti del linguaggio formale.<br />
Una volta fissato D, interpretiamo ogni costante come il nome di un individuo di D, ogni funtore come il<br />
nome di una funzione fra elementi di D e ogni predicato come il nome di una relazione fra elementi di D.<br />
Definiamo allora la funzione d’interpretazione i(–) nel modo seguente:<br />
• per ogni costante a, l’interpretazione i(a) è un elemento di D;<br />
• per ogni funtore f di arità n, l’interpretazione i(f) è una funzione D n → D;<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 20<br />
• per ogni predicato P di arità n, l’interpretazione i(P) è una funzione D n → {0,1}, ovvero la<br />
funzione caratteristica di una relazione n-aria su D.<br />
Come si vede, l’interpretazione i(–) non assegna un valore alle variabili, benché anche queste denotino<br />
individui di D. Il motivo è che le variabili, al contrario delle costanti, servono come supporto alla<br />
quantificazione e quindi vanno trattate in modo diverso. Introduciamo allora un secondo concetto,<br />
quello di assegnamento di valore alle variabili. Si tratta di un’ulteriore funzione e(–) tale che:<br />
• per ogni variabile x, l’assegnamento e(x) è un elemento di D.<br />
Vedremo più avanti come la funzione e(–) ci permetta di assegnare un significato ai quantificatori.<br />
Siamo ora in grado di definire che cosa denotino i termini del linguaggio, dati un assegnamento e(–) ed<br />
un modello<br />
M = 〈D,i(–)〉,<br />
dove D è un dominio e i(–) è una funzione d’interpretazione. La definizione è data per ricorsione<br />
strutturale; ovvero, abbiamo una definizione che ricalca la struttura ricorsiva dei termini funzionali. La<br />
denotazione ∗t di un termine t è l’elemento del dominio così definito:<br />
• ∗a = i(a) per ogni costante a del linguaggio;<br />
• ∗x = e(x) per ogni variabile x del linguaggio;<br />
• ∗f(t 1,...,t n(f)) = i(f)(∗t 1,...,∗t n) per ogni termine funzionale del linguaggio.<br />
A questo punto possiamo definire il concetto di verità di un enunciato in un modello. Per prima cosa<br />
definiamo il concetto di valore di verità v(ϕ,M,e) di un enunciato ϕ in un modello M rispetto un<br />
assegnamento e. Come nel caso della denotazione, la definizione è data per ricorsione strutturale, ovvero<br />
ricalcando la struttura ricorsiva delle formule. Ecco la definizione di v:<br />
v(P(t 1 ,...,t n ),M,e) = 1 se i(P)(∗t 1 ,...,∗t n ) = 1,<br />
= 0 altrimenti;<br />
v(¬ϕ,M,e) = 1 se v(ϕ,M,e) = 0,<br />
= 0 altrimenti;<br />
v(ϕ ∧ ψ,M,e) = 1 se v(ϕ,M,e) = v(ψ,M,e) = 1,<br />
= 0 altrimenti;<br />
v(ϕ ∨ ψ,M,e) = 0 se v(ϕ,M,e) = v(ψ,M,e) = 0,<br />
= 1 altrimenti;<br />
v(ϕ → ψ,M,e) = 1 se v(ϕ,M,e) ≤ v(ψ,M,e),<br />
= 0 altrimenti;<br />
v(ϕ ↔ ψ,M,e) = 1 se v(ϕ,M,e) = v(ψ,M,e),<br />
= 0 altrimenti.<br />
Prima di definire il valore di verità delle formula quantificate, introduciamo una particolare relazione di<br />
equivalenza fra assegnamenti di valori alle variabili. Se x è una variabile qualsiasi, due assegnamenti e<br />
ed e’ si dicono x-equivalenti, in simboli<br />
e ≈ x e’,<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 21<br />
se e solo se i due assegnamenti sono identici tranne al più il valore assegnato alla variabile x, ovvero:<br />
e(y) = e’(y) per ogni variabile y distinta da x.<br />
Si può verificare facilmente che la relazione è effettivamente una relazione di equivalenza fra<br />
assegnamenti, in quanto gode delle proprietà riflessiva, simmetrica e transitiva. Definiamo ora il valore<br />
di verità delle formule quantificate:<br />
v(∀xϕ,M,e) = 1 se per ogni assegnamento e’ ≈ x e si ha v(ϕ,M,e’) = 1,<br />
= 0 altrimenti;<br />
v(∃xϕ,M,e) = 1 se c’è almeno un assegnamento e’ ≈ x e tale che v(ϕ,M,e’) = 1,<br />
= 0 altrimenti.<br />
Nel caso sia presente nel linguaggio il predicato di uguaglianza, aggiungiamo la clausola:<br />
v(t 1 = t 2 ,M,e) = 1 se ∗t 1 = ∗t 2 ,<br />
= 0 altrimenti.<br />
Diciamo poi che una formula è vera in un modello M, e scriviamo<br />
|= M ϕ,<br />
se e solo se per ogni possibile assegnamento e si ha<br />
v(ϕ,M,e) = 1.<br />
Questa definizione si estende facilmente a un insieme arbitrario Γ di formule (eventualmente vuoto o<br />
infinito):<br />
|= M Γ se e solo se per ogni formula γ∈Γ si ha |= M γ.<br />
Possiamo finalmente definire il concetto di conseguenza logica:<br />
Γ |= ϕ se e solo se per ogni modello M tale che |= M Γ si ha |= M ϕ.<br />
In altre parole: ϕ (la conclusione) è conseguenza logica di Γ (le premesse) se e solo se ogni modello che<br />
renda vere tutte le formule di Γ rende vera anche ϕ. Nel caso particolare in cui Γ sia un insieme vuoto,<br />
|= ϕ,<br />
si ha che ϕ è vera sempre, in qualunque modello M. La formula ϕ si dice allora valida.<br />
Occorre distinguere nettamente fra la verità di una formula in un modello sotto un determinato<br />
assegnamento e la verità di una formula in un modello. Ad esempio, è possibile che sotto un determinato<br />
assegnamento la formula P(x) sia vera e la formula ∀xP(x) sia falsa; al contrario, la formula P(x) è vera<br />
in un modello M se e solo se la formula ∀xP(x) è anch’essa vera nel modello M. Per mostrare che P(x)<br />
può essere vera quando ∀xP(x) è falsa, consideriamo:<br />
M = 〈D,i(–)〉,<br />
con<br />
D = {a,b},<br />
i(P)(a) = 1,<br />
i(P)(b) = 0,<br />
e(x) = a.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 22<br />
Dalla definizione di verità abbiamo allora:<br />
v(P(x),M,e) = 1,<br />
perché i(P)(∗x) = i(P)(e(x)) = i(P)(a) = 1. Invece abbiamo<br />
v(∀xP(x),M,e) = 0,<br />
perché c’è un assegnamento e’, x-equivalente a e, tale che non vale v(P(x),M,e) = 0. L’assegnamento e’<br />
è definito da:<br />
e’(x) = b.<br />
Per quanto riguarda il fatto che P(x) è invece vera in un modello se e solo se lo è ∀xP(x), si consideri che<br />
se P(x) è vera in un modello per ogni possibile assegnamento e, allora non può esistere un assegnamento<br />
che renda P(x) falsa, e viceversa. Quindi:<br />
|= M P(x) se e solo se |= M ∀xP(x).<br />
3.2.2 Condizionale e implicazione<br />
La semantica del condizionale può risultare poco intuitiva. In particolare, sembra curioso che un<br />
enunciato italiano come<br />
“se Sean Connery è un ingegnere, allora Tokio è la capitale dell’Italia”<br />
risulti vera, una volta formalizzata come<br />
P → Q,<br />
dato che sia l’antecedente P (se Sean Connery è un ingegnere) sia il conseguente Q (Tokio è la capitale<br />
dell’Italia) sono entrambe false. La prima osservazione è che in realtà frasi di questo tipo vengono<br />
davvero utilizzate, se non altro in modo idiomatico. Ad esempio, qualcuno potrebbe dire<br />
“se Sean Connery è un ingegnere, allora io sono un pesce rosso”<br />
senza suscitare stupore. L’idea è che dato che il conseguente è palesemente falso, allora affinché il<br />
condizionale sia vero anche l’antecedente dev’essere falso. L’affermazione comporta quindi che<br />
“Sean Connery non è un ingegnere”.<br />
ed è proprio per comunicare questo che viene. Un altro caso in cui si utilizzano condizionali del genere è<br />
quando non è ancora possibile stabilire se l’antecedente è vero o falso. Ad esempio, posso dire<br />
“se mi inviti a cena, porto una bottiglia di champagne”.<br />
Supponiamo che alla fine il mio interlocutore non mi inviti lo stesso a cena (antecedente falso). A<br />
questo punto posso benissimo non portare la bottiglia di champagne (conseguente falso) senza per<br />
questo mancare all’impegno (condizionale vero).<br />
Uno dei motivi per cui la semantica del condizionale è percepita come controintuitiva deriva dalla<br />
frequente confusione fra condizionale e implicazione. Mentre un condizionale è semplicemente una<br />
formula di forma ϕ → ψ, un’implicazione è per definizione un condizionale valido:<br />
|= ϕ → ψ.<br />
Ad esempio, è corretto dire che l’enunciato P ∧ Q implica (in particolare) l’enunciato P, perché si ha:<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 23<br />
|= P ∧ Q → P.<br />
Considerazioni analoghe valgono per il connettivo ↔: mentre un bicondizionale è una formula di forma<br />
ϕ ↔ ψ, un’equivalenza è per definizione un bicondizionale valido:<br />
|= ϕ ↔ ψ.<br />
Ad esempio, è corretto dire che l’enunciato P ∧ Q è equivalente all’enunciato Q ∧ P, perché si ha:<br />
|= P ∧ Q ↔ Q ∧ P.<br />
3.3 Una procedura di prova per enunciati del primo ordine<br />
Presenterò ora una procedura di prova per la logica del primo ordine, che chiamerò calcolo degli alberi<br />
semantici, ispirato a un metodo proposto da Beth (1955). La definizione del calcolo è qui limitata a un<br />
linguaggio del primo ordine privo di funtori, ma potrebbe essere esteso al caso generale. Per semplicità,<br />
il calcolo richiede che tutte le formule utilizzate siano formule chiuse (in particolare enunciati). Questo<br />
vincolo non è però limitativo dal punto di vista delle applicazioni.<br />
L’idea è la seguente. Consideriamo un insieme Γ di enunciati e un ulteriore enuciato ϕ. Dire che<br />
(5.1) Γ |= ϕ<br />
equivale a dire che ϕ è vero in ogni modello di Γ o, in altre parole, che non esiste un modello che renda<br />
vere tutte le premesse di Γ e renda falsa la conclusione ϕ. Il calcolo tenta di dimostrare la 5.1 per<br />
assurdo. Ovvero: si tenta sistematicamente di costruire un modello di Γ che falsifichi ϕ (cioè un modello<br />
in cui tutte le premesse siano vere e la conclusione sia falsa); se il tentativo porta inevitabilmente a una<br />
contraddizione, se ne deduce che un simile modello non può esistere, e quindi che la conclusione è<br />
conseguenza logica delle premesse. Quando il calcolo termina in un numero finito di passi portando<br />
inevitabilmente a una contraddizione scriviamo:<br />
Γ |– ϕ<br />
e diciamo che ϕ deriva da Γ. Se poi ϕ deriva da un insieme vuoto di premesse scriviamo<br />
|– ϕ<br />
e diciamo che ϕ è un teorema.<br />
Il calcolo dà luogo a una procedura di prova corretta e completa. Infatti adattando la dimostrazione<br />
originale di Beth è possibile provare che:<br />
• Il calcolo degli alberi semantici è corretto, ovvero: se la procedura termina con un albero in cui<br />
tutti i rami contengono il falsum, la conclusione è conseguenza logica delle premesse:<br />
se Γ |– ϕ, allora Γ |= ϕ.<br />
• Il calcolo degli alberi semantici è completo, ovvero: se la conclusione è conseguenza logica delle<br />
premesse, la procedura termina con un albero in cui tutti i rami contengono il falsum:<br />
se Γ |= ϕ, allora Γ |– ϕ.<br />
La prova vale anche nel caso in cui Γ contenga infinite premesse (vedi Beth, 1955).<br />
Occorre notare che la completezza non garantisce la decidibilità. Infatti, se ϕ non è conseguenza logica<br />
di Γ, la procedura può terminare fornendo la descrizione di un controesempio (ovvero di un modello di Γ<br />
che falsifica ϕ) oppure non terminare. Ci si può chiedere se la procedura possa essere modificata in<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 24<br />
modo da terminare sempre con una risposta univoca, positiva o negativa. Si sa però che ciò non è<br />
possibile, perché in questo modo avremmo un algoritmo di decisione per la logica del primo ordine, ed è<br />
stato dimostrato da Church (1936) che un simile algoritmo non esiste. Tuttavia, il calcolo degli alberi<br />
semantici si comporta come un algoritmo di decisione (in quanto termina sempre) se gli enunciati presi<br />
in considerazione sono proposizionali (ovvero non contengono variabili né quantificatori).<br />
3.3.1 Il calcolo degli alberi semantici: esempi introduttivi<br />
Come si è già detto, il calcolo degli alberi semantici tenta di dimostrare che la conclusione, ϕ, può essere<br />
falsa anche se le premesse, Γ, sono tutte vere. A questo scopo si costruisce un albero, detto albero<br />
semantico. L’albero è costituito da un certo numero di nodi, ognuno dei quali è una “struttura dati” con<br />
quattro campi (tre se le formule sono esclusivamente proposizionali), che scriveremo su un’unica riga. I<br />
campi sono nell’ordine:<br />
• il numero d’identificazione del nodo;<br />
• un enunciato;<br />
• una giustificazione;<br />
• una lista di costanti introdotte (presente solo se compaiono i quantificatori).<br />
Ad esempio, supponiamo di voler verificare se<br />
P → Q, P |= Q.<br />
Iniziamo con i primi tre nodi dell’albero:<br />
num enunciato giustificazione (costanti)<br />
1. P → Q premessa<br />
2. P premessa<br />
3. ¬Q ¬conclusione<br />
Ovvero:<br />
• il nodo numero 1 contiene l’enunciato P → Q, assunto come premessa;<br />
• il nodo numero 2 contiene l’enunciato P, anch’esso assunto come premessa;<br />
• coerentemente con la strategia di dimostrare la conseguenza logica per assurdo, il nodo numero 3<br />
contiene l’enunciato ¬Q, assunto come negazione della conclusione.<br />
La dimostrazione prosegue cercando di dimostrare che esiste un modello M che può soddisfare gli<br />
enunciati dei nodi 1, 2 e 3; ovvero, che esiste un modello M che verifica le premesse e falsifica la<br />
conclusione. Il sistema deduttivo utilizza 14 regole deduttive: 7 per la negazione, 6 per le altre costanti<br />
logiche (congiunzione, disgiunzione, condizionale, bicondizionale, quantificatore universale,<br />
quantificatore esistenziale) e 1 per l’introduzione del falsum (che rappresenta l’esistenza di una<br />
contraddizione).<br />
Il sistema di deduzione procede in questo modo:<br />
• per ogni regola applicabile a un enunciato viene inserita in un’attivazione in un’agenda;<br />
• se l’agenda è vuota il processo deduttivo termina;<br />
• se l’agenda invece contiene delle attivazioni, sei sceglie un’attivazione in base a criteri che<br />
vedremo in seguito, la si rimuove dall’agenda e la si esegue.<br />
Nel nostro caso, l’unica regola applicabile è:<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 25<br />
rule →<br />
if ϕ → ψ<br />
then ¬ϕ | ψ.<br />
La regola si legge così:<br />
• il nome della regola (rule →) coincide con la costante logica trattata dalla regola;<br />
• la condizione di applicazione della regola (if ϕ → ψ) identifica il tipo di enunciato che può attivare<br />
la regola;<br />
• l’azione (then ¬ϕ | ψ) indica ciò che va fatto quando un’attivazione della regola è eseguita.<br />
Nel nostro caso, l’azione ¬ϕ | ψ indica che nell’albero della dimostrazione deve essere introdotta una<br />
biforcazione: nel ramo sinistro viene inserito un nodo con l’enunciato ¬ϕ, nel ramo destro un nodo con<br />
l’enunciato ψ. Questa azione è giustificata dal fatto che se il modello M che stiamo cercando di costruire<br />
verifica ϕ → ψ, allora in M dev’essere vera ¬ϕ oppure vera ψ.<br />
La regola “→” è applicabile all’enunciato del nodo 1; viene quindi generata un’attivazione della regola,<br />
che descriviamo come →(1), ovvero: la regola “→” applicata al nodo 1. L’attivazione viene inserita<br />
nell’agenda, inizialmente vuota, che diventa quindi {→(1)}. Nessun’altra regola è applicabile ai nodi 1,<br />
2 e 3.<br />
A questo punto dobbiamo scegliere un’attivazione da eseguire. Dato che l’agenda contiene solo →(1),<br />
quest’attivazione viene scelta, rimossa dall’agenda ed eseguita. Eseguire l’attivazione significa effettuare<br />
l’azione della regola corrispondente.<br />
L’albero diventa quindi:<br />
1. P → Q premessa<br />
2. P premessa<br />
3. ¬Q ¬conclusione<br />
4. ¬P →(1) 4’. Q →(1)<br />
Ora consideriamo la regola, che consente di introdurre il falsum (⊥), che indica la presenza di una<br />
contrazzizione in un ramo dell’albero. La regola ha due condizioni (ϕ e ¬ϕ) e un’azione:<br />
rule ⊥<br />
if ϕ , ¬ϕ<br />
then ⊥.<br />
Sull’albero mostrato sopra, questa regola genera due attivazioni: ⊥(2,4) nel ramo sinistro e ⊥(4’,3) nel<br />
ramo destro.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 26<br />
Dopo aver eseguito entrambe le attivazioni abbiamo:<br />
1. P → Q premessa<br />
2. P premessa<br />
3. ¬Q ¬conclusione<br />
4. ¬P →(1) 4’. Q →(1)<br />
5. ⊥ ⊥(2,4) 5’. ⊥ ⊥(4’,3)<br />
Ai nostri fini, ogni ramo che contiene il falsum può essere scartato perché nessun modello M può<br />
rendere vera una contraddizione. In altre parole, ogni ramo dell’albero che contiene il falsum indica un<br />
tentativo fallito di costruire un modello che renda vere le premesse e falsa la conclusione. Nel nostro<br />
caso soltanto due tentativi erano giustificati (i due rami dell’albero), e sono ambuedue falliti. Ne segue<br />
che non esiste nessun modello che renda le due premesse vere e la conclusione falsa. Ciò significa, per<br />
definizione, che la conclusione è conseguenza logica delle premesse.<br />
Occorre chiarire bene un punto essenziale. Nell’esecuzione manuale della procedura ci siamo<br />
abbondantemente basati sulla nostra intuizione di che cosa significhi che un enunciato è vero o falso, e<br />
di che cosa siano un condizionale e una contraddizione. Tuttavia, il metodo è completamente<br />
algoritmico; ovvero, può essere eseguito da un calcolatore come puro processo di manipolazione di<br />
espressioni simboliche, senza la minima comprensione del significato dei simboli. Si tratta quindi di un<br />
vero e proprio calcolo. Abbiamo quindi dimostrato che:<br />
P → Q, P |− Q.<br />
Poiché, come vedremo, il calcolo degli alberi semantici è corretto ne ricaviamo anche che:<br />
P → Q, P |= Q.<br />
Come secondo esempio, proviamo a verificare se<br />
P → Q, Q |= P.<br />
Iniziamo da:<br />
Proseguendo come prima arriviamo a:<br />
1. P → Q premessa<br />
2. Q premessa<br />
3. ¬P ¬conclusione<br />
1. P → Q premessa<br />
2. Q premessa<br />
3. ¬P ¬conclusione<br />
4. ¬P →(1) 4’. Q →(1)<br />
Ora però non è possibile introdurre il falsum in nessuno dei due rami. Poiché nessuna regola nuova è<br />
applicabile all’albero, l’agenda delle attivazioni è vuota e la procedura termina. Ogni ramo dell’albero<br />
che dopo la terminazione non contenga il falsum ci descrive un possibile controesempio all’ipotesi<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 27<br />
iniziale (ovvero, un modello che rende vere le premesse e falsa la conclusione). Nel nostro caso<br />
ambedue i rami descrivono lo stesso controesempio: un modello che renda P falso (¬P) e Q vero (Q).<br />
In conclusione abbiamo<br />
P → Q, Q |-/- P.<br />
Dato che, come vedremo, il calcolo degli alberi semantici è completo ne ricaviamo che<br />
P → Q, Q |≠ P.<br />
Lo stesso metodo si applica in assenza di premesse. Ad esempio, verifichiamo se<br />
|= P ∧ Q → P.<br />
Iniziamo con:<br />
1. ¬(P ∧ Q → P) ¬conclusione<br />
Ora possiamo applicare una delle regole della negazione, e più precisamente:<br />
rule ¬→<br />
if ¬(ϕ → ψ)<br />
then ϕ , ¬ψ.<br />
In questo caso non ci sarà nessuna biforcazione, perché l’azione (then ϕ , ¬ψ) aggiunge due nodi allo<br />
stesso ramo dell’albero:<br />
1. ¬(P ∧ Q → P) ¬conclusione<br />
2. P ∧ Q ¬→(1)<br />
3. ¬P ¬→(1)<br />
Ora possiamo applicare la regola della congiunzione:<br />
rule ∧<br />
if ϕ ∧ ψ<br />
then ϕ , ψ.<br />
Anche questa regola non introduce biforcazioni:<br />
1. ¬(P ∧ Q → P) ¬conclusione<br />
2. P ∧ Q ¬→(1)<br />
3. ¬P ¬→(1)<br />
4. P ∧(2)<br />
5. Q ∧(2)<br />
Ora è applicabile la regola per l’introduzione del falsum:<br />
1. ¬(P ∧ Q → P) ¬conclusione<br />
2. P ∧ Q ¬→(1)<br />
3. ¬P ¬→(1)<br />
4. P ∧(2)<br />
5. Q ∧(2)<br />
6. ⊥ ⊥(4,3)<br />
Poiché l’unico ramo dell’albero fallisce, ne ricaviamo:<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 28<br />
|− P ∧ Q → P.<br />
3.3.2 Il calcolo degli alberi semantici: le regole per i connettivi booleani<br />
Di seguito sono elencate le nove regole per i connettivi booleani; il lettore è invitato a verificarne la<br />
correttezza in base alla semantica formale del linguaggio logico.<br />
Quattro regole riguardano i connettivi booleani binari:<br />
rule ∧ rule ∨<br />
if ϕ ∧ ψ if ϕ ∨ ψ<br />
then ϕ , ψ. then ϕ | ψ.<br />
rule → rule ↔<br />
if ϕ → ψ if ϕ ↔ ψ<br />
then ¬ϕ | ψ.<br />
then ϕ , ψ | ¬ϕ , ¬ψ.<br />
Cinque regole concernono i cinque connettivi booleani quando compaiono nell’ambito di una negazione:<br />
rule ¬¬<br />
if ¬¬ϕ<br />
then ϕ.<br />
rule ¬∧ rule ¬∨<br />
if ¬(ϕ ∧ ψ) if ¬(ϕ ∨ ψ)<br />
then ¬ϕ | ¬ψ.<br />
then ¬ϕ , ¬ψ.<br />
rule ¬→ rule ¬↔<br />
if ¬(ϕ → ψ) if ¬(ϕ ↔ ψ)<br />
then ϕ , ¬ψ. then ϕ , ¬ψ | ¬ϕ , ψ.<br />
A queste va aggiunta la regola per l’introduzione del falsum:<br />
rule ⊥<br />
if ϕ , ¬ϕ<br />
then ⊥.<br />
Se ci si limita a considerare insiemi finiti di enunciati proposizionali, è facile mostrare che il calcolo<br />
termina sempre. Anzi, adattando una dimostrazione di Beth (1955) si può mostrare che la terminazione è<br />
assicurata anche nel caso di insiemi numerabili di enunciati proposizionali. Ciò non è più vero se<br />
utilizziamo i quantificatori.<br />
3.3.3 Il calcolo degli alberi semantici: regole per i quantificatori<br />
Il calcolo prevede quatto regole per la manipolazione dei quantificatori, di cui due relative alla<br />
negazione. Cominceremo con alcuni esempi. Nel seguito si fa l’ipotesi che il linguaggio offra un’infinità<br />
numerabile di costanti individuali, che chiameremo a 0 , a 1 , ..., a n , ...<br />
Come primo esempio ci chiediamo se:<br />
∀xP(x) |= P(a 0 ).<br />
Primi due nodi dell’albero:<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 29<br />
1. ∀xP(x) premessa<br />
2. ¬P(a 0) ¬conclusione a 0<br />
Qui abbiamo messo in evidenza, nell’ultimo campo del nodo, il fatto che l’enunciato introduce una<br />
costante (a 0 ). Ora, il fatto che ∀xP(x) sia vero in M ci autorizza ad aggiungere un enunciato atomica<br />
P(c), dove c è una costante qualsiasi. D’altra parte, non dobbiamo dimenticarci che il nostro obiettivo è<br />
generare una contraddizione. Sarebbe inutile, quindi, aggiungere a un ramo dell’albero un enunciato<br />
della forma P(c) se la costante c non compare altrove nel ramo: un enunciato del genere non potrebbe<br />
comunque dar luogo a una contraddizione. Possiamo quindi formulare la seguente regola per il<br />
quantificatore universale:<br />
rule ∀<br />
if ∀xϕ<br />
then ϕ(c/x),<br />
Eseguiamo l’azione con c = a 0:<br />
Ma ora possiamo introdurre il falsum:<br />
Pertanto:<br />
∀xP(x) |− P(a 0 ).<br />
per ogni costante c introdotta nel ramo dell’albero<br />
cui viene aggiunto il nodo.<br />
1. ∀xP(x) premessa<br />
2. ¬P(a 0 ) ¬conclusione a 0<br />
3. P(a 0) ∀(1/a 0 )<br />
1. ∀xP(x) premessa<br />
2. ¬P(a 0 ) ¬conclusione a 0<br />
3. P(a 0 ) ∀(1/a 0 )<br />
4. ⊥ ⊥(3,2)<br />
Come si vede, un enunciato del tipo ∀xϕ si comporta come un generatore di enunciati della forma<br />
ϕ(a n /x), per ogni costante a n introdotta. Va precisato subito che la lista delle costanti introdotte non è<br />
fisso: oltre alle costanti presenti inizialmente, altre costanti possono essere aggiunte dalla regola per il<br />
quantificatore esistenziale (vedi oltre). Il generatore ∀xϕ si deve quindi “risvegliare” ogni volta che<br />
viene introdotta una nuova costante, per poter generare nuovi enunciati della forma ϕ(a n /x).<br />
Proviamo ora a verificare se<br />
P(a 0 ) |= ∀xP(x).<br />
Primi due nodi dell’albero:<br />
1. P(a 0 ) premessa a 0<br />
2. ¬∀xP(x) ¬conclusione<br />
La regola per la negazione del quantificatore universale si limita a riflettere la dualità fra i due<br />
quantificatori:<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 30<br />
rule ¬∀<br />
if ¬∀xϕ<br />
then ∃x¬ϕ.<br />
Eseguiamo l’azione:<br />
1. P(a 0 ) premessa a 0<br />
2. ¬∀xP(x) ¬conclusione<br />
3. ∃x¬P(x) ¬∀(2)<br />
A questo punto ragioniamo nel modo seguente. Se ∃xP(x) è vero in M, esisterà un individuo nel<br />
dominio, chiamiamolo genericamente c, per cui si ha P(c). Nulla ci consente di assumere che tale<br />
individuo sia uno di quelli cui fanno riferimento le costanti già introdotte; quindi dobbiamo introdurre<br />
una nuova costante. Ecco quindi la regola per il quantificatore esistenziale:<br />
rule ∃<br />
if ∃xϕ<br />
then ϕ(c/x), dove c è una costante nuova per il ramo cui viene aggiunto il nodo.<br />
Come si vede, un enunciato del tipo ∃xϕ si comporta come generatore di una nuova costante. Al<br />
contrario della regola per il quantificatore universale, però, la regola una volta applicata non ha più<br />
bisogno di essere “risvegliata”.<br />
Applichiamo la regola:<br />
1. P(a 0) premessa a 0<br />
2. ¬∀xP(x) ¬conclusione<br />
3. ∃x¬P(x) ¬∀(2)<br />
4. ¬P(a 1 ) ∃(3) a 1<br />
Non ci sono altre regole applicabili, e la procedura termina senza generare il falsum. Abbiamo quindi:<br />
P(a 0 ) |-/- ∀xP(x).<br />
Anche qui l’albero ci mostra un controesempio: è sufficiente introdurre un modello con due individui,<br />
da utilizzare come le denotazioni di a 0 e a 1 . Poi fissiamo l’estensione di P in modo tale che P sia vero di<br />
a 0 (il che verifica P(a 0 )) e falso di a 1 (il che verifica ¬P(a 1 )).<br />
Proviamo ora con<br />
∀xP(x) |= ∃xP(x).<br />
Ecco la dimostrazione completa:<br />
1. ∀xP(x) premessa<br />
2. ¬∃xP(x) ¬conclusione<br />
3. ∀x¬P(x) ¬∃(2)<br />
4. P(a 0 ) ∀(1/a 0 ) a 0<br />
5. ¬P(a 0) ∀(3/a 0)<br />
4. ⊥ ⊥(4,5)<br />
Qui abbiamo dovuto introdurre una costante in occasione della prima applicazione della regola ∀, perché<br />
non esistevano nel ramo costanti già introdotte. Ciò è consentito in quanto sappiamo che il dominio del<br />
modello deve contenere almeno un individuo. In conclusione:<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 31<br />
∀xP(x) |− ∃xP(x).<br />
Per completare il quadro manca solo l’ultima regola:<br />
rule ¬∃<br />
if ¬∃xϕ<br />
then ∀x¬ϕ.<br />
Vediamo ancora due esempi. Verifichiamo se:<br />
∃x∀yP(x,y) |= ∀y∃xP(x,y).<br />
Ecco la dimostrazione completa:<br />
Quindi:<br />
∃x∀yP(x,y) |− ∀y∃xP(x,y).<br />
Veniamo ora all’ultimo esempio e verifichiamo se:<br />
∀y∃xP(x,y) |= ∃x∀yP(x,y).<br />
1. ∃x∀yP(x,y) premessa<br />
2. ¬∀y∃xP(x,y) ¬conclusione<br />
3. ∃y¬∃xP(x,y) ¬∀(2)<br />
4. ∀yP(a 0 ,y) ∃(1) a 0<br />
5. ¬∃xP(x,a 1) ∃(3) a 1<br />
6. ∀x¬P(x,a 1 ) ¬∃(5)<br />
7. P(a 0 ,a 0 ) ∀(4/a 0 )<br />
8. P(a 0,a 1) ∀(4/a 1)<br />
9. ¬P(a 0 ,a 1 ) ∀(6/a 0 )<br />
10. ¬P(a 1 ,a 1 ) ∀(6/a 1 )<br />
11. ⊥ ⊥(8,9)<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 32<br />
Ecco i primi passi della dimostrazione:<br />
1. ∀y∃xP(x,y) premessa<br />
2. ¬∃x∀yP(x,y) ¬conclusione<br />
3. ∀x¬∀yP(x,y) ¬∃(2)<br />
4. ∃xP(x,a 0 ) ∀(1/a 0 ) a 0<br />
5. ¬∀yP(a 0 ,y) ∀(3/a 0 )<br />
6. ∃y¬P(a 0,y) ¬∀(5)<br />
7. P(a 1 ,a 0 ) ∃(4) a 1<br />
8. ¬P(a 0 ,a 2 ) ∃(6) a 2<br />
9. ∃xP(x,a 1 ) ∀(1/a 1 )<br />
10. ∃xP(x,a 2) ∀(1/a 2)<br />
11. ¬∀yP(a 1 ,y) ∀(3/a 1 )<br />
12. ¬∀yP(a 2 ,y) ∀(3/a 2 )<br />
13. ∃y¬P(a 1 ,y) ¬∀(11)<br />
14. ∃y¬P(a 2 ,y) ¬∀(12)<br />
15. P(a 3 ,a 1 ) ∃(9) a 3<br />
16. P(a 4 ,a 2 ) ∃(10) a 4<br />
17. ¬P(a 1,a 5) ∃(13) a 5<br />
18. ¬P(a 2 ,a 6 ) ∃(13) a 6<br />
... ... ...<br />
Dovrebbe essere facile convincersi che il procedimento è entrato in un ciclo senza fine. In effetti,<br />
quando il calcolo viene applicato ad argomentazioni o enunciati predicativi non validi è possibile che la<br />
procedura “vada in ciclo” e quindi non termini. Per evidenziare meglio la cosa, l’albero è stato diviso in<br />
blocchi. Come si può notare, dopo l’introduzione della prima costante (a 0 ), 2 n nuove costanti sono<br />
introdotte all’n-esimo blocco, e la successione di nuovi blocchi non ha termine. Ciò non è strano, dato<br />
che il calcolo non è un algoritmo di decisione. D’altra parte, è interessante vedere perché la procedura va<br />
in ciclo: ciò è dovuto a un circolo vizioso che si crea fra la regola ∃, che introduce una nuova costante, e<br />
la regola ∀, che si risveglia ogni volta che viene introdotta una nuova costante.<br />
3.3.4 Il calcolo con l’uguaglianza<br />
Il calcolo degli alberi semantici può essere esteso al trattamento dell’uguaglianza. Per questo è<br />
sufficiente introdurre due nuove regole. La prima regola consente di introdurre il falsum quando<br />
compare nell’albero un enunciato del tipo c ≠ c (con c costante arbitraria):<br />
rule ≠<br />
if c ≠ c (dove c è una costante qualsiasi)<br />
then ⊥.<br />
La seconda regola, detta regola di sostituzione, consente di sostituire ovunque lo si desideri una costante<br />
c 1 a una costante c 2 quando c 1 = c 2 :<br />
rule Sost<br />
if ϕ , c 1 = c 2<br />
then ϕ(c 1 /c 2).<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 33<br />
Utilizziamo il calcolo così esteso per dimostrare un paio di proprietà molto semplici ma utili. La prima:<br />
P(a), a = b |= P(b),<br />
ovvero: se a ha una proprietà P e b è uguale ad a, allora anche b ha la proprietà P. Dimostrazione:<br />
La seconda:<br />
P(a), ¬P(b) |= a ≠ b,<br />
1. P(a) premessa<br />
2. a = b premessa<br />
3. ¬P(b) ¬conclusione<br />
4. ¬P(a) Sost(3,2)<br />
5. ⊥ ⊥(1,4)<br />
ovvero: se due individui differiscono per qualche proprietà, allora sono diversi. Dimostrazione:<br />
1. P(a) premessa<br />
2. ¬P(b) premessa<br />
3. a = b ¬conclusione<br />
4. ¬P(a) Sost(2,3)<br />
5. ⊥ ⊥(1,4)<br />
Dimostriamo ora le tre proprietà fondamentali dell’uguaglianza. Proprietà riflessiva:<br />
|= ∀x (x = x).<br />
Dimostrazione:<br />
Proprietà simmetrica:<br />
|= ∀x ∀y (x = y → y = x).<br />
Dimostrazione (abbreviata):<br />
Proprietà transitiva:<br />
1. ¬∀x (x = x) ¬conclusione<br />
2. ∃x (x ≠ x) ¬∀(1)<br />
3. a ≠ a ∃(2) a<br />
4. ⊥ ≠(3)<br />
1. ¬∀x ∀y (x = y → y = x) ¬conclusione<br />
2. ∃x ∃y ¬(x = y → y = x) ¬∀ ¬∀(1)<br />
3. ¬(a = b → b = a) ∃ ∃(2) a, b<br />
4. a = b ¬→(3)<br />
5. b ≠ a ¬→(3)<br />
6. a ≠ a Sost(5,4)<br />
7. ⊥ ≠(6)<br />
|= ∀x ∀y ∀z (x = y ∧ y = z → x = z).<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 34<br />
Dimostrazione (abbreviata):<br />
3.3.5 Criteri di gestione dell’agenda<br />
1. ¬∀x ∀y ∀z (x = y ∧ y = z → x = z) ¬conclusione<br />
2. ∃x ∃y ∃z ¬(x = y ∧ y = z → x = z) ¬∀ ¬∀ ¬∀(1)<br />
3. ¬(a = b ∧ b = c → a = c) ∃ ∃ ∃(2) a, b, c<br />
4. a = b ∧ ¬→(3)<br />
5. b = c ∧ ¬→(3)<br />
6. a ≠ c ¬→(3)<br />
7. a = c Sost(5,4)<br />
8. ⊥ ⊥(7,6)<br />
In un istante generico della costruzione di un albero semantico sono in genere presenti nell’agenda<br />
diverse attivazioni. Se la scelta della prossima attivazione da eseguire non è oculata, è possibile che<br />
l’albero costruito non sia ottimale (ovvero, che presenti più nodi e più biforcazioni del necessario).<br />
Non è possibile formulare un insieme di criteri che assicurino in ogni caso la costruzione di un albero<br />
ottimale. Tuttavia, è possibile formulare alcuni criteri euristici (ovvero, criteri che in genere portano a<br />
produrre un albero ottimale o quasi).<br />
I criteri più importanti sono:<br />
• dare la massima priorità alle attivazioni delle regole che introducono il falsum (perché permetteno<br />
di chiudere un ramo dell’albero);<br />
• in subordine, preferire le attivazioni di regole che non producono biforcazioni (così l’albero si<br />
mantiene più semplice);<br />
• preferire le attivazioni della regola ∃ alle attivazioni della regola ∀ (è meglio generare subito le<br />
costanti da utilizzare in seguito per altre inferenze);<br />
• preferire le attivazioni applicate a enunciati che hanno più predicati in comune con altri enunciati<br />
dell’albero (in questo modo si massimizzano le opportunità di creare contraddizioni e derivare il<br />
falsum).<br />
3.4 Teorema di deduzione e regole derivate<br />
Ci si può chiedere che differenza ci sia fra affermare che P(a 0 ) è conseguenza logica di ∀xP(x),<br />
∀xP(x) |= P(a 0 )<br />
e affermare che la formula ∀xP(x) → P(a 0 ) è valida,<br />
|= ∀xP(x) → P(a 0).<br />
È facile verificare che le due affermazioni sono equivalenti. Più in generale abbiamo che<br />
Γ |= ϕ → ψ se e solo se Γ, ϕ |= ψ.<br />
Questo è l’enunciato del teorema semantico di deduzione, che vale in particolare sotto l’ipotesi che gli<br />
elementi di Γ , ϕ e ψ siano formule chiuse 1 . Dato che il calcolo è corretto e completo, ricaviamo<br />
immediatamente il teorema (sintattico) di deduzione:<br />
Γ |− ϕ → ψ se e solo se Γ, ϕ |− ψ.<br />
1<br />
Per l’enunciato generale del teorema si veda qualunque testo introduttivo di logica.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 35<br />
Nel caso in cui Γ sia finito, è facile dimostrare il teorema di deduzione direttamente. Infatti, una<br />
dimostrazione di Γ, ϕ |− ψ con Γ = {γ 1 , ..., γ n } avrà la forma:<br />
1. γ 1 premessa<br />
... ... ...<br />
n. γ n premessa<br />
n+1. ϕ premessa<br />
n+2. ¬ψ ¬conclusione<br />
n+3. ... ...<br />
Da questa dimostrazione aggiungendo un nodo (n’) si può ricavare una dimostrazione di Γ |− ϕ → ψ:<br />
1. γ 1 premessa<br />
... ... ...<br />
n. γ n premessa<br />
n’. ¬(ϕ → ψ) ¬conclusione<br />
n+1. ϕ →(n’)<br />
n+2. ¬ψ →(n’)<br />
n+3. ... ...<br />
L’operazione inversa consente di passare da una prova di Γ |− ϕ → ψ a una prova di Γ, ϕ |− ψ.<br />
Notiamo infine che è possibile rendere le dimostrazioni più brevi introducendo ulteriori regole deduttive,<br />
dette regole derivate, che non aumentano la potenza del calcolo ma consentono di riutilizzare<br />
dimostrazioni già eseguite. Consideriamo ad esempio la derivazione<br />
∃x∀yP(x,y) |− ∀y∃xP(x,y),<br />
vista precedentemente. È facile rendersi conto che la derivazione può essere generalizzata come:<br />
∃x∀yϕ |− ∀y∃xψ.<br />
A questo punto, sappiamo che se l’enunciato ∃x∀yϕ compare in una dimostrazione, possiamo senz’altro<br />
aggiungere l’enunciato ∀y∃xψ. Possiamo quindi formulare la regola derivata<br />
rule ∃∀−∀∃<br />
if ∃x∀yϕ<br />
then ∀y∃xψ.<br />
Utilizzando questa regola possiamo rendere più concise molte dimostrazioni.<br />
Ogni teorema già dimostrato si può convertire in una regola derivata. Anche se l’uso di un numero<br />
eccessivo di regole derivate può avere effetti negativi sull’efficienza di un dimostratore automatico di<br />
teoremi, alcune regole derivate sono molto utili. Nel seguito ne introduciamo due; la dimostrazione per<br />
esteso della loro validità è lasciata al lettore.<br />
La due regole che consideriamo qui, dette rispettivamente modus pones e modus tollens, concernono il<br />
connettivo condizionale:<br />
rule MP<br />
if ϕ → ψ , ϕ<br />
then ψ.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 36<br />
rule MT<br />
if ϕ → ψ , ¬ψ<br />
then ¬ϕ.<br />
Un esempio di utilizzo di MP è dato nel prossimo sottoparagrafo.<br />
3.5 Calcolo della validità di un’argomentazione<br />
A questo punto possiamo ritornare all’idea iniziale di stabilire la validità di un’argomentazione.<br />
Consideriamo ad esempio l’argomentazione seguente:<br />
Chi non beve in compagnia, o è un ladro o è una spia.<br />
Filippo non beve in compagnia.<br />
Filippo non è una spia.<br />
Quindi Filippo è un ladro.<br />
Il primo passo consiste nel formalizzare l’argomentazione. Ogni enunciato italiano viene tradotto in un<br />
enunciato logico-predicativo cercando di rendere il significato dell’enunciato originario nel modo più<br />
fedele possibile. A questo scopo introduciamo tre predicati:<br />
B(x)<br />
L(x)<br />
S(x)<br />
e una costante individuale:<br />
a<br />
x beve in compagnia,<br />
x è un ladro,<br />
x è una spia,<br />
Filippo.<br />
L’argomentazione si formalizza allora così:<br />
∀x (¬B(x) → L(x) ∨ S(x)),<br />
¬B(a),<br />
¬S(a),<br />
∴ L(a)<br />
dove il simbolo metalinguistico “∴” si legge “quindi” o “in conclusione”. L’argomentazione è valida se<br />
e solo se:<br />
∀x (¬B(x) → L(x) ∨ S(x)), ¬B(a), ¬S(a) |= L(a).<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 37<br />
Ecco una prova che sfrutta la regola derivata MP::<br />
1. ∀x (¬B(x) → L(x) ∨ S(x)) ipotesi<br />
2. ¬B(a) ipotesi a<br />
3. ¬S(a) ipotesi<br />
4. ¬L(a) ¬conclusione<br />
5. ¬B(a) → L(a) ∨ S(a) ∀(1/a)<br />
6. L(a) ∨ S(a) MP(5,2)<br />
Ovvero:<br />
7. L(a) ∨(6) 7’. S(a) ∨(6)<br />
8. ⊥ ⊥(7,4) 8’. ⊥ ⊥(7’,3)<br />
∀x (¬B(x) → L(x) ∨ S(x)), ¬B(a), ¬S(a) |− L(a),<br />
e quindi l’argomentazione è valida.<br />
3.6 Alcune equivalenze importanti<br />
Così come nell’algebra hanno un ruolo essenziale equazioni come a2 – b2 = (a + b)(a – b), nella logica<br />
esistono molte equivalenze importanti. Alcune di queste hanno corrispondenze ben note nell’algebra<br />
booleana. Ad esempio:<br />
|= ¬¬ϕ ↔ ϕ,<br />
|= ¬(ϕ ∧ ψ) ↔ (¬ϕ ∨ ¬ψ),<br />
|= ¬(ϕ ∨ ψ) ↔ (¬ϕ ∧ ¬ψ),<br />
|= (ϕ → ψ) ↔ (¬ϕ ∨ ψ).<br />
Altre equivalenze riguardano la dualità fra i due quantificatori:<br />
|= ∀xϕ ↔ ¬∃x¬ϕ,<br />
|= ∃xϕ ↔ ¬∀x¬ϕ.<br />
Alcune equivalenze sono poco intuitive, e vanno quindi esaminate con attenzione. Consideriamo un<br />
enunciato come “una rondine fa primavera” (più che per un eccesso di ottimismo, il noto proverbio è<br />
stato modificato per non confondere le idee con una negazione che non è del tutto banale rappresentare<br />
correttamente). La forma dell’enunciato è:<br />
∃xP(x) → Q,<br />
dove P sta per “è una rondine” e Q sta per “è primavera”. Valgono le seguenti equivalenze:<br />
∃xP(x) → Q<br />
↔ ¬∃xP(x) ∨ Q<br />
↔ ∀x¬P(x) ∨ Q<br />
↔ ∀x (¬P(x) ∨ Q) 2<br />
2<br />
Il passaggio da ∀x¬P(x)ϕ ∨ Q a ∀x (¬P(x)ϕ ∨ Q) può risultare poco intuitivo. Si consiglia il lettore<br />
sospettoso di verificare l’equivalenza utilizzando direttamente la semantica formale o applicando il calcolo.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
3 La logica del primo ordine 38<br />
↔ ∀x (P(x) → Q).<br />
Con le convenzioni introdotte, questo enunciato si può leggere come “per ogni cosa, se questa è una<br />
rondine allora è primavera”. In generale si ha:<br />
|= (∃xϕ → ψ) ↔ ∀x(ϕ → ψ)<br />
purché ψ non contenga occorrenze libere di x.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001
Riferimenti bibliografici (parte I) 39<br />
4 Riferimenti bibliografici (parte I)<br />
Beth, E.W. (1955). Semantic entailment and formal derivability. Mededelingen van de Koninklijke Nederlandse<br />
Akademie van Wetenschappen, Afdeling Letterkunde, 18 (13), 309–342. Ristampato in J. Hintikka, ed. (1969), The<br />
philosophy of mathematics, Oxford University Press, 9–41.<br />
Boole, G. (1854). An investigation of the laws of thought, on which are founded the mathematical theories of logic and<br />
probabilities.<br />
Church, A. (1936). A note on the Entscheidungsproblem, Journal of Symbolic Logic, 1, 40–41. Correction, ibidem,<br />
101–102.<br />
Frege, G. (1879). Begriffsschrift – Eine der arithmetischen nachgedildete Formelsprache des reinen Denkens.<br />
McCarthy, J., and P. Hayes (1969). Some philosophical problems from the standpoint of artificial intelligence. In B.<br />
Meltzer and D. Michie, eds., Machine Intelligence 4, Edinburgh University Press, Edinburgh, UK.<br />
Nilsson, N. J. (1998). Artificial intelligence: A new synthesis, Morgan Kaufmann, San Francisco, CA.<br />
Russell, S., and P. Norvig (1995). Artificial intelligence: A modern approach, Prentice Hall, Englewood Cliffs, NJ.<br />
Wooldridge, M. (2000). Reasoning about rational agents, MIT Press, Cambridge, MA.<br />
Marco Colombetti<br />
<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />
Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001