F. Drewes 2002-05-23 Datavetenskapens grunder, VT02 Lite logik Den här texten är en sammanfattning av logikdelen i kursen Datavetenskapens grunder. Den handlar om satslogik och predikatlogik, några av deras viktigaste begrepp och principer samt ett fåtal teorem som formaliserar grundläggande resultat. Tack till Lena Kallin-Westin som har läst igenom texten och påpekat en rad språkliga fel! Givetvis är hon varken ansvarig för innehållet eller för språkliga fel och konstigheter som fortfarande finns kvar. Om texten har blivit lite bättre kan det dock åtminstone delvis bero på hennes insats. 1 Vad är och varför logik? Människor resonerar. Det är kanske det som skiljer oss från djuren. Men vad är det egentligen som utgör ett rimligt resonemang? Kan man formalisera det som händer när vi resonerar? Om man är intresserad av matematik eller filosofi är den här frågan nästan oundviklig. Således är det inte särskilt förvånansvärt att logik som en vetenskaplig disciplin föddes i det antika Grekland för mer än 2300 år sedan. Platons berömda elev Aristoteles anses allmänt vara “logikens far”. Han var den första som på allvar försökte formalisera de regler som ligger bakom våra logiska resonemang. Vad gäller logik blev han en sådan stor auktoritet att ingen vågade kritisera eller vidareutveckla hans system under drygt 2000 år. Det hände först på 1800-talet och framförallt i början av 1900-talet då logiken gjorde stora framsteg. Drömmen var att man skulle kunna utveckla logiska system för att föra matematiska bevis, eller åtminstone kontrollera deras riktighet, helt automatiskt. Några årtionden senare började datavetarna drömma en ganska likadan dröm som också grundades på logik och som kallades för artificiell intelligens. Den matematiska drömmen förstördes 1931 när logikern Kurt Gödel visade att sådana system inte fanns, medan den datavetenskapliga varianten har blivit allt mindre ambitiös.1 Men även om den stora drömmen inte längre dröms är datavetenskap utan den formella logiken otänkbar. Den finns överallt: inom databasteknik och bildanalys, som programspråk, i medicinska system, när man vill förutsäga börsnoteringar, styra marsrobotrar eller specificera programvara, och inte minst inom teoretisk datalogi där man vill förstå hur och under vilka förutsättningar algoritmer funkar. Pga mångfalden av tillämpningsområdena finns det numera inte bara en logik utan många olika typer som skiljer sig främst med avseende på uttryckskraft. Beroende på problemet väljer man den logik som passar bäst. 1 Den kunde inte förstöras därför att det aldrig hade funnits ett exakt definierat mål. 1 De två som är mest grundläggande, sats- och predikatlogik, behandlas (mycket kortfattat och ofullständigt) nedan. Satslogik handlar endast om logiska påståenden och hur de kan sammansättas till mer komplicerade uttryck. Om jag säger “jag är en människa” är det, ur satslogikens synvinkel, helt enkelt ett påstående p utan inre struktur. Låt oss utöka exemplet för att få se vad det innebär. Jag är en människa och varje människa måste dö, alltså måste jag dö. Här hittar vi tre olika primitiva påståenden. Tydligen finns det ett samband mellan dem men det beror på deras innehåll2 som satslogiken inte kan “se”. Den ser bara en sats på formen p och q implicerar r där p, q och r i princip kan innebära vad som helst. Sambandet mellan p, q, och r försvinner alltså. Som vi ska se senare är det här den väsentliga skillnaden mellan satslogik och predikatlogik (som medför att satslogik är betydligt enklare än predikatlogik). När vi använder oss av predikatlogik kan vi prata om individer och deras egenskaper, en möjlighet som saknas i satslogik. 2 Satslogik Satslogik kan betraktas som ett artificiellt språk på mer eller mindre samma sätt som programspråk. Till skillnad mot naturliga språk som svenska eller engelska måste sådana språk definieras exakt. Det finns två huvudaspekter som bör hållas isär – språkets syntax och dess semantik. Syntax handlar om form; definitionen svarar på frågan Hur ska det se ut? medan semantik handlar om betydelse, svarar alltså på frågan Vad betyder det? Dessa två definieras nästan alltid separat pga att det är mycket enklare både att genomföra och att förstå. Första steget är att definiera syntaxen. Efteråt definieras semantiken endast för syntaktiskt korrekta meningar (som gör saken betydligt lättare). 2.1 Satslogikens syntax Satslogikens syntax använder sig av en rad olika symboler: • gemener (t ex p, q, r, . . ., vid behov också med index) som kallas för atomer, • konnektiven ∧ (“och”), ∨ (“eller”), ¬ (“inte”) och → (“implicerar”), och 2 De två första handlar om samma egenskap (vara människa), det första och det tredje om samma individ (jag) och de två sista igen om en viss egenskap (vara tvungen att dö). 2 • parenteser (· · ·). Symbolerna får kombineras för att bilda uttryck – men naturligtvis är inte vilken som helst kombination tillåten. Vissa uttryck får skrivas, andra inte. Vilka som är tillåtna är precis det som utgör satslogikens syntax. Definition 2.1 (satslogikens syntax) Mängden av alla satslogiska uttryck (kort satser ) är den minsta mängden SL sådan att • varje atom ingår i SL och • om P och Q ingår i SL så är också (P ∧ Q), (P ∨ Q), (¬P ), och (P → Q) element i SL. Enligt definitionen är alltså t ex (((¬q) ∧ (p → q)) → (¬q)) en sats. Som när man arbetar med aritmetiska uttryck använder man sig av konventioner för att slippa skriva ner alla parenteserna. De vanligaste konventionerna är • yttre parenteser tas bort, • ¬ binder starkast, sedan ∧, sedan ∨ och sist → (man får alltså skriva p ∨ q ∧ ¬p → q istället för (p ∨ (q ∧ (¬p))) → q), • både ∧ och ∨ associerar till vänster (p ∧ q ∧ r ∧ s motsvarar alltså ((p ∧ q) ∧ r) ∧ s). 2.2 Satslogikens semantik Pga definition 2.1 vet vi alltså numera vilka satser får skrivas (och konventionerna förenklar syntaxen lite). Det återstår således att definierar satsernas semantik. Tanken är att varje atom kan få ett sanningsvärde – ett värde i mängden B = {T, F } där T står för true (sann) och F står för false (falsk). Konnektiven i en sats tolkas som funktioner på sanningsvärden, som medför att hela uttrycket får ett värde som helt enkelt kan räknas ut. Det viktigaste är alltså semantiken för konnektiven. Den kan definieras genom sanningsvärdestabeller som visar resultatvärdet för varje kombination av argumentvärden. Vi börjar med sanningsvärdestabellen som definierar semantiken för ∧: p T T F F q T F T F p∧q T F F F Med andra ord, semantiken för ∧ är funktionen ∧: B2 → B där T om p = T = q p∧q = F annars. Observera skillnaden mellan ∧ som bara är en symbol (syntax!) och ∧ som är en tvåställig funktion (semantik!). På samma sätt definieras ∨: B2 → B, ¬: B → B och →: B2 → B genom följande sanningsvärdestabeller: 3 p T T F F q T F T F p∨q T T T F ¬p F T p T F p T T F F q T F T F p→q T F T T Nu kan vi avsluta definitionen av satslogikens semantik. Definition 2.2 (tolkning) En tolkning t är en funktion som tilldelar varje atom p ett sanningsvärde t(p) ∈ B. Funktionen t utökas till en tolkning av godtyckliga satser (till en funktion t: SL → B alltså) på ett induktivt sätt: För alla satser P, Q definieras t(P ∧ Q) t(P ∨ Q) t(¬P ) t(P → Q) = = = = t(P ) ∧ t(Q), t(P ) ∨ t(Q), ¬ t(P ), t(P ) → t(Q). När man är intresserad av en specifik sats (eller en mängd av satser) räcker det tydligen att specificera sanningsvärdena för de atomer som faktiskt förekommer i satsen. Satsens tolkning är ju uppenbarligen oberoende av tolkningen av atomer som inte finns i den. Därför kan tolkningarna av en sats sammanfattas i en sanningsvärdestabell. Tabellen har en kolumn för varje delsats. T ex är sanningsvärdestabellen för ¬p ∧ (q ∨ p) den följande: p T T T T 2.3 q T F T F ¬p q ∨ p ¬p ∧ (q ∨ p) F T F F T F T T T T F F Ekvivalens och normalformer En sats P är ekvivalent med en sats Q, P ≡ Q, om t(P ) = t(Q) för alla tolkningar t. Ekvivalens kan alltså kollas mha sanningsvärdestabeller. Satsen ovan är t ex ekvivalent med ¬p ∧ q. Man kan säga att ekvivalenta satser är olika sätt att uttrycka samma sak. Syntaktiskt sett kan de vara olika men någon semantisk skillnad mellan dem finns inte. Det återspeglar sig i följande teorem. Jag utelämnar det lätta induktiva beviset. Teorem 2.3 En delsats i en sats kan ersättas med en godtycklig ekvivalent delsats utan att satsens tolkningar påverkas. Vi ska nu se att varje satslogiskt uttryck är ekvivalent med en sats som har en mycket speciell form. Formen kallas för konjunktiv normalform. En sats P är på konjunktiv normalform (KNF) om den är en konjunktion av disjunktioner av litteraler. Satsen är alltså en konjunktion P = P1 ∧ P2 ∧ · · · ∧ Pn 4 (n ≥ 1) där varje Pi är en disjunktion Pi = Pi,1 ∨ Pi,2 ∨ · · · ∨ Pi,mi (mi ≥ 1) av litteraler Pi,j . En litteral är antingen en atom eller en negerad atom. Den här satsen är alltså på KNF: (p ∨ ¬q ∨ r) ∧ (¬p ∨ q) ∧ (q ∨ r ∨ s) ∧ ¬p. På samma sätt definieras en sats att vara på disjunktiv normalform (DNF) om den är en disjunktion av konjunktioner av litteraler. Teorem 2.4 Varje sats är ekvivalent med en sats på KNF och med en sats på DNF. Bevisskiss Enligt teorem 2.3 kan en sats omskrivas genom att byta ut delsatser mot ekvivalenta delsatser. Vi behöver alltså endast visa hur ekvivalenser kan användas för att omskriva en godtycklig sats till KNF respektive DNF. Med hjälp av ekvivalensen P → Q ≡ ¬P ∨ Q kan alla implikationstecknen tas bort ur satsen. Nästa steg är att använda sig av deMorgans regler ¬(P ∧ Q) ≡ ¬P ∨ ¬Q och ¬(P ∨ Q) ≡ ¬P ∧ ¬Q samt ekvivalensen ¬¬P ≡ P . Appliceras de (från vänster till höger) så länge som möjligt får man en sats där negationer endast förekommer i litteraler. Satsen består således uteslutande av ∧, ∨, och litteraler. Omskrivningen avslutas mha de distributiva lagarna P ∨ (Q ∧ R) ≡ (P ∨ Q) ∧ (P ∨ R) (för att få en sats på KNF) respektive P ∧ (Q ∨ R) ≡ (P ∧ Q) ∨ (P ∧ R) (för att få en sats på DNF). För att vara noga bör nämnas att man dessutom använder sig av de kommutativa lagarna P ∧ Q ≡ Q ∧ P och P ∨ Q ≡ Q ∨ P samt de associativa lagarna P ∧ (Q ∧ R) ≡ (P ∧ Q) ∧ R och P ∨ (Q ∨ R) ≡ (P ∨ Q) ∨ R. 2 2.4 Bevissystem En viktig motivering för att skapa formella logiska system är att man gärna vill ha ett helt formellt sätt att föra bevis. Vanligtvis vill man visa att en sats är sann under alla tolkningar. Sådana satser kallas för tautologier. Man säger också att de är giltiga. För att visa att en sats är en tautologi kan man använda sig av två olika metoder. Den första är den semantiska metoden: Det konstrueras helt enkelt en sanningsvärdestabell. T exä är (p ∨ q) ∧ ¬p → q en tautologi; den tillhöriga kolumnen innehåller endast värdet T : p T T F F q T F T F p ∨ q ¬p (p ∨ q) ∧ ¬p (p ∨ q) ∧ ¬p → q T F F T T F F T T T T T F T F T Metoden funkar utan tvivel men den har en rad nackdelar i alla fall: • Metoden är tråkig. 5 • Tabellen kan bli mycket stor (om satsen innehåller n olika atomer består tabellen av 2n rader). • Man får ingen bättre förståelse av satsen och de logiska förhållandena som medför att den faktiskt är giltig. • Metoden kan bara användas i samband med satslogik. När det inte längre handlar om ett ändligt antal möjligheter som måste kollas blir den onyttig. Den andra metoden är den syntaktiska. Där (uppfinns och) används ett regelsystem som gör det möjligt att härleda giltiga satser. I princip får ett sådant system se ut hur som helst. Två viktiga aspekter bör dock beaktas. Krav Systemet måste vara sunt, dvs endast giltiga satser får kunna härledas. Önskemål Systemet ska helst vara fullständigt, dvs alla giltiga satser skulle kunna härledas. Varför är det sista ett önskemål istället för ett krav? Förklaringen är att det ofta inte kan uppfyllas om man inte vill strunta i sundheten. Det är precis det som Kurt Gödel visade 1931: Så fort man når en viss uttryckskraft med sina logiska system är det omöjligt att konstruera ett bevissystem som både är sunt och fullständigt. Givetvis är det ingen idé att tillåta system som inte är sunda. I allmänhet kan målet alltså på sin höjd vara att konstruera system som är sunda men dessutom så fullständiga som möjligt. Lyckligtvis är satslogik så enkel att Gödels teorem inte gäller för den. Med andra ord, det finns bevissystem som både är sunda och fullständiga. Vi ska nu diskutera ett av de, som som så många andra använder sig av inferensregler. En inferensregel skrivs oftast P1 , . . . , P n ∴Q där P1 , . . . , Pn och Q är satsscheman (dvs de kan innehålla variabler som står för godtyckliga delsatser). Regelns betydelse är: Om satser på formen P1 , . . . , Pn redan har härletts får också satsen Q härledas. De tre prickorna kan översättas med “alltså”, “och således”. De används traditionellt när inferensregler skrivs ner. Personligen tycker jag att de är överflödiga och tar bort de i våra 7 regler P → Q, P Q modus ponens (MP) P → Q, ¬Q ¬P modus tollens (MT) P, Q P ∧Q och-1 P ∧Q P och-2 P P ∨Q eller-1 P ∨ Q, ¬Q P eller-2 P → Q, Q → R P →R impl 6 De regler som innehåller P ∧Q eller P ∨Q får också användas med ombytta roller vad gäller P och Q. För att göra listan helt fullständig borde alltså egentligen läggas till 3 regler. Inferensreglerna används i samband med 3 bevisregler som anger hur en sats kan härledas. Anta att vi vill bevisa att en sats P1 ∧· · ·∧Pn → Q är en tautologi. P1 , . . . , Pn kallas för premisserna och målet är att visa att de implicerar Q.3 Ett bevis är en lista av satser som börjar med premisserna och slutar med Q. Man använder en rad per sats. Raderna numreras och på varje rad antecknas vilken regel som har applicerats på vilka tidigare rader för att få satsen. Direkt bevis (DB) I ett direkt bevis appliceras helt enkelt inferensreglerna för att nå Q utgående från P1 , . . . , Pn . Beviset har alltså den här formen: Rad 1. 2. .. . n. n+1. .. . m. Sats P1 P2 .. . Kommentar (premiss) (premiss) .. . premisser Pn (premiss) Pn+1 (rader, applicerad regel) satser som härleds mha .. .. . . inferensregler Pm = Q (rader, applicerad regel) Ett direkt bevis kan t ex användas för att visa att (¬p → ¬q) ∧ (p → r) ∧ ¬r → ¬q ∨ r är en tautologi: 1. 2. 3. 4. 5. 6. ¬p → ¬q p→r ¬r ¬p ¬q ¬q ∨ r (premiss) (premiss) (premiss) (2,3, MT) (1,4, MP) (5, eller-1). Underbevis (UB) Ibland är situationen inte så enkel som ovan. Då kan det vara nödvändigt att föra underbevis i ett bevis för att härleda en implikation som behövs. Underbevis funkar precis som vanliga bevis. De har sina egna premisser och ska avslutas med slutsatsen som man vill nå. För att optiskt 3 Att endast betrakta satser av den här formen medför ingen inskränkning därför att vi tillåter n = 0. Ifall n = 0 tas pilen bort så att det bara är Q som står kvar. 7 skilja underbevis från omgivningen används indrag: Rad .. . Sats .. . Kommentar .. . k+1. k+2. .. . P10 P20 .. . (premiss UB) (premiss UB) .. . k+l. .. . Pl0 .. . (premiss UB) .. . m. Q0 (· · ·) 0 0 0 m+1. P1 ∧ · · · ∧ Pl → Q (resultat UB) .. .. .. . . . o rader före underbeviset underbeviset pågår o underbevisets resultat beviset fortsätts Självklart får underbevis i sin tur innehålla underbevis osv. Observera att det här skapar en blockstruktur med “scoping” som i programspråk. Inom underbeviset får man inte bara använda sig av lokala satser som har härletts i själva underbeviset utan också av de icke lokala satserna som har härletts tidigare (dvs i det omslutande beviset). Däremot är underbevisets lokala satser inte längre synliga när huvudbeviset fortsätts. Deras korrekthet beror ju på underbevisets premisser som vanligtvis inte kan härledas i huvudbeviset. Indirekta bevis (IB) Indirekta bevis kan ses som en sorts underbevis också. Om man vill härleda Q kan man börja med ¬Q som premiss och härleda en motsägelse – en sats på formen R ∧ ¬R. Motsägelsen avslutar det indirekta beviset av Q: Rad .. . Sats .. . Kommentar .. . k. .. . ¬Q .. . m. m+1. Q .. .. . . R ∧ ¬R o rader före indirekt underbeviset (premiss IB) härledning av en mot.. . sägelse (· · ·) (resultat IB) o underbevisets resultat .. beviset fortsätts . Ett enkelt exempel är satsen (p → r) ∧ (q → r) → (p ∨ q → r) som kan bevisas mha ett underbevis som i sin tur använder sig av ett indirekt underbevis: 8 1. p → r 2. q → r 3. p∨q 4. ¬r 5. ¬p 6. ¬q 7. q 8. q ∧ ¬q 9. r 10. p ∨ q → r (premiss) (premiss) (premiss för UB) (premis för IB) (1,4, MT) (2,4, MT) (3,5, eller-2) (6,7, och-1 – motsägelse!) (resultat IB) (resultat UB). För att förenkla bevis kan man, utöver de diskuterade reglerna, använda sig av ekvivalenser för att omskriva uttryck. Dessutom får tautologier som har bevisats i tidigare bevis alltid skrivas ner på en ny rad. (Observera att en sådan rad kan alltid ersättas med respektive underbevis. Det ger alltså inget nytt förutom bättre läsbarhet.) På det här viset kan äldre resultat återanvändas och stora bevis kan delas upp i mindre stora. 3 Predikatlogik Vi ska nu diskutera ett rikare språk än satslogik: första ordningens predikatlogik. Även om den är den enklaste typen av predikatlogik (som attributet “första ordningen” antyder) är den lämplig för att beskriva en stor mängd av resonemang. Låt oss betrakta samma meningen som i början: Jag är en människa och varje människa måste dö, alltså måste jag dö. I predikatlogik har vi tillgång till (symboler som betecknar) individer och vi kan uttrycka att något (ett predikat) gäller för dem. Dessutom används konnektiven från satslogiken och kvantifierarna ∀ och ∃ som uttrycker att något gäller för alla individer respektive att det finns en individ som uppfyller kravet. Specifika individer kallas för konstanter medan de som används i samband med kvantifierare heter variabler. Resonemanget ovan kan således formaliseras så här: m(jag) ∧ ∀x (m(x) → d(x)) → d(jag). Predikatsymbolerna m och d står för “vara människa” respektive “vara tvungen att dö”. Observera att uttrycket har samma grovstruktur som dess satslogiska version p ∧ q → r där p står för m(jag), q för ∀x (m(x) → d(x)) och r för d(jag). Det satslogiska uttrycket är en abstraktion av den predikatlogiska formeln där man bortser från den inre strukturen i p, q och r. Vi ska nu definiera syntaxen och semantiken för första ordningens predikatlogik. Som vanligt börjar vi med syntaxen. Den bygger på följande symboler: • konstanter a, b, c, . . ., • variabler x, y, z, . . ., 9 • funktionssymboler f, g, h, . . ., • predikatsymboler p, q, r, . . ., • konnektiven ∧, ∨, ¬, →, • kvantifierarna (eller kvantifikatorerna) ∀ (“för alla”) och ∃ (“det finns”) och • parenteser och komman. Varje funktionssymbol och predikatsymbol har dessutom en ställighet n ≥ 1 som anger hur många argument den kräver. T ex är både m och d ettställiga i exemplet ovan. Exemplet innehåller inga funktionssymboler men i allmänhet är funktionssymboler väldigt nyttiga. När man t ex vill uttrycka att varje människas mor är en människa så tar man en ettställig funktionssymbol mor och kan då skriva ∀x (m(x) → m(mor (x))). De uttryck som består av konstanter, variabler och funktionssymboler kallas för termer. Deras formella definition ser ut så här: Definition 3.1 (syntax för termer) Mängden av alla termer är den minsta mängden T som innehåller • varje konstant och varje variabel och • varje uttryck f (s1 , . . . , sn ) där f är en n-ställig funktionssymbol och s1 , . . . , sn ∈ T . Om man alltså t ex har konstanter a, b, en tvåställig funktionssymbol f och en ettställig funktionssymbol g så är f (g(a), f (b, g(a))) en term enligt definitionen. När man har funktionssymboler som t ex + skriver man ofta s1 + s2 istället för +(s1 , s2 ) för att öka läsbarheten. Nu kan syntaxdefinitionen avslutas genom att definiera predikatlogiska formler. Definition 3.2 (syntax för formler) Mängden av alla formler i första ordningens predikatlogik är den minsta mängden PL som innehåller • varje atomär formel (eller atomisk formel ) p(s1 , . . . , sn ) där p är en nställig predikatsymbol och s1 , . . . , sn är termer, • alla uttryck (P ∧ Q), (P ∨ Q), (¬P ) och (P → Q) där P, Q ∈ PL och • alla uttryck (∀x P ) och (∃x P ) där P, Q ∈ PL. Vad gäller (∀x P ) eller (∃x P ) så kallas P för räckvidden av ∀x respektive ∃x. För att minska parenteserna används samma konventioner som i satslogik, med tillägget att ∀x och ∃x binder starkast av alla. En (förekomst av en) variabel x i en formel är bunden om den ligger inom räckvidden av ett ∀x eller ∃x; annars är den fri. I formeln r(x) ∧ ∃x∀y p(y) → q(x, y) är endast den första förekomsten av y bunden, alla andra är fria. Om vi istället skriver r(x) ∧ ∃x∀y(p(y) → q(x, y)) så är bara den första förekomsten av x fri. 10 Predikatlogikens semantik definieras i princip likadant som satslogikens: Man väljer en tolkning av de förekommande symbolerna och får då en tolkning av hela formeln som resulterar i ett sanningsvärde. Skillnaden är att tolkningen av symbolerna blir mer komplicerade pga att man måste tolka konstanter och variabler som individer i någon domän, funktionssymboler som funktioner och predikatsymboler som predikat. Dessutom måste naturligtvis definitionen av ∀x P och ∃x P preciseras. Definition 3.3 (predikatlogikens semantik) En tolkning t av en formel P tilldelar • varje konstant a och varje variabel x en individ t(a) respektive t(x) i en icke tom mängd D (tolkningens domän), • varje n-ställig funktionssymbol f en funktion ft : Dn → D och • varje n-ställig predikatsymbol p en funktion pt : Dn → B (en predikat). Tolkningen av hela formeln definieras induktivt så här: • t(f (s1 , . . . , sn )) = ft (t(s1 ), . . . , t(sn )) för termer f (s1 , . . . , sn ), • t(p(s1 , . . . , sn )) = pt (t(s1 ), . . . , t(sn )) för atomära formler p(s1 , . . . , sn ), • t(P ∧ Q) = t(P ∨ Q) = t(¬P ) = t(P → Q) = för alla formler t(P ) ∧ t(Q), t(P ) ∨ t(Q), ¬ t(P ), t(P ) → t(Q). P, Q (som i satslogik) och • för alla formler P t(∀x P ) = och t(∃x P ) = T F T F Här betecknas med tx=d utom att tx=d (x) = d. om tx=d (P ) = T för alla d ∈ D annars om tx=d (P ) = T för något d ∈ D annars. den tolkning som är lika med t i alla detaljer Vi säger att en formel P är logiskt sann om t(P ) = T för alla tolkningar t. Det motsvarar alltså begreppet tautologi på den satslogiska nivån. Det ovannämnda exemplet är en sådan logisk sanning. Jag avsluter den här korta diskussionen av predikatlogiken med två av de mest berömda resultaten inom logik. (Den andra är tvivelsutan det mest berömda resultatet inom logik överhuvud taget.) Båda har bevisats av Kurt Gödel. Om man så vill kan man säga att det första är den goda nyheten medan den andra är den dåliga. Teorem 3.4 (Gödels fullständighetsteorem) Det finns ett sunt och fullständigt bevissystem4 för att härleda logiskt sanna formler i första ordningens predikatlogik. 4 systemet för satslogiska härledningar plus några ytterligare inferensregler för att handskas med kvantifierare 11 Visserligen är teoremet en stor framgång men å andra sidan räcker det att titta på formeln ∀x (x > 1 → x · x > x) för att upptäcka att man egentligen skulle vilja ha mer än det. Formeln ser sann ut men dessvärre är den ingen logisk sanning. För att vara logiskt sann måste den vara sann under alla tolkningar. Så är självklart inte fallet. Vi kan t ex välja mängden av alla strängar som domän och tolka 1 som strängen test, r > s som r är en delsträng i s, och r · s som sammanlänkning av r och s. I så fall tolkas alltså formeln som För alla delsträngar x i test gäller att xx är en delsträng i x. “Felet” är att vi liksom automatiskt tolkar symbolerna som vi är vana vid, dvs 1 som det naturliga talet ett, > som “större än” och · som multiplikation (och att vi implicit drar slutsatsen att det hela handlar om tal som domän). Men rent logiskt är så naturligtvis inte fallet. Först när vi väljer en tolkning lägger vi fast vad som symbolerna ska betyda. Men är inte ∀x (x > 1 → x · x > x) sann och borde inte det kunna formaliseras på något sätt också? Självklart – diskussionen ovan visar vägen. Vad vi behöver är en så kallad teori : första ordningens predikatlogik med en specifik tolkning av predikat- och funktionssymbolerna. Jag ska inte formalisera det i detalj här. Det räcker med att föreställa sig att vi betraktar första ordningens predikatlogik med en mängd av symboler som inte får tolkas hur som helst utan har en fast mening. Gödels resultat är då den följande. Teorem 3.5 (Gödels ofullständighetsteorem) Det finns inget sunt bevissystem för teorien (N, >, +, ·, 0, 1) (dvs de naturliga talen med ordningsrelationen >, addition och multiplikation) som samtidigt är fullständigt. Samma sak gäller alla andra teorier, eller formella system överhuvud taget, som är minst lika kraftfulla. Det bör framhävas att teoremet inte avslöjar ett “konstruktionsfel” på den formella logiken, eller att logik inte är nyttig. Det visar endast att det finns gränser som formella system aldrig kan övervinna. Lite filosofiskt kan man säga att varje sak har sitt pris: Genom att begränsa oss till helt formella resonemang får vi resultat som är absolut säkra – men absolut säkerhet är ett rejält önskemål så vi borde inte förvånas över att begränsningarna är lika rejäla. 4 Från naturligt språk till formell logik – några exempel Egentligen är det tämligen lätt att formalisera resonemang. Ifall det räcker med satslogik bör man helst inte använda den “stora klubban” predikatlogik i onödan. Ett exempel är Castro är en katt eller en hund. Om han är en hund så hatar han katter; annars hatar han hundar. Men Castro gillar katter, alltså är 12 han en katt. [Innan du läser vidare: Är det här ett korrekt resonemang?] För att formalisera det här resonemanget behövs det bara satslogik pga att den “inre strukturen” i de förekommande primitiva påståendena inte spelar någon som helst roll. De primitiva påståendena är k h hk hh gk = = = = = Castro Castro Castro Castro Castro är en katt är en hund hatar katter hatar hundar gillar katter. Det motsvarande satslogiska uttrycket är således (k ∨ h) ∧ (h → hk ) ∧ (¬h → hh) ∧ gk → k Castro är en katt eller en hund om han är en hund så hatar han katter annars hatar han hundar men Castro gillar katter alltså är han en katt. Tyvärr är resonemanget inte helt korrekt (dvs det är ingen tautologi). Det som saknas är premissen om Castro gillar katter så hatar han inte katter, alltså gk → ¬hk . När det handlar om formell logik måste även självklarheter nämnas klart och tydligt. Försök att bevisa det hela mha det här tillägget! (Det bör visa att en av de andra premisserna faktiskt är överflödig. Vilken?) Resonemanget kan formuleras på ett annat sätt: Castro är en katt eller en hund. Hundar hatar katter. Ingen hatar någon som hon gillar. Men Castro gillar katter, alltså är han en katt. Helt plötsligt är satslogik inte längre lämplig. Det beror på att resonemanget numera handlar om hundar och katter i allmänhet, och vad det betyder med avseende på en enskild individ, nämligen Castro. Det att vara en katt respektive hund måste numera uttryckas mha ett predikat. Dessutom behövs det predikat för att uttrycka att någon hatar/gillar någon annan. Castro representeras av en konstant c = Castro katt(x) = x är en katt hund (x) = x är en hund hatar (x, y) = x hatar y gillar (x, y) = x gillar y och vi får den här formeln: (katt(c) ∨ hund (c)) ∧ (∀x ∀y (hund (x) ∧ katt(y) → hatar (x, y)) ∧ ¬∃x ∃y (gillar (x, y) ∧ hatar (x, y)) ∧ ∀x (katt(x) → gillar (c, x)) → katt(c) Castro är en katt eller en hund (alla) hundar hatar (alla) katter ingen hatar någon hon gillar men Castro gillar (alla) katter alltså är han en katt. Naturligt språk är inte entydigt. Därför är det ibland en bedömningssak hur man formaliserar ett resonemang. I det här fallet preciserade jag Castro gillar 13 katter som Castro gillar alla katter. En annan möjlighet är att precisera det som Castro gillar minst en katt. Då skulle den motsvarande delen i formeln vara ∃x (katt(x) ∧ gillar (c, x)). Naturligtvis kan det hända att två olika formaliseringar ger olika resultat. I det här exemplet är en av formaliseringarna en logisk sanning men inte den andra. Varför? (Tips: I en av formaliseringarna saknas det igen en “självklar” premiss som är gömd i den andra.) De följande två exemplen är uppgifter av Papadimitriou [3]. Det första handlar om en gammal engelsk låt. Låten börjar Everybody loves my baby, My baby loves nobody but me. . . En lämplig formalisering måste uttrycka att något gäller för alla individer – vi behöver alltså kvantifierare och är således tvungna att använda predikatlogik. Texten handlar om en relation loves(x, y) mellan individer och om två specifika individer mybaby och me, konstanter alltså. Andra raden kan tyckas lite knepigt att formalisera. Hur uttrycker vi “nobody but me”? Lösningen är enkel: Om mybaby älskar någon så implicerar det att denna någon är lika med me. Med andra ord, det behövs ett predikat till: ‘=’. Formaliseringen är därmed ∀x loves(x, mybaby) ∧ ∀x (loves(mybaby, x) → x = me). Det som kanske är förbluffande är: Formeln implicerar mybaby = me, dvs ∀x loves(x, mybaby) ∧ ∀x (loves(mybaby, x) → x = me) → mybaby = me är en logisk sanning. Det oväntade resultatet beror på att första premissen i synnerhet ger loves(mybaby, mybaby) som pga andra premissen implicerar mybaby = me. Som sagt – naturligt språk är inte speciellt precis. Vårt sista exempel är ett citat från Abraham Lincoln: You can fool some people all of the time, and all of the people some of the time, but you cannot fool all of the people all of the time. Om vi skriver canfool (x, t) för att uttrycka “x can be fooled at time t” så kan vi skriva ∀t ∃x canfool (x, t) ∧ ∀x ∃t canfool (x, t) ∧ ¬∀x ∀t canfool (x, t). Formaliseringen är okej men faktiskt är det inte heller i det här fallet helt klart vad som egentligen menas. Osäkerheten uppstår i formelns första del. Formaliseringen ovan är den som Papadimitriou kallar den optimistiska tolkningen: Man kan alltid hitta en person som kan bli lurad men det behöver inte vara samma person vid olika tillfällen. Den andra tolkningen är den pessimistiska – det finns minst en person som är så otroligt lättlurad att han/hon alltid kan bli lurad: ∃x ∀t canfool (x, t) ∧ ∀x ∃t canfool (x, t) ∧ ¬∀x ∀t canfool (x, t). Det är inte svårt att se att den optimistiska versionen är en logiskt följd av den pessimistiska. Intuitionen är att om det finns en som alltid kan bli lurad så finns det alltid en som kan bli lurad. 14 5 Litteratur Boken [2] är en tämligen lättläst introduktion till logik på svenska. Den innehåller dessutom två kapitel om grundläggande matematiska begrepp (Mängdlära och Relationer och funktioner ) och kan således vara till speciell nytta för de som känner sig osäkra vad gäller matematisk terminologi. En bra logikbok för dem som vill fördjupa sig i temat är [1]. Den var kursboken till kursen Logik med tillämpningar fram till sista kurstillfället VT02. Sist men inte minst vill jag hänvisa till den ovannämnda boken [3]. Den är ingen renodlad logikbok utan handlar egentligen om komplexitetsteori. Men dessutom behandlar Papadimitriou en hel del beräkningsbarhet och logik inklusive Gödels ofullständighetsteorem. Boken är mycket bra (den bästa boken om komplexitet hittills enligt min uppfattning) och kan bara rekommenderas till alla som vill lära sig mer inom det här området. Boken är dock på en ganska hög nivå och läses inte på en helg. [1] Mordechai Ben-Ari. Mathematical Logic for Computer Science. Springer, 2nd edition, 2001. [2] Love Ekenberg and Johan Thorbiörnson. Logikens grunder. Natur och Kultur, 2001. [3] Christos H. Papadimitriou. Computational Complexity. Addison-Wesley, 1994. 15