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