pag. 1/Inf Capitolo 2 CAPITOLO 2 IL CALCOLO DEI PREDICATI. 1. Linguaggi formali e grammatiche. E' possibile dare una definizione più precisa del linguaggio del calcolo proposizionale basata sulla nozione di "linguaggio formale" e di "grammatica". Tali nozioni generali permettono anche di definire i linguaggi di programmazione e sono alla base di moltissimi argomenti di logica e di informatica. Il problema da cui si parte è di dare una definizione rigorosa della nostra idea intuitiva di "frase scritta bene" in maniera che, ad esempio, un calcolatore sia capace di dire se una frase è scritta bene o meno oppure sia capace di costruire frasi in modo corretto. Ad esempio, tutti i linguaggi di programmazione hanno un insieme di regole che permettono di scrivere in modo corretto una istruzione. Quando un programma viene eseguito (o compilato) il sistema avvisa degli eventuali errori di scrittura. Cominciamo ad esaminare la nozione di "parola". E' chiaro che una parola come "neve" o come “cane” è costituita da lettere di un alfabeto A ma è anche chiaro che tali parole non sono un semplice insieme di lettere. In effetti la nozione di insieme non è adeguata in quanto non tiene conto dell'ordine in cui sono state scritte le lettere e non tiene conto delle eventuali ripetizioni. Se volessimo rappresentare la parola "cane" con {c,a,n,e}non sapremmo distinguerla dalla parola "cena" in quanto {c,a,n,e} e {c,e,n,a} sono due insiemi uguali. In definitiva si deve poter dire quale è la prima lettera della parola, quale la seconda e così via. La teoria degli insiemi fornisce la nozione di n-pla o di vettore che è sicuramente adeguata in quanto, appunto, in una n-pla è possibile distinguere il primo elemento, il secondo e così via. Si osservi che (n,e,v,e) è diverso da (v,e,n,e). In definitiva dovendo definire in maniera rigorosa la nozione di parola dovremmo chiamare parola di lunghezza n sull'alfabeto A un qualunque elemento di An, cioè una qualunque n-pla di elementi di A. Nel seguito indicheremo con A+ l'insieme delle parole sull'alfabeto A, pertanto risulterà A+=»n∈N An. Inoltre, invece di usare la notazione insiemistica (a1,...,an) per indicare una parola, scriveremo semplicemente a1...an. Ad esempio se A è l'alfabeto {a,c,d} allora scriveremo ad, aac, caa per denotare le parole (a,d), (a,a,c) e (c,a,a) rispettivamente. Nota. A volte l'insieme A+ viene visto come una struttura algebrica, infatti è possibile definire in A+ l'operazione che associa a due parole p e q la parola pq che si ottiene ponendo le parole p e q una di seguito all'altra. In termini di n-ple l'operazione è definita dalla equazione (x1,...,xn)(y1,....,yp) = (x1,...,xn, y1,...,yp). Il prodotto definito in questo modo è una operazione associativa; indicheremo con A* l'insieme che si ottiene aggiungendo ad A+ un nuovo simbolo φ che chiameremo parola vuota e che supporremo essere elemento neutro. Pertanto assumeremo che xφ = φx = x per ogni parola x in A*. A* costituisce una importante struttura algebrica chiamata monoide libero sull'alfabeto A. L'insieme A costituisce un sistema di generatori di tale struttura. E' immediato che A* non è commutativo e che non esiste il simmetrico di un elemento diverso da φ. Il termine "libero" in un certo senso significa che non è verificata nessuna altra proprietà oltre quella di essere monoide. In generale non tutte le parole sono accettate in un linguaggio. Ad esempio, con riferimento al linguaggio dei polinomi, se A ={x,y,+,⋅ ,(,)} allora sono parole su A le sequenze (i polinomi) x⋅x, x⋅y, (x+y)⋅x ma sono parole anche espressioni insensate come x(yy+ (((, e ()()(). Il concetto di "linguaggio" si ottiene appunto quando sia stato indicato qualche modo per distinguere le parole "sensate" da quelle "non sensate" (quelle scritte "secondo le regole" da quelle "scritte male") quindi, estensionalmente, quando si sia definito un sottoinsieme di A+. Definizione 1. Chiamiamo linguaggio formale sull'alfabeto A ogni sottoinsieme L di A+. pag. 2/Inf Capitolo 2 Un linguaggio L puo essere dato, nel caso sia finito, mediante un elenco delle parole che lo compongono, ma in genere un linguaggio L viene dato tramite un insieme di regole capaci di produrre i suoi elementi e pertanto puo essere anche infinito. Ad esempio, è possibile costruire gli elementi di un linguaggio "dal basso" indicando esplicitamente alcune parole-base di L ed alcuni procedimenti per costruire nuovi elementi di L a partire da dati elementi di L. Esempio. Con riferimento all'alfabeto A dato sopra, potremmo avere le seguenti regole che definiscono il linguaggio dei polinomi nelle variabili x ed y : i) x ed y sono elementi di L ii) se α e β sono elementi di L allora anche (α)(β), e (α)+(β) sono elementi di L. Il linguaggio dei polinomi viene definito come il più piccolo sottoinsieme di A* contenente x ed y e chiuso rispetto la regola ii). Uno dei modi principali per generare un linguaggio è tramite le grammatiche. Definizione 2. Una grammatica è una quadrupla G = (V,A,P,s) con: - V (insieme delle variabili ausiliari) ed A (insieme dei simboli terminali) insiemi finiti disgiunti; - s elemento prefissato di V detto start-simbolo; - P insieme finito di espressioni del tipo α→β (dette produzioni) con α e β parole nell'alfabeto C = V∪A. Ogni produzione α→β va intesa come possibilità di sostituire in una parola alcune occorrenze di α con β. Se la parola y si ottiene dalla parola x tramite una tale sostituzione allora si dice che y deriva direttamente da x. Più precisamente, se α→β è un elemento di P ed δ e γ sono elementi di C+ allora diremo che γβδ deriva direttamente da γαδ che βδ deriva direttamente da αδ e che γβ deriva direttamente da γα. Chiameremo derivazione una catena finita x1,...,xn di elementi di C+ tali che xi+1 deriva direttamente da xi per i =1,...,n-1 ; in tale caso, se α = x1 e β = x2, scriveremo α |→ β. In altri termini β deriva da α nella grammatica G se è possibile ottenere β da α mediante una ripetuta sostituzione di sottoparole in accordo con quanto consentito dalle regole di produzione elencate in P. Definizione 3. Diremo che un linguaggio L nell'alfabeto A è producibile dalla grammatica G se gli elementi di L si possono caratterizzare come le parole nell'alfabeto terminale A che si possono derivare dallo start simbolo s cioè se L = {x∈A+: s |→x}. Chiamiamo complessità di un elemento x di L la minima lunghezza delle derivazioni che consentono di ottenere x. Il concetto di complessità è fondamentale perchè, come vedremo, la maggior parte delle definizioni e delle dimostrazioni relative alle parole di un linguaggio avvengono per induzione sulla complessità. Nel seguente esempio gli alfabeti V ed A sono a loro volta insiemi di parole in un altro alfabeto. Esempio. Vediamo come sia possibile costruire, tramite una opportuna grammatica, una piccolissima fetta della lingua italiana. Poniamo: V = {asserzione, articolo, soggetto, predicato} pag. 3/Inf Capitolo 2 A={il, cane, gatto, abbaia, corre} e supponiamo che le produzioni siano: asserzione → articolo soggetto predicato; articolo → il ; articolo → un ; soggetto → cane ; soggetto → gatto ; predicato → corre ; predicato → abbaia . Assunto come start-simbolo la variabile "asserzione", il linguaggio della grammatica definita in questo modo consentira di produrre frasi del tipo "il cane abbaia", "il gatto abbaia", "il cane corre", "il gatto corre" . Ad esempio, abbiamo la derivazione asserzione, articolo cane predicato, il cane predicato, il cane abbaia che si ottiene utilizzando le produzioni asserzione → articolo soggetto predicato, soggetto → cane, articolo→ il, predicato → abbaia. Non deve stupire il fatto che sia producibile una frase del tipo "il gatto abbaia" in quanto una grammatica non garantisce che le frasi costruite siano vere ma solo che siano scritte correttamente. Aumentando il numero di possibili soggetti (compatibili con l'articolo "il") e predicati (in terza persona singolare) è possibile ottenere un maggior numero di frasi della lingua italiana scritte correttamente. La costruzione di una grammatica capace di produrre (e controllare) l'intera lingua italiana è ovviamente una cosa complicatissima e non ancora completamente realizzata. Una realizzazione di un metodo di controllo permetterebbe, ad esempio, di programmare un sistema di scrittura che corregga automaticamente gli errori di grammatica. Nota 1. L'esempio precedente fornisce un tipo di grammatica capace di produrre solo un numero finito di frasi. Ciò è dovuto al fatto che non ci sono "produzioni che chiamano se stesse". Possiamo modificare tale esempio aggiungendo una produzione del tipo discorso → asserzione e discorso ; discorso → asserzione dopo aver aggiunto "discorso" a V e la lettera "e" ad A. In tale caso si deve considerare come start-simbolo "discorso". E' evidente che, per la seconda di tali produzioni, sarà possibile produrre tutte le frasi della grammatica precedente ma che per la prima di tali produzioni sarà possibile scrivere frasi di lunghezza non determinata. Esempio. Sia G una grammatica in cui A = {a,b}, V = {v}, P = {v→ava, v→b} e v è lo startsimbol. Allora una derivazione è costituita dalla successione v, ava, aavaa, aabaa. Pertanto la parola aabaa appartiene al linguaggio generato da G. Esercizio. Dire quali delle parole abb, ava, aaabaaa, aba, appartiene al linguaggio generato dalla grammatica G ora definita e trovarne la relativa complessità. Scrivere una parola del relativo linguaggio di lunghezza maggiore di 5. Esercizio. Trovare una grammatica capace di generare l'insieme delle parole del tipo (ab)n. Nota. Il linguaggio del calcolo proposizionale è definito dalla grammatica i) prop → p1 ; prop → p2 ; . . . . ii) prop → (prop)∧(prop) ; iii) prop → (prop)∨(prop) ; iv) prop → ¬(prop). pag. 4/Inf Capitolo 2 Nota: Noam Chomsky. La nozione di grammatica non è nata nell'ambito informatico. Essa è stata proposta per la prima volta dal linguista americano Noam Chomsky nel 1957. La questione affrontata da Chomsky è quella di capire l'origine della straordinaria capacita dei bambini di scoprire le "regole" che stanno alla base del linguaggio. E questo a partire da un numero limitatissimo di emissioni verbali dei genitori e delle persone che li circondano. Questa capacità è tanto più sorprendente quanto si consideri che da un numero finito di casi i bambini apprendono il modo di produrre un numero potenzialmente infinito di frasi. La nozione di grammatica fornisce in un certo senso una risposta a questioni di tale tipo, essendo una grammatica un "oggetto finito" capace di produrre, a partire da un numero finito di oggetti (le parole apprese dall'ambiente) un numero potenzialmente infinito di frasi. Nota: Linguaggio e metalinguaggio. Quando parliamo di un linguaggio formale siamo costretti ad usare a nostra volta un linguaggio (ad esempio la lingua italiana utilizzata in questi appunti). Per evitare confusioni chiameremo linguaggio oggetto il linguaggio formale di cui vogliamo parlare e metalinguaggio il linguaggio utilizzato per parlarne. Un fenomeno simile avviene quando studiamo la lingua inglese (linguaggio oggetto) utilizzando la lingua italiana (metalinguaggio). Un insegnante di italiano usa un metalinguaggio (la lingua italiana) per studiare una lingua (ancora la lingua italiana). In questo caso linguaggio e metalinguaggio coincidono ed a volte si usano le virgolette per riferirsi al linguaggio oggetto. Ad esempio se scriviamo la parola "italiano" è scritta in italiano allora la stessa parola compare sia nel linguaggio oggetto che nel metalinguaggio. 2. Linguaggi del calcolo dei predicati: l’alfabeto Come abbiamo già osservato nel primo capitolo, nei linguaggi di programmazione vengono sempre utilizzate istruzioni “condizionate”, cioè istruzioni che vengono interpretate in un modo o in un altro a seconda del fatto se una certa condizione risulti vera oppure no. Un tipico esempio è una istruzione del tipo IF “Condizione” THEN A ELSE B il cui significato che se “Condizione” risulta essere vera allora viene eseguita la procedura A altrimenti viene eseguita la procedura B. L’espressione “Condizione” denota pertanto una asserzione che potrebbe essere del tipo “3x+1≥2 AND NOT y2 ≤5” dando luogo ad una istruzione come IF 3x+1≥2 AND NOT y2 ≤5 THEN A ELSE B Ora, quando si definisce un linguaggio di programmazione che utilizza istruzioni di tale tipo, devono essere precisate due cose: 1. come si scrive in modo corretto una condizione 2. come si deve procedere per calcolare il valore di verità della condizione. Il calcolo proposizionale ci aiuta solo parzialmente. Ad esempio ci consente di calcolare il valore di verità della condizione “3x+1≥2 AND NOT y2≤5” una volta che si sia definito il valore di verità delle formule atomiche 3x+1≥3 e y2≤5. Ma come calcolare i valori di verità di tali formule ? E’ necessario passare al calcolo dei predicati. Ora osserviamo che nella condizione che abbiamo scritto è coinvolto: - un simbolo + per denotare l’operazione di somma - i simboli 1, 2, 3, 5 per denotare particolari elementi - un simbolo y2 per indicare la funzione di elevazione al quadrato. Allora, prima di andare avanti ricordiamo brevemente due nozioni fondamentali della matematica e dell’informatica: la nozione di operazione e quella di relazione. Alcuni esempi di operazione già sono noti a tutti. pag. 5/Inf Capitolo 2 Esempio. Nell’insieme Z dei numeri relativi (cioè positivi e negativi) sono definite due operazioni binarie, l’addizione, la moltiplicazione ed una operazione unaria, l’opposto. Esempio. Nell'insieme P(S) delle parti di un dato insieme S sono definite le operazioni binarie di unione e di intersezione e l'operazione unaria di complemento. Esempio. Nell’insieme delle parole A+ su di un alfabeto A è definita l’operazione ⋅ di giustapposizione che consiste nel prendere due parole x ed y ed associare a tale coppia la parola xy. Possiamo anche considerare l’operazione unaria inv tale che inv(x) è la parola che si ottiene invertendo l’ordine delle lettere nella parola x. Definizione 1. Chiamiamo operazione n-aria in un insieme D ogni funzione h del prodotto cartesiano Dn in D (in breve scriveremo anche h : Dn → D). Di solito ci si limita alle operazioni binarie ed unarie. Passiamo ora alla nozione di relazione. Consideriamo ad esempio le frasi “il numero 4 è pari” e “il numero 4 è minore del numero 7”. Nel primo caso si afferma qualche cosa di un elemento (il numero 7), nel secondo caso si afferma qualche cosa della coppia ordinata (4,7). In generale si dice che nel primo caso il predicato “essere primo” è una proprietà che può essere verificata o meno da un elemento mentre nel secondo caso il predicato “essere minore di” è una relazione che può essere verificata o meno da una coppia. Sono esempi di relazione: “x è fratello di y”, “x è collegato con y”, “l’età di x è y” e così via. Esistono anche relazioni a tre o più posti. Ad esempio se dico "5 è la media dei valori 4 e 6", allora utilizzo una relazione a tre posti del tipo “x è la media di y è z”. Se dico "x possiede più soldi di y e z messi assieme" allora abbiamo un altro esempio di relazione a tre posti. Una relazione può essere rappresentata fornendo l’elenco delle coppie (o delle n-ple) che sono in relazione. Ad esempio se voglio esprimere la relazione “x è padre di y” potrei rappresentare un tale tipo di informazione con un elenco di coppie del tipo (Mario, Luigi), (Luigi,Carla), ... per esprimere il fatto che Mario è padre di Luigi, Luigi il padre di Carla e così via. In definitiva una relazione binaria è un insieme di coppie. Ricordando che il prodotto Cartesiano di due insiemi A e B è l’insieme di tutte le coppie (x,y) con x∈A ed y∈B, abbiamo la seguente definizione: Definizione 2. Siano D1,...,Dn insiemi, allora chiamiamo prodotto cartesiano D1×...×Dn l'insieme di tutte le possibili n-ple (d1,…,dn) che si possono ottenere prendendo d1 in D1, d2 in D2 e così via. Una relazione n-aria tra gli insiemi D1,...,Dn è un sottoinsieme R del prodotto cartesiano D1×...×Dn. Se D è un insieme, chiamiamo relazione n-aria su D un sottoinsieme del prodotto cartesiano Dn. In particolare una relazione binaria tra due insiemi A e B è un qualunque sottoinsieme del prodotto Cartesiano A×B cioè un qualunque insieme di coppie (a,b) con a∈A e b∈B. Una relazione binaria su un insieme S è un sottoinsieme di S×S. Un linguaggio adeguato al calcolo dei predicati dovrà contenere: 1. dei nomi propri per denotare oggetti, persone, numeri particolari come p, Carlo, 0, 1, pag. 6/Inf Capitolo 2 2. dei nomi per le relazioni ed i predicati come "essere pari", "essere maggiore di zero", "essere laureato". Nell'ambito matematico è inoltre naturale introdurre 3. nomi per funzioni ed operazioni come sin, log, ⋅, +. Sembra ad esempio ragionevole avere un linguaggio in cui poter scrivere una frase come "2 è pari" che si avvale del "nome proprio" 2 e del predicato "pari". Oppure deve essere possibile dire cose come "log(2+3) è positivo" che si avvale del nome di funzione log, dei nomi 2 e 3, del nome di operazione +, e del predicato "positivo". Ancora, in matematica sono di uso frequente le variabili ed i quantificatori (esiste, per ogni) che permettono ad esempio di scrivere proposizioni del tipo "esiste un numero il cui quadrato è 9", in breve "∃x(x2 = 9)" oppure del tipo "addizionando x ad y si ottiene lo stesso risultato che addizionando y ad x", in breve ∀x∀y(x+y = y+x). Ciò suggerisce le seguenti definizioni. Definizione 1. Chiamiamo alfabeto di un linguaggio del primo ordine un alfabeto A costituito da: - una serie infinita di variabili, x1, x2, x3,. . . ; - i connettivi proposizionali {∧,∨,¬} ; - i quantificatori esistenziale ∃ ed universale ∀; - le parentesi "(" e ")" e la virgola "," ; - un insieme finito o numerabile C di elementi detti costanti ; - un insieme O (nomi di operazioni) ; - un insieme R (nomi di relazioni). - una particolare relazione binaria "=" detta uguaglianza - una funzione n : O∪R → N. Dato un nome di relazione r, n(r) viene detta arità di r, se n(r) = 1 allora la relazione viene detta unaria se n(r) = 2, r viene detta binaria. Da notare che nel linguaggio comune si parla di predicati per indicare le relazioni 1-arie mentre si preferisce parlare di relazioni nel caso n ≥ 2. In generale si considerano solo operazioni e relazioni unarie o binarie. Il ruolo delle costanti è di dare nomi a particolari cose, persone, numeri delle strutture o situazioni che si vogliono descrivere. 3. Il linguaggio del calcolo dei predicati: le formule. Per poter definire il linguaggio del primo ordine corrispondente ad un dato alfabeto dobbiamo prima definire il linguaggio dei termini. Intuitivamente i termini sono le "descrizioni di funzioni" (se si è utilizzata qualche variabile) o "descrizioni di elementi" (se nel termine non compare nessuna variabile) che si possono costruire a partire dalle variabili, dalle costanti e dai nomi di funzioni di un dato linguaggio. Esempi di termine sono le parole log(sen(x)+y), (3+4)⋅5, . I termini possono essere visti come descrizione di algoritmi per i calcolo di una funzione (se il termine contiene variabili) o di un elemento (se il termine non contiene variabili). Ad esempio al termine 3⋅(5+7)+1 corrisponde l'algoritmo 5 ⋅ + × 7 3 +1 pag. 7/Inf Capitolo 2 Al termine (3⋅5+3⋅7)+1 corrisponde l’algoritmo 3 ⋅ × 5 + 3 +1 ⋅ × 7 Naturalmente questi due algoritmi, determinano lo stesso numero reale. Al termine 3⋅(sen(x)+y) corrisponde l'algoritmo x sen y + 3× Tale termine è diverso dal termine 3⋅sen(x)+3⋅y che corrisponde all'algoritmo x sen 3× + y 3× Naturalmente questi due algoritmi, se si interpretano al modo usuale sull'insieme dei numeri reali, determinano la stessa funzione. La seguente è una definizione rigorosa di termine. Definizione 1. I termini sono tutte e sole le parole che si possono ottenere tramite le seguenti regole - ogni costante è un termine - ogni variabile è un termine - se f è il nome di una funzione n-aria e t1,…,tn sono termini allora f(t1,…,tn) è un termine (notazione prefissa). - se ≈ è il nome di una funzione binaria e t1 e t2 sono termini allora t1≈t2 è un termine (notazione infissa) Nella pratica matematica quasi sempre si utilizzano operazioni binarie e si usa la notazione infissa. Così scriveremo x1+x2 e non +(x1,x2) e (x1+x2)+x3 al posto di +(+(x1,x2),x3). In termini di “grammatiche” la grammatica capace di generare i termini è la grammatica avente come start-symbol il simbolo ter e con le seguenti produzioni: ter → c per ogni c∈C ter → xi per ogni indice i ter → f(ter,...,ter) per ogni f∈O tale che n(f) = n ter → (ter)≈(ter) per ogni ≈∈O tale che n(≈) = 2 pag. 8/Inf Capitolo 2 Esempio. Supponiamo che tra i nomi di funzioni vi siano log, sen, +, e la costante 1, allora le produzioni sono ter → 1 ter → xi ter → log(ter) ter → sen(ter) ter → (ter) + (ter). In tale caso è facile vedere che sono esempi di termini le formule (sen(x2)+1)+log(sen(x1)), sen(log(x2+1)), log(log(x4)), .... In termini di grammatiche, una derivazione di log(sen(x2+1)) è data dalla sequenza ter, log(ter), log(sen(ter)), log(sen(ter+ter), log(sen(ter+1)), log(sen(x2+1)) Esistono anche notazioni "post-fisse" per le operazioni unarie, ad esempio la funzione fattoriale si indica con x! Esistono inoltre notazioni "esponenziali" come la funzione potenza x2 e la funzione inverso x-1. Nel seguito ci atterremo all'uso comune ed utilizzeremo anche questi tipi di notazione. A volte utilizzeremo altri simboli per denotare le variabili x1, x2,... , ad esempio i simboli x, y, z. Infine, dato un termine t, scriveremo t(x1,...,xn) per indicare che le sue variabili sono tra x1,...,xn. Problema. Scrivere cinque termini nel linguaggio il cui alfabeto contiene {log, x, y, sen, +, 1}. Passiamo ora a definire l'insieme F delle formule di un linguaggio del primo ordine. Definizione 2. Una formula atomica è una espressione del tipo r(t1,...,tn) con r nome di relazione n-aria e t1,...,tn termini (notazione prefissa). Se r è binaria allora è una forma atomica anche una espressione del tipo t1rt2 (notazione infissa) In generale si considerano solo relazioni unarie o binarie. Per quelle unarie si usa la notazione prefissa, per quelle binarie si utilizza la notazione infissa. Ad esempio, se si considerano le relazioni binarie = e ≤, si preferisce scrivere t1 = t2, t1≤t2 al posto di =(t1,t2) e ≤(t1,t2). Definizione 3. Sono chiamate formule ben formate le parole che si possono ottenere al modo seguente: a) sono formule ben formate tutte le formule atomiche b) se t1 e t2 sono termini allora t1=t2 è una formula atomica c) se α e β ∈ F allora (α)∧(β), (α)∨(β) e ¬(α) sono formule; d) se xi è una variabile ed α una formula allora ∃xi(α) e ∀(α) sono formule. Indichiamo con F l’insieme delle formule ben formate. In termini di grammatiche, possiamo dire che F è il linguaggio generato dalla grammatica il cui start-symbol è fbf e le cui regole di produzione sono le seguenti: ter → c per ogni c∈C ter → xi per ogni indice i ter → f(ter,...,ter) dove f∈O e se n(f) = n allora ter è ripetuto n volte at → r(ter,...,ter) dove r∈R e e se n(f) = n allora ter è ripetuto n volte at → ter = ter fbf → at fbf → (fbf)∧(fbf) ; fbf → (fbf)∨(fbf) ; fbf → ¬(fbf) ; fbf → ∃xi(fbf) ; fbf → ∀xi(fbf). pag. 9/Inf Capitolo 2 Abbreviazioni. Nel seguito utilizzeremo t1≠t2 al posto della formula ¬(t1 = t2). Inoltre, come viene fatto nel caso del calcolo proposizionale, considereremo α →β una abbreviazione di ¬α∨β e α ↔ β una abbreviazione di (α→β)∧(α→β). Pertanto → e ↔ appartengono al metalinguaggio e non al linguaggio oggetto. La nozione di sottoformula di una data formula è evidente. Si chiama occorrenza di un simbolo in una formula la sua presenza in un posto od in un altro della formula. Ad esempio il simbolo → occorre in due posti nella formula (α→β)∧(α→β). Definizione 4. La sottoformula α di ∃xi(α) viene detta campo di azione del quantificatore ∃. La sottoformula α di ∀xi(α) viene detta campo di azione del quantificatore ∀. Una occorrenza di xi in una formula viene detta vincolata se entra nel campo di azione di un quantificatore, altrimenti viene detta libera. Esempi: In x2+3x1≥x2 sia l'occorrenza di x1 che l'occorrenza di x2 sono libere. In ∃x2(x2+3x1≥x2) l'occorrenza di x1 è libera, quella di x2 è vincolata. In ∀x1(∃x2(x2+3x1≥x2)) entrambe le occorrenze sono vincolate. Una stessa variabile può avere una occorrenza libera ed una occorrenza vincolata nella stessa formula. In tale caso si dice ancora che occorre libera. Ad esempio, nella formula (∃x2(x2+3x1≥x2))∧(x2+3x1≥x2) la variabile x2 ha una occorrenza libera ed una vincolata. Il fatto che una variabile x occorre libera in una formula α determina il fatto che: non è possibile stabilire se α sia vera o falsa se non dopo avere assegnato un valore alla x. Ad esempio nella formula ∀x(x+y = x) l'occorrenza di y è libera. Tale formula sarà vera se ad y si assegna il valore 0 mentre sarà falsa altrimenti. Introduciamo ora un po' di nomenclatura: - una formula senza variabili libere viene detta chiusa - se α è una formula le cui variabili libere sono x1,...,xn allora ∀x1...∀xn(α) viene chiamata chiusura universale di α. Ad esempio la formula ∃x1(∃x2(x2+3x1≥x2)) è chiusa. La formula ∃x2(x2+3x1≥x2) non è chiusa in quanto x1 è libera. La chiusura universale di tale formula è la formula ∀x1(∃x2(x2+3x1≥x2)). Problema. Dire in quali formule la variabile x1 è libera ∃x2(x2+3x1≥x2)→∀x1(x1=x1), x2+3x1≥x2, ∀x1(∃x2(x2+3x1≥x2)), ∃x3(∃x2(x2+3x1≥x2)). I seguenti sono alcuni esempi di linguaggi del primo ordine utilizzati in matematica. Linguaggio usato per le strutture ordinate. E' un linguaggio che contiene il simbolo ≤ di relazione binaria. A volte si aggiunge anche una costante 0 (da interpretare come minimo elemento) e una costante 1 (da interpretare come massimo elemento) e pertanto C = {0, 1}. Poiché non ci sono nomi di operazioni, gli unici termini sono le variabili e le costanti. Sono esempi di formule ∀x(x≥0) ; ∀x∃y(x≥y); ∀x1(x1≤x1); ∀x1(∀x2((x1≤x2)∧(x2≤x3)∧(x1≤x3)). Esempio. Consideriamo un linguaggio individuato dalle costanti a, b, dalla relazione binaria r e dalla funzione unaria f, allora sono esempi di termini, a, b, x2, f(a), f(b), f(f(a)), f(x2), . . . sono esempi di formule: r(x3,x4) , r(a,f(x4)), ∃x3(r(a,b)) , ∀x1((r(f(a),x1))) , ∃x3((r(a,f(x1)))∧(r(a,b))). pag. 10/Inf Capitolo 2 Supponiamo che vi sia anche un nome di una operazione binaria +, allora sono esempi di termini (oltre e quelli scritti sopra) a+b, a+x1, x1+f(x2), x2+(f(x2+x3)+a), . . . Noi non ci atterremo sempre alla rigida definizione di formula sopra data e spesso ci avvicineremo all'uso corrente del linguaggio matematico. Scriveremo ad esempio x≤y al posto di ≤(x,y) ed x=y al posto di =(x,y). Ancora, potremo scrivere ∀x1(r(x,y)) per denotare la formula ¬∃x1(¬(r(x1,x3))). Concludiamo questo paragrafo mettendo in rilievo che: A differenza del calcolo proposizionale, il calcolo dei predicati scompone ulteriormente le asserzioni atomiche evidenziandone la struttura "soggetto-predicato". 4. Interpretazioni di un linguaggio. Come abbiamo già osservato nel primo capitolo, nei linguaggi di programmazione vengono sempre utilizzate istruzioni “condizionate”, cioè istruzioni che vengono interpretate in un modo o in un altro a seconda del fatto se una certa condizione risulti vera oppure no. Un tipico esempio è una istruzione del tipo IF 3x+1≥2 AND NOT y2≤5 THEN A ELSE B Ora, perché l’interprete possa calcolare il valore di verità della condizione deve calcolare prima il valore di verità delle formule atomiche 3x+1≥3 e y2≤5. Per potere fare questo deve sapere: 1. del tipo di oggetti di cui si sta parlando 2. quali oggetti in particolare denotano i simboli 3, 1, 2, 5 (simboli chiamati “costanti” perché il loro significato resta immutato durante tutto il calcolo). 3. quale operazione viene indicata con + 4. quale relazione viene indicata con ≤. 5. quali elementi sono denotati da x ed y (simboli chiamati “variabili” perché il loro significato può essere modificato durante il calcolo). In definitiva un interprete deve: - stabilire il tipo di oggetti di cui si parla fissando un insieme D inoltre deve associare - ad ogni nome di operazione una operazione in D, - ad ogni costante un elemento di D, - ad ogni nome di relazione una relazione in D. Definizione 1. Una interpretazione di un linguaggio del primo ordine F è costituita da un insieme D, detto dominio dell'interpretazione, e da una funzione I, che associa: a) ad ogni nome di operazione n-aria h una operazione n-aria I(h) : Dn→D b) ad ogni costante c un elemento I(c) di D c) ad ogni nome di relazione n-aria r una relazione n-aria I(r) ⊆ Dn. Le interpretazioni di un linguaggio che non abbia nomi di relazioni prendono il nome di strutture algebriche. Le interpretazioni di un linguaggio che non ha nomi di operazioni prendono il nome di con le strutture relazionali. Esempio. Consideriamo un linguaggio F in cui vi sia solo il nome di una relazione binaria "ama". Allora una interpretazione di tale linguaggio si ottiene fissando un insieme D di persone (ad esempio quelle presenti in una certa stanza) ed una relazione binaria I(ama), cioè un sottoinsieme I(ama) di D×D. Ad esempio potremmo supporre che D sia l' insieme di persone, {mario, maria, carlo, luigi} e che I(ama) = {(maria, mario), (mario, carlo), (maria, carlo), (carlo, luigi)}. pag. 11/Inf Capitolo 2 Naturalmente vi possono essere più interpretazioni dello stesso linguaggio, ad esempio se si cambia il gruppo di persone cui ci si riferisce. Possiamo considerare anche interpretazioni con due domini. Ad esempio, oltre a quello già fissato, possiamo considerare il dominio D’ = {gelato, vino, sfogliata}. Una interpretazione potrebbe allora essere I(ama)={(maria, gelato), (mario, gelato), (maria, vino), (carlo, sfogliata)}. Riferiamoci al linguaggio che si usa per le strutture ordinate. Poiché è costituito da un solo simbolo di relazione binaria, ≤, una interpretazione di tale linguaggio è costituita da un insieme D e da una relazione binaria I(≤). Ad esempio possiamo supporre che D sia l'insieme dei numeri interi e I(≤) l'usuale relazione di ordine tra interi, oppure che D sia l'insieme delle parti di un insieme S e I(≤) sia la relazione di inclusione. Si noti che con il termine interpretazione si intende che I(≤) sia una qualunque relazione binaria e non necessariamente una relazione d'ordine. Ad esempio otteniamo una interpretazione ponendo D uguale all'insieme dei numeri interi e I(≤) = {(n,m) | n = m+1}. Naturalmente una tale interpretazione non è un insieme ordinato. Di fatto, almeno che non si impongono degli opportuni assiomi (cosa che faremo nel seguito) le interpretazioni di questo linguaggio possono essere accettate anche come interpretazioni del linguaggio dell'esempio precedente, e viceversa. Esempio. Consideriamo un linguaggio F con un solo simbolo per una operazione binaria ≈. Allora una interpretazione di F è costituita da un insieme D e da una operazione binaria. Ad esempio si ottiene una interpretazione ponendo D ={1,2,3,4} e I(⊗) uguale al massimo, cioè I(⊗)(n,m) = max{n,m} per ogni (n,m)∈D2. Un'altra interpretazione si ottiene ponendo D = A+, cioè D uguale all'insieme delle parole su di un dato alfabeto A e interpretando ⊗ come la giustapposizione (mettere una parola dopo l'altra). Ad esempio, se A = {a,b} allora I(⊗)(babb,aab) = babbaab. L’interpretazione intuitiva di una asserzione del tipo A = ∀x∃y(y<x) è evidente. Tale asserzione significa che: “Per ogni elemento x esiste un elemento y tale che y è minore di x”. Sappiamo pertanto dire se A afferma una cosa vera oppure no. In realtà siamo costretti ad essere più precisi perché prima di pronunciarci dobbiamo specificare di quali oggetti stiamo parlando. Ad esempio se parliamo degli interi 0, 1, 2, 3, ... allora A risulta falsa perché non esiste nessun elemento y minore di 0. Se parliamo dei numeri razionali maggiori di zero allora A risulta vera perché comunque si fissi x ponendo y = x/2 si ottiene un numero minore di x. Nota. Negli usuali linguaggi di programmazione è possibile considerare solo una piccolissima parte della logica dei predicati. Ad esempio sono usualmente permesse istruzioni del tipo IF (x -1>0) AND (NOT(y = 3)) THEN .... ELSE ... dove però la presenza delle variabili x ed y nella condizione è solo apparente poiché in ogni istante dell'esecuzione del programma tali variabili denotano sempre un preciso numero. Naturalmente sarebbe interessante costruire un linguaggio che permetta istruzioni in cui la condizione dopo IF sia di tipo più complesso. Ad esempio un linguaggio che permetta istruzioni del tipo IF ∃x(x2=y) THEN .... ELSE ... in cui la condizione esprime il fatto che y è un quadrato perfetto, oppure un poco più complicate come IF ∀n∃x∃y(xn+yn=1) THEN .... ELSE ... Purtroppo un tale linguaggio di programmazione (che permetterebbe di risolvere ogni problema della matematica) non esiste. Riprenderemo questo problema nel terzo capitolo. pag. 12/Inf Capitolo 2 Sia I una interpretazione, allora ogni termine t le cui variabili sono comprese tra x1,...,xn rappresenta una funzione n-aria I(t) : Dn→D definita per ricorsione sulla complessità di t dalle seguenti condizioni: a) se t è la costante c allora I(t) è la funzione costantemente uguale a I(c) ; b) se t è la variabile xi allora I(t) è la proiezione i-esima cioè la funzione definita da I(t)(d1,...,dn) = di c) se t = f(t1,...,tn) allora I(t) è la funzione composta da I(f) e I(t1),...,I(tn). Consideriamo ora una formula α di un dato linguaggio e proponiamoci di definire in maniera rigorosa che cosa significa l'espressione "α è vera". Ora naturalmente la verità o falsità di una formula dipende dalla interpretazione del linguaggio. Ad esempio consideriamo la formula ∀x1(∀x2(x1⋅x2 = x2⋅x1)) che esprime la proprietà commutativa. Tale formula sarà vera se il dominio D dell'interpretazione è l'insieme Z degli interi relativi ed il simbolo "⋅" è interpretato con l'usuale moltiplicazione di numeri. Sia invece D l'insieme delle funzioni di Z in Z ed interpretiamo "⋅" come composizione di due funzioni. Questo significa che se f : Z→Z e g : Z→Z sono due funzioni allora indichiamo con f⋅g la funzione che si ottiene applicando prima g ad un dato input e dopo f. In altri termini, f⋅g è la funzione che associa ad ogni x ∈ Z il valore f(g(x)). Per tale struttura algebrica non vale la proprietà commutativa. Infatti, ad esempio, se consideriamo la funzione f(x) = x+1 e la funzione g(x) = x2 allora g(f(x)) ≠ f(g(x)), cioè (x+1)2 ≠ x2 +1, in generale. Allora è più corretto definire che cosa si debba intendere per "α è vera rispetto ad una interpretazione I". Anche ciò crea qualche difficoltà, infatti se in α vi è una variabile libera x1, allora α può essere vera o falsa a seconda dell'elemento rappresentato da x1. Ad esempio la formula ∀x2(x2⋅x1=x2) sarà vera negli interi relativi se x1 rappresenta l'unità, sarà falsa se x1 rappresenta il numero 2. Ciò significa che ha senso dire se α è vera o falsa non solo dopo aver fissato una interpretazione I del linguaggio ma anche dopo aver assegnato ad ogni variabile libera di α un particolare elemento nel relativo dominio. Per evitare complicazioni formali nel seguito supponiamo che anche le variabili vincolate siano interpretate da elementi del dominio. Pertanto se le variabili libere o vincolate di α sono tra x1,...,xt, dati d1,...,dt elementi di D vogliamo dare una definizione precisa del concetto: "α è vera rispetto alla interpretazione I quando le sue eventuali variabili libere sono interpretate con d1,...,dt ". Definizione 2. Sia I una interpretazione, sia α una formula le cui variabili libere o vincolate siano tra x1,...,xt e siano d1,...,dt elementi del dominio D. Allora la relazione I £ α [d1,...,dt] è definita per induzione sulla complessità di α tramite: a) I £ r(t1,...,tn) [d1,...,dt] se (I(t1)(d1,...,dt),...,I(tn)(d1,...,dt))∈I(r) b) I £ α∧β [d1,...,dt] se I £ α [d1,...,dt] e I £ β [d1,...,dt] c) I £ α∨β [d1, ... ,dt] se I £ α [d1,...,dt] oppure I £ β [d1,...,dt] d) I £ ¬α [d1,...,dt] se non è vero che I £ α [d1,...,dt] e) I £ ∃xi(α) [d1,...,dt] se esiste di∈D tale che I £ α [d1,...,di,...,dt]. e) I £ ∀xi(α) [d1,...,dt] se per ogni di∈D si ha che I £ α [d1,...,di,...,dt]. f) I £ t1 = t2 [d1,...,dt] se I(t1)(d1,...,dt) = I(t2)(d1,...,dt)) Se I £ α [d1,...,dt] diciamo che la formula α è vera rispetto ad I negli elementi d1,...,dt. Nota. Invece di interpretare tutte le variabili che appaiono libere o vincolate si potrebbero interpretare solo quelle che sono libere nella formula α. Infatti, se la variabile xi è vincolata, allora l'essere I £ α [d1,...,dt] non dipende dall'elemento di considerato. Ad esempio se risulta pag. 13/Inf Capitolo 2 che I £ ∀x1(x1⋅x2=x2⋅x1) [d1,d2] allora risulta anche I £ ∀x1(x1⋅x2=x2⋅x1) [d,d2] per un qualunque d≠d1. In particolare se una formula è chiusa allora si può omettere la stringa [d1,...,dn] che interpreta le variabili occorrenti in α. Ad esempio, invece di scrivere I £ ∀x1∀x2(x1⋅x2=x2⋅x1) [d1,d2] possiamo più semplicemente scrivere I £ ∀x1∀x2(x1⋅x2=x2⋅x1). Diciamo che α è vera in I o che I è un modello di α e scriviamo I £ α, se I £ α [d1,...,dt] per ogni d1,...,dt in D. In altre parole dire che una formula (con eventuali variabili libere) è vera in una interpretazione I equivale a dire che la sua chiusura universale è vera. Ad esempio diciamo che x1⋅x2 = x2⋅x1 è vera in una interpretazione I se I £ x1⋅x2=x2⋅x1 [d1,d2] comunque si scelgano d1 e d2 nel dominio di interpretazione, cioè se I £ ∀x1∀x2(x1⋅x2=x2⋅x1). Se una formula α è vera (falsa) rispetto a tutte le interpretazioni, allora viene detta logicamente vera (logicamente falsa). Esempio. Le formule α∨¬α, α→α, (∀x(α))→α(t), sono esempi di formule logicamente vere; le formule α∧¬α, (¬α(t))∧∀x(α), sono esempi di formule logicamente false. Nota. E' importante osservare che dire che una asserzione è logicamente vera significa dire che è vera qualunque sia l'interpretazione che si dà al linguaggio. Ad esempio la formula 3⋅5=5⋅3 pur essendo vera rispetto all' interpretazione usuale di 3,5, e ⋅, non è vera se si suppone che 3 e 5 rappresentino due matrici ed il simbolo ⋅ rappresenti il prodotto di matrici. Pertanto 3⋅5=5⋅3 non è logicamente vera. Proposizione 3. Sia α una tautologia (una contraddizione) del calcolo proposizionale e sia α* una formula della logica del primo ordine che si ottiene sostituendo ad ogni variabile proposizionale una formula del primo ordine. Allora α* è una formula logicamente vera (logicamente falsa). Dim. La dimostrazione è banale e ci limitiamo ad illustrarla in un caso particolare. Sia ad esempio α la tautologia p1∨¬p1 e sostituiamo p1 con la formula ∃x2(x2-1=0), allora otteniamo la formula (∃x2(x2-1=0))∨-(∃x2(x2-1=0)) che risulta vera comunque si consideri una interpretazione. Nota. Le variabili e le costanti sono interpretate con un solo tipo di oggetti, quelli che appartengono al dominio D. Da ciò segue che alcune importanti strutture matematiche non siano descrivibili in una logica dei predicati. Ad esempio nella teoria degli spazi vettoriali ci troviamo nella necessità di trattare due tipi diversi di oggetti, gli scalari ed i vettori. Esistono anche logiche che permettono di trattare tipi diversi di oggetti che prendono il nome di logiche a più tipi. Ad esempio la nozione di spazio vettoriale si riferisce a due tipi di oggetti, i vettori ed i scalari. Allora dobbiamo considerare strutture con due domini, l’insieme dei vettori e l’insieme degli scalari. Anche i data-base relazionali coinvolgono in generale più di un dominio. Comunque tutti i risultati che valgono per la logica ad un tipo che stiamo considerando valgono anche nelle logiche a più tipi. Per ragioni di semplicità nel seguito considereremo solo logiche con un unico dominio. Nota. Nelle logica che stiamo considerando (logiche del primo ordine) i quantificatori variano solo sugli elementi di D; non è possibile invece quantificare sui sottoinsiemi di D o sulle operazioni definite in D. Ad esempio una affermazione del tipo "ogni insieme di numeri naturali ammette minimo", essendo della forma ∀X (X⊆N→ . . .) non può essere descritta nella logica del primo ordine. Le logiche che permettono la quantificazione sui sottoinsiemi pag. 14/Inf Capitolo 2 del dominio prendono il nome di logiche del secondo ordine mentre la logica definita in questo capitolo viene chiamata logica del primo ordine ed il calcolo proposizionale del capitolo precedente logica di ordine zero. Mentre le logiche del primo ordine a più tipi non sono molto differenti da quella del primo ordine ad un solo tipo, le logiche del secondo ordine hanno una teoria completamente diversa che noi non esamineremo. 5. Conseguenze logiche ed equivalenze logiche. Prende il nome di sistema di assiomi o sistema di ipotesi ogni insieme A di formule. Le formule in A vengono anche chiamate assiomi. Definizione 1. Dato un sistema di ipotesi A, una interpretazione I è detta essere un modello di A se ogni formula in A è vera rispetto ad I. Chiameremo soddisfacibili i sistemi di ipotesi che ammettono un modello. Non tutti i sistemi di assiomi ammettono un modello, ad esempio se A contiene una formula α e la sua negata ¬α, allora è evidente che non può esistere un modello di A. Definizione 2. Diremo che una formula α è conseguenza logica di un insieme X di formule e scriveremo X £ α se ogni modello di X è un modello di α. A volte useremo anche l’espressione α dipende logicamente da X. Intuitivamente α dipende logicamente da un insieme X di formule quando non aggiunge nessuna informazione in più rispetto all’informazione data da X. Definizione 3. Due formule α e α' si dicono logicamente equivalenti se ammettono gli stessi modelli, cioè se I £ α se e solo se I £ α'. Se due formule α e α' sono logicamente equivalenti allora scriveremo α ≡ α'. In altre parole due formule α ed α' sono logicamente equivalenti se, qualunque sia l'interpretazione del linguaggio, tutte le volte che è vera α è vera anche α' e tutte le volte che è vera α' è vera anche α. Nota. E' importante sottolineare che l'equivalenza logica non deve essere confusa con l'equivalenza in una particolare interpretazione. Ad esempio l'asserzione a⋅b = c è equivalente a b⋅ a = c quando il linguaggio si interpreta al modo usuale nel campo dei numeri reali e ⋅ viene interpretato come prodotto. Tuttavia queste due formule non sono logicamente equivalenti perché se si interpreta l'operazione ⋅ come elevazione a potenza, a con il numero 2, b con il numero 3 e c con il numero 8, allora 23 = 8 è vera mentre 32 = 8 è falsa. Questo significa che esiste almeno una interpretazione del linguaggio in cui la prima asserzione è vera e la seconda è falsa. Proposizione 4. Abbiamo che: i) α ≡ α' se e solo se α ↔ α' è logicamente vera ii) tutte le formule logicamente vere sono equivalenti tra loro iii) tutte le formule logicamente false sono equivalenti tra loro. Proposizione 5 . La relazione ≡ verifica la proprietà riflessiva, transitiva e simmetrica, pertanto è una relazione di equivalenza. pag. 15/Inf Capitolo 2 E' ben noto ai matematici che il "nome" con cui viene indicata una variabile quantificata non ha importanza, ad esempio la formula ∀x1∀x2(x1+x2 = x2+x1) ha lo stesso significato della formula ∀x3∀x2(x3+x2 = x2+x3) ed entrambe esprimono la proprietà commutativa. E' possibile precisare questo fatto al modo seguente. Definizione 6. Sia α(xi) una formula in cui occorre la variabile xi, sia xj una variabile che non occorre in α e sia α(xj) la formula che si ottiene da α(xi) sostituendo tutte le occorrenze libere di xi con xj. Allora diciamo che le due formule sono simili. Ad esempio sono simili le formule α(x3)=∀x2(x3+x2=x2+x3) e α(x1)=∀x2(x1+x2=x2+x1) perché nella prima formula x3 compare in tutti e soli i posti in cui compare x1 nella seconda. Proposizione 7. Siano α(xi) e α(xj) formule simili, allora ∃xiα(xi) ≡ ∃xjα(xj) e ∀xiα(xi)≡∀xjα(xj). In definitiva tale proposizione esprime la seguente regola: se si cambia nome ad una variabile quantificata in una formula allora si ottiene una formula equivalente. Ad esempio sia la formula ∀x1∀x2(x1⋅x2 = x2⋅x1) che la formula ∀x3∀x4(x3⋅x4 = x4⋅x3) dicono la stessa cosa, cioè che vale la proprietà commutativa del prodotto. Proposizione 8. Per ogni formula α risulta a) ¬(∀x(α)) ≡ ∃x(¬α) ; b) ¬(∃x(α)) ≡∀x(¬α). Siano α e β due formule e supponiamo che x non sia libera in β, allora valgono le seguenti equivalenze: c) (∃x(α))∧β ≡ ∃x(α∧β) ; d) (∃x(α))∨β ≡ ∃x(α∨β) e) (∀x(α))∧β ≡∀ x(α∧β) f) (∀x(α))∨β ≡∀x(α∨β). Dim. Ad esempio proviamo c) e supponiamo, per semplicità, che x sia x1. Sia I una interpretazione e siano d1,...,dn elementi del relativo dominio D. Per prima cosa osserviamo che, poiché x1 non è libera in β, l'affermazione I £ β [d1,...,dn] non dipende in maniera effettiva dal particolare d1 scelto. Pertanto se vale I £ β [d1,...,dn] allora vale I £ β [d,d2,...,dn] qualunque sia d∈D. Allora I £ ∃x1(α)∧β [d1,...,dn] ⇔ I £ ∃x1(α) [d1,...,dn] e I £ β [d1,...,dn] ⇔ esiste d∈D tale che I £ α [d,d2,...,dn] e I £ β [d,d2,...,dn] ⇔ esiste d∈D tale che I £ α∧β [d,d2,...,dn] ⇔ I £ ∃x1(α∧β) [d1,...,dn]. Le rimanenti equivalenze si provano in modo simile. Si osservi che l'ipotesi che x non sia libera in β non può essere eliminata. Infatti ad esempio la formula (∀x(x≤0))∨(x≥0) che interpretiamo nel campo ordinato dei numeri reali. Tale formula, che ha la variabile x libera, è vera per x=3 ed è falsa per x = -3. Essa pertanto non è equivalente alla formula ∀x((x≤0)∨(x≥0)) che è chiusa e vera. Invece la formula pag. 16/Inf Capitolo 2 (∀x(x≤0))∨(1≥0) è equivalente alla formula ∀x((x≤0)∨(1≥0)) e la formula (∀x(x≤0))∨(z≥0) è equivalente a ∀x((x≤0)∨(z≥0)). 6. L'aritmetica è indecidibile: non esiste un interprete tale che … Come abbiamo già osservato, la logica matematica entra in gioco in ogni linguaggio di programmazione quando si devono definire istruzioni "condizionate", istruzioni cioè il cui effetto dipende dal fatto che una asserzione risulti vera oppure falsa. Esempio di istruzione di tale tipo è IF "condizione" THEN A ELSE B la cui interpretazione è: esegui A se "condizione" risulta vera, esegui B se "condizione" è falsa. Oppure WHILE “condizione” DO A la cui interpretazione è di ripetere A fino a quando “condizione” risulta vera e di uscire dal ciclo non appena “condizione” risulti falsa. Naturalmente perché l'interprete possa eseguire tale tipo di istruzioni deve avere un algoritmo per calcolare il valore di verità di "condizione". Riferiamoci per esempio a condizioni di tipo aritmetico che riguardano cioè i numeri interi, l'addizione, la moltiplicazione, la relazione d'ordine ≥, e l'uguaglianza =. In tale caso non esiste nessuna difficoltà per l'interprete a verificare condizioni atomiche del tipo 2x2-5y3 =3 oppure condizioni composte come (2x2-5y3 = 3)∧¬(2x2≥3+5y3) che in generale vengono scritte nella forma (2x2-5y3 = 3) AND (NOT(2x2≥3+5y3)) (per il fatto che sulla tastiera non sono presenti simboli per connettivi logici). Infatti quando l'interprete incontra queste asserzioni le variabili x ed y sono già state inizializzate a qualche valore numerico e la determinazione del loro valore di verità si riduce alla esecuzione di alcuni semplici calcolo aritmetici ed ad un confronto dei risultati. Questo fatto comporta che in ogni linguaggio di programmazione si accettano come condizioni tutte le asserzioni che si esprimono o come formule atomiche dell'aritmetica o da combinazioni di formule atomiche tramite i connettivi AND, OR, NOT. Si pone comunque il seguente problema sia possibile definire linguaggi di programmazione che accettino condizioni in cui siano utilizzati anche i quantificatori, ad esempio avere istruzioni del tipo IF ∀x((x+1)2 ≥ x2+x) THEN A ELSE B In tale caso la verifica della condizione appare molto più difficile. Infatti dovremmo verificare se (x+1)2 ≥ x2+2x è vera per x = 0, poi per x = 1, e così via per tutti gli infiniti possibili valori che x può assumere. In termini informatici si dovrebbe attivare un ciclo condizionato in cui la variabile x parte da x = 0 e viene incrementata di una unità ad ogni ciclo: x=0 WHILE (x+1)2 ≥ x2+2x DO x = x+1 PRINT(FALSO). Se viene trovato un intero x per cui (x+1)2 ≥ x2+2x risulta falsa allora si esce dal ciclo ed è possibile concludere che ∀x((x+1)2 ≥ x2+2x) è falsa. Purtroppo il ciclo non termina mai nel caso che ∀x((x+1)2 ≥ x2+2x) risulti vera. Pertanto se si segue questa via potrebbe accadere che non sia sia in grado di eseguire l'istruzione IF ∀x((x+1)2 ≥ x2+x) THEN A ELSE B. Naturalmente potrebbe accadere che esista qualche ragionamento "intelligente" che consenta di decidere se una asserzione con quantificatori sia vera o falsa. Nell'esempio fatto basta ricordare che in aritmetica vale la legge (a+b)2 = a2+b2+2ab, pertanto qualunque sia x si ha che (x+1)2 = x2+1+2x ≥ x2+2x. Quindi la condizione ∀x((x+1)2 ≥ x2+x) è vera e l'interprete deve eseguire A. Il problema è che questo tipo di comportamento presuppone intelligenza, capacità di trovare dimostrazioni e conoscenza delle leggi dell'aritmetica. Inoltre anche pag. 17/Inf Capitolo 2 facendo l'ipotesi che l'interprete sia dotato di intelligenza umana, potrebbero presentarsi asserzioni sulle quali anche un esperto matematico avrebbe serie difficoltà a decidere. Basti pensare alla seguente asserzione dell'aritmetica per ogni n ≥ 3, non esistono soluzioni dell'equazione xn + yn = zn , con x, y, z non nulli che è stata formulata dal matematico Fermat nel 1637. Per molti anni i più grandi matematici del mondo hanno impiegato le loro energie per cercare di dimostrare che tale asserzione è vera, oppure che è falsa. Solo recentemente si è avuta una risposta. Concludiamo questo capitolo enunciando il seguente teorema di notevole valore filosofico. Teorema di Goedel-Turing Non è decidibile se una asserzione dell'aritmetica (che coinvolga i quantificatori) sia vera oppure no, cioè non esiste un algoritmo generale capace di ricevere in input una qualunque asserzione dell'aritmetica e restituire in output VERO se l'asserzione è vera e FALSO se l'asserzione è falsa. Ne segue che non può esistere un linguaggio di programmazione che sia capace di accettare nelle istruzioni condizionate condizioni utilizzino i quantificatori. Da notare che non esiste in questo teorema non significa affatto che non esiste ancora (cosa peraltro ovvia) ma che è impossibile che esista. Quindi per quanti progressi possa fare la scienza dei calcolatori o la tecnologia questo tipo di difficoltà non potrà mai essere superata. Si noti che la situazione è totalmente diversa se si utilizzano quantificatori "limitati" cioè del tipo ∀n≤5, ∃m≤12 … Ad esempio consideriamo l'istruzione IF n è pari THEN A ELSE B il fatto che n sia pari può essere espresso dalla formula ∃m(2m=n) che darebbe luogo a cicli condizionati. Tuttavia essere pari può essere anche espresso dalla formula ∃m≤n(2m=n) che può essere verificata da ad un ciclo in cui si impone prima il numero n di giri e che quindi non può andare in loop. Ad esempio potrebbe essere m = 1 ; X = falso WHILE m<n DO x = x+1 ; IF 2m=n THEN X=VERO PRINT(X). 7. Strutture algebriche, reticoli, algebre di Boole. Quando si ha un insieme con delle operazioni allora si dice che si ha una struttura algebrica. In generale in una struttura algebrica si fissano anche alcuni elementi che per qualche motivo si considerano importanti. Definizione 1. Una struttura algebrica è definita da un insieme D, detto dominio, da alcune operazioni in questo insieme e da alcuni elementi che giocano un ruolo particolarmente importante. Un esempio di struttura algebrica è (Z, +, ⋅ , 0,1). Un altro esempio di struttura algebrica è (P(S), ∪, ∩, ∅, S). Nota (strutture algebriche e linguaggi di programmazione). Ogni linguaggio di programmazione è capace di operare su svariati tipi di dati, cioè di tipi di oggetti. Dato un tipo di dati (cioè un dominio), è possibile "lavorare" su tali dati tramite opportune operazioni (funzioni di libreria). Allora ogni tipo di dati definisce una struttura algebrica. Ad esempio abbiamo il tipo "numero intero" con le operazioni di somma +, di moltiplicazione ⋅, di sottrazione -. Oppure abbiamo il tipo "stringa" cioè parole scritte con l'alfabeto della tastiera con l' operazione binaria di concatenamento che consiste nel mettere una stringa dopo l'altra. pag. 18/Inf Capitolo 2 Spesso è importante mettere in rilievo alcune proprietà delle operazioni utilizzate, proprietà che consentono spesso di semplificare i calcoli. Ad esempio per gli interi relativi valgono le seguenti proprietà 1. (x+y)+z = x + (y+z) (proprietà associativa di +) 2. x+y = y+x (proprietà commutativa della somma) 3. x+0 = x (0 è elemento neutro rispetto alla addizione). 4. x+(-x) = 0 5. (x⋅y)⋅z = x⋅(y⋅z) (proprietà associativa di ⋅) 6. x⋅y = y⋅x (proprietà commutativa del prodotto) 7. x⋅1 = x per ogni x ≠ 0 (1 è elemento neutro rispetto alla moltiplicazione). 8. x⋅(y+z) = x⋅y+x⋅z (proprietà distributiva) Le strutture algebriche vengono classificate in base alla proprietà che hanno. Ad esempio: - Ogni struttura algebrica (D,+,-,0) che verifica le proprietà 1, 2, 3, 4 viene chiamata gruppo commutativo. Tali proprietà prendono il nome di sistema di assiomi per la teoria dei gruppi commutativi. - Ogni struttura (D, +, ⋅ , -, 0, 1) verificante tutte le proprietà 1, 2, 3, 4, 5, 6, 7, 8 (cioè tale sistema di assiomi) viene chiamata anello. Una classe importante di strutture algebriche è costituita dai reticoli. Definizione 2. Chiamiamo reticolo limitato, o semplicemente, reticolo, una struttura algebrica costituita da un insieme L con due elementi particolari, che denotiamo ad esempio con z ed u, e con due operazioni binarie ∨, ∧ tale che, per ogni x,y,z∈L (i) x∨y = y∨x ; x∧y = y∧x (proprietà commutativa) (ii) x∨(y∨z) = (x∨y)∨z ; x∧(y∧z)=(x∧y)∧z (proprietà associativa) (iii) x∨x = x ; x∧x = x (idempotenza). Il reticolo è detto distributivo se (iii) x∧(y∨z) = (x∧y)∨(x∧z) ; x∨(y∧z) = (x∨y)∧(x∨z) (proprietà distributiva). (iv) z∨x = x ; u∧x = x (z è elemento neutro rispetto ∨, u rispetto ∧) Definizione 3. Chiamiamo algebra di Boole un reticolo distributivo L con una ulteriore operazione unaria - : L → L tale che (v) x∨-x = u (principio del terzo escluso) (vi) x∧-x = z (principio di non contraddizione). Gli assiomi ora elencati possono essere visti come regole per semplificare i calcoli così come avviene nell’aritmetica. Esempio. L'esempio-base di algebra di Boole è la struttura algebrica B = ({0,1},∨, ∧,¬, 0, 1) in cui ∧ è l'operazione che associa ad ogni coppia x, y il numero min{x,y} ∨ è l'operazione che associa ad ogni coppia x, y il numero max{x,y} ¬ è l'operazione che associa ad x il numero 1-x. Esempio. Consideriamo l'insieme {0,0.5, 1} e poniamo x∨y = max{x,y}, x∧y = min{x,y} , ∼x = 1-x. Allora ({0,0.5, 1},∧ ,∨ ,0 ,1) è un reticolo distributivo ma la struttura ({0,0.5, 1},∧,∨,∼ , 0, 1) non è un'algebra di Boole. Infatti 0.5∧∼(0.5) = 0.5∧(1-0.5) = 0.5∧0.5 = 0.5 ≠ 0 e quindi non pag. 19/Inf Capitolo 2 vale il principio di non contraddizione, inoltre 0.5∨∼(0.5) = 0.5∨(1-0.5) = 0.5∨0.5 = 0.5 ≠ 1 e quindi non vale neanche il principio del terzo escluso. Proposizione 4. Sia S un insieme e P(S) l'insieme delle parti di S. Allora la struttura (P(S), ∪, ∩, - ,∅ , S) è un algebra di Boole. Dim. Dimostriamo ad esempio la proprietà distributiva, cioè che, comunque si prendono tre sottoinsiemi X,Y,Z di S risulta X∩(Y∪Z) = (X∩Y)∪(X∩Z). Per dimostrare tale uguaglianza proviamo prima che X∩(Y∪Z) ⊆ (X∩Y)∪(X∩Z) cioè che ogni elemento del primo insieme appartiene anche al secondo insieme. Infatti se x ∈ X∩(Y∪Z) allora, per definizione di intersezione, x∈X ed x∈Y∪Z. D'altra parte il fatto che x∈Y∪Z comporta, per definizione di unione, che o x∈Y oppure x∈Z. Nel primo caso possiamo concludere che x∈X∩Y nel secondo caso che x ∈ X∩Z. Pertanto x∈ (X∩Y)∪(X∩Z). Per provare l'inclusione (X∩Y)∪(X∩Z) ⊆ X∩(Y∪Z) basta osservare che essendo Y ⊆ Y∪Z risulta anche che X∩Y ⊆ X∩(Y∪Z) ed essendo Z ⊆ Y∪Z risulta che X∩Z ⊆ X∩(Y∪Z). Questo prova che (X∩Y)∪(X∩Z) ⊆ X∩(Y∪Z). 8. Data-base e grafi Data-base relazionali. La nozione di relazione n-aria è alla base dei linguaggi che trattano i data-base relazionali (come Access). Ad esempio la seguente tabella Nome Luigi Carlo Maria Cognome Esposito Rossi Rossi Età 30 25 33 Sesso M M F Telefono 33456 22234 22245 Stipendio 2000000 3000000 3000000 che è tipica dei linguaggi relazionali, è una relazione costituita da tre 6-ple, cioè è un sottoinsieme del prodotto cartesiano Nome×Cognome×Età×Sesso×Telefono×Stipendio. In questo caso Nome è l’insieme dei possibili nomi, Cognome l’insieme dei possibili cognomi e cosi via. I linguaggi relazionali invece di fare calcoli con numeri fanno calcoli con tabelle di questo tipo, cioè sono un calcolo delle relazioni. I grafi. Quando D è un insieme finito una relazione binaria in D viene a volte chiamata grafo orientato o, semplicemente grafo. Gli elementi di D sono detti nodi. Un grafo si rappresenta nel piano tracciando un punto per ogni elemento di D e collegando con una freccia due punti che sono in relazione. Ad esempio sia D ={a,b,c,d,f} e sia R = {(a,b), (b,e), (b,d), (a,c), (c,f)}. Allora otteniamo un grafo che può essere rappresentato al modo seguente: a b e c d Altri due esempi di grafo si ottengono ponendo f pag. 20/Inf Capitolo 2 D1 = {a,b,c,d,e} e R1 = {(a,b), (a,d'), (a,d), (d',d), (c,d)} D2 = {1,2,3,4} e R2 = {(1,2),(1,4),(3,4),(4,4)} La rappresentazione grafica di questi due grafi sarà: a b 1 2 e d c 4 3 Volendo, si possono interpretare i punti di un grafo come piazze di una città e le frecce come vie (eventualmente a senso unico se la relazione non è simmetrica) che collegano le piazze. Se (x,y)∈R allora diciamo anche che y è successivo immediato di x o che x è il precedente immediato di y. Una successione di elementi di un grafo x1,...,xn è chiamata percorso se ogni xi+1 è un successivo immediato di xi. Ad esempio nel primo grafo un percorso è costituito dalla successione a, e, d. Nel secondo grafo un percorso è costituito dalla successione 3, 4, 4, 4. Diciamo che y è successivo di x se esiste un percorso che inizia con x e finisce con y. Un ciclo è un percorso x1,...,xn in cui x1 = xn. Nel seguente grafo i punti a, e, d, a costituiscono un ciclo. a b e d Un punto x di un grafo viene chiamato radice se non è successivo di nessun punto, viene detto foglia se non ha successivi. Nel grafo ora dato a è una radice, b è una foglia. Un ramo è un percorso che non può essere prolungato, e quindi è un percorso che termina con una foglia. Operazioni con le relazioni. Nell'insieme delle relazioni si possono definire interessanti operazioni. Date due relazioni R1 ⊆ X×Y e R2 ⊆ Y×Z chiamiamo composizione di R1 e R2 la relazione R1ëR2⊆X×Z definita ponendo R1ë R2 ={(x,z) | ∃y∈Y tale che (xR1y e yR2z}. Ad esempio, in termini di data-base relazionali, la composizione delle due relazioni pag. 21/Inf Capitolo 2 Nome Domicilio Mario Napoli Luigi Salerno Maria Salerno mario Potenza carlo Roma Città Napoli Salerno Potenza Regione Campania Campania Basilicata è la relazione Nome mario luigi maria mario carlo Regione Campania Campania Campania Basilicata Lazio Sia R il seguente grafo a b f c d g e allora RëR è il grafo a b c f d e g pag. 22/Inf Capitolo 2 In altre parole due punti x ed y sono nella relazione RëR se è possibile passare da x ad y in due passi. Data una relazione binaria R⊆X×Y chiamiamo inversa di R la relazione binaria R-1⊆Y×X definita ponendo R-1={(y,x) | xRy}. Ad esempio, ecco una relazione e la sua inversa Città Napoli Salerno Potenza Regione Campania Campania Basilicata Regione Campania Campania Basilicata Città Napoli Salerno Potenza 9. Relazioni d'ordine, relazioni di equivalenza. Sia R una relazione binaria su di un insieme S, allora diciamo che R è riflessiva se A1 xRx ∀x∈S R è simmetrica se A2 xRy ⇒ yRx ∀x,y∈S R è transitiva se A3 xRy e yRz ⇒ xRz ∀x,y∈S R è asimmetrica se A4 xRy e yRx ⇒ x=y ∀x,y∈S R è totale o lineare se A5 xRy oppure yRx ∀x,y∈S. Esempi. La relazione “x è fratello di y” è simmetrica e transitiva, non è asimmetrica e non è totale. La relazione di “essere padre di” non è riflessiva, non è simmetrica e non è transitiva. La relazione “x è parente di y” è riflessiva, simmetrica e transitiva. Problemi. Sia S l'insieme dei numeri naturali: dire quale delle proprietà che abbiamo elencato sono verificate dalle seguenti relazioni: R = {(n,m) | n + m ≤ 100} ; R = {(n,m) | n+m≤3100} ; R = {(n,m) | n+m è divisibile per 10} ; R = {(n,m) | n-m è divisibile per 10} R = {(n,m) | |n-m|≤100} ; R = {(n,m) | n è un divisore di m} ; R = {(n,m) | n è un multiplo di m} ; R = {(n,m) | n2 ≤ m2}. Le relazioni vengono classificate in base alle proprietà da esse verificate. Definizione 1. Una relazione binaria su un insieme D è chiamata: - ordine se verifica la proprietà riflessiva, transitiva e asimmetrica - ordine lineare se verifica gli assiomi di ordine e la proprietà di essere totale. - relazione di equivalenza se verifica la proprietà riflessiva, simmetrica e transitiva. pag. 23/Inf Capitolo 2 In generale le relazioni d'ordine vengono denotate con il simbolo ≤, le relazioni si equivalenza vengono indicate con il simbolo ≡. Esempi di ordini. 1. L’ordinamento usuale nell’insieme dei numeri naturali è un esempio di ordine totale. 2. Consideriamo la relazione di divisibilità, cioè poniamo nRm se n è un divisore di m. Allora è subito visto che tale relazione è di ordine ma non è totale. Infatti, presi ad esempio i numeri 5 e 7 non risulta né 5R7 e neanche 7R5, in altre parole 5 non è un divisore di 7 e 7 non è un divisore di 5. 3. La relazione di inclusione tra insiemi Esempi di relazioni di equivalenza. 1. Se si considera la relazione “avere la stessa età”, tale relazione è di equivalenza. Se si considera la relazione di “si può passare dal punto P al punto Q in meno di tre passi" risulta riflessiva e simmetrica ma non transitiva. Pertanto tale relazione non è di equivalenza. 2. Nell'insieme delle parole poniamo xRy se la parola x è un anagramma della parola y. Allora la relazione ottenuta è di equivalenza. Esercizi. Chiamiamo simili due triangoli che abbiano angoli corrispondenti uguali. Dire quali proprietà sono verificate dalla relazione di similitudine. La seguente proposizione caratterizza le varie proprietà di una relazione binaria in termini di operazioni tra relazioni. Proposizione 2. Sia R una relazione binaria su D, allora: i) R riflessiva ⇔ R ⊇ Diag(D) ii) R simmetrica ⇔ R = R-1 iii) R transitiva ⇔ RëR ⊆ R iv) R asimmetrica ⇔ R∩R-1⊆Diag(D) vi) R totale se R∪R-1 = D×D. Esercizio. Provare una delle asserzioni della proposizione 3.2. 10. Quozienti e partizioni: l'algebra di Boole delle formule. Sia D un insieme, allora chiamiamo partizione di D, un insieme di parti C ⊆ P(D) tale che. i) ogni elemento d di D appartiene ad almeno un insieme in C, cioè »X∈C X = D ii) due elementi di C sono disgiunti, cioè X∈C, Y∈C, X≠Y ⇒ X∩Y=∅. In altre parole una partizione si ottiene dividendo gli elementi di D in varie parti. Esempio. L'insieme L delle lettere dell'alfabeto si possono dividere nell'insieme Voc delle vocali e nell'insieme Cons delle consonanti. Allora C ={Voc, Con} costituisce una partizione di L. Esempio. Sia D uguale all'insieme di tutti i numeri interi, Pari l'insieme dei numeri pari e Dispari l'insieme dei numeri dispari. Allora C = {Pari, Dispari} costituisce una partizione. Esempio. La divisione degli studenti nei vari corsi in base al numero di matricola costituisce una partizione. Proposizione 1. Ogni relazione di equivalenza determina una partizione. Ogni partizione determina una relazione di equivalenza. pag. 24/Inf Capitolo 2 Dim. Sia ≡ una relazione di equivalenza in un insieme D e sia x un elemento di D. Allora chiamiamo classe completa di equivalenza definita da x l'insieme [x] = {x' ∈D : x'≡x}. Indichiamo con C l'insieme {[x] : x∈D} delle classi complete di equivalenza. E' possibile provare che C è una partizione. Sia C una partizione di D e definiamo ≡ ponendo x≡x' se e solo se esiste una classe X∈C tale che X ∈C. In altri termini chiamiamo equivalenti due elementi che appartengono ad una stessa classe. Allora è possibile provare che ≡ è na relazione di equivalenza. I numeri dell'orologio. Un esempio interessante di quoziente si ottiene con i "numeri dell'orologio". Chiamiamo congrui modulo 12 due numeri relativi x ed y che differiscono per un multiplo di 12. In questo caso scriviamo x ≡ y. Ad esempio 48 ≡ 2 perché 48-2 = 46 = 3⋅12 ; 46 ≡ –2 perché 46-(-2) = 48 = 4⋅12. Se si prende un orologio allora due numeri x ed y sono congrui modulo 12 se partendo dall'ora 0, dopo x giri della lancetta si ottiene la stessa posizione sul quadrante che dopo y giri. La congruenza è una relazione di equivalenza nell'anello (Z,+,⋅,0,1) e quindi divide Z in classi di equivalenza. Se x è un qualunque numero, allora effettuando la divisione per 12 avremo x = 12⋅m + r dove r è il resto della divisione. Questo significa che x-r = 12⋅m e quindi che x è congruo al resto r modulo 12. Siccome i resti possibili sono 0, 1,…,11, le uniche classi di equivalenza saranno [0], …,[11]. Tali classi corrispondono ai numeri sul quadrante dell'orologio se si tiene conto che [0] = [12]. Torniamo ora alle formule del calcolo proposizionale. Proposizione 2. La relazione ≡ di equivalenza logica nel calcolo proposizionale è una equivalenza nell'insieme delle formule. Inoltre ≡ è una congruenza, cioè α ≡ α' ⇒ ¬α ≡ ¬α', α ≡ α' e β ≡ β ' ⇒ (α)∧(β) ≡ (α')∧(β') α ≡ α' e β ≡β' ⇒ (α)∨(β) ≡ (α')∨(β'). Dim. Evidente. Adesso possiamo definire l'algebra di Boole delle formule. Sia B il quoziente dell'insieme F delle formule modulo l'equivalenza logica, cioè B = {[α] | α ∈ F} dove, per ogni formula α, la classe [α] è definita da [α] = {α' ∈ F | α' ≡ α}, Definiamo in B le operazioni ∧, ∨, ¬ (che corrispondono ai connettivi logici) tramite le equazioni [α]∧[β] = [α∧β] ; [α]∨[β] = [α∨β] ; ¬[α] = [¬α]. Tali operazioni sono definite bene in quanto, come abbiamo visto nella Proposizione 4.2, ≡ è una congruenza. Infine indichiamo con 1 l'insieme delle tautologie e con 0 l'insieme delle contraddizioni. Definizione 3. Chiamiamo algebra di Boole delle formule la struttura algebrica ora definita nel quoziente dell'insieme delle formule modulo l'equivalenza logica. Teorema 4.4. Nell'insieme delle formule valgono le seguenti equivalenze: a) α∨β ≡ β∨α ; α∧β ≡ β∧α (proprietà commutativa) b) (α∧β)∧γ ≡ α ∧(β∧γ) ; (α∨β)∨γ ≡ α∨(β∨γ) (proprietà associativa di ∧) pag. 25/Inf Capitolo 2 c) γ ∧(α∨β) ≡ (γ ∧α)∨(γ ∧β) ; γ ∨(α∧β) ≡ (γ∨α)∧(γ∨β) (distributività) d) α ∨α ≡ α ; α ∧α ≡α (idempotenza). e) α ∨¬α è una tautologia (legge del terzo escluso) f) α ∧¬α è una contraddizione (principio di non contraddizione). g) ¬(α∧β) ≡ (α)∨(¬β) (legge di De Morgan) h) ¬(α∨β) ≡ (¬α)∧(¬β) (legge di De Morgan) i) ¬(¬(α)) ≡ α (legge della doppia negazione). Pertanto l'algebra delle formule B è una algebra di Boole. Dim. Bastano delle semplici verifiche. Poiché ad ogni formula corrisponde un circuito e formule logicamente equivalenti danno luogo a circuiti che fanno le stesse cose, il calcolo delle formule diviene un calcolo dei circuiti e la semplificazione di un circuito spesso consiste nell'effettuare calcoli nella struttura B = (B, ∧, ∨, ¬ ,0,1).