Predikaatlogica en informatica



Vergelijkbare documenten
Predikaatlogica, modellen en programma s

Formeel Denken 2014 Uitwerkingen Tentamen

Wiskundige beweringen en hun bewijzen

Formeel Denken 2013 Uitwerkingen Tentamen

Logica 1. Joost J. Joosten

Tegenvoorbeeld. TI1300: Redeneren en Logica. De truc van Gauss. Carl Friedrich Gauss, 7 jaar oud (omstreeks 1785)

Tentamen TI1300 en IN1305-A (Redeneren en) Logica

Getaltheorie I. c = c 1 = 1 c (1)

1 Delers 1. 3 Grootste gemene deler en kleinste gemene veelvoud 12

Mededelingen. TI1300: Redeneren en Logica. Waarheidstafels. Waarheidsfunctionele Connectieven

Propositielogica, waarheid en classificeren

Logica voor Informatica

Je hebt twee uur de tijd voor het oplossen van de vraagstukken. µkw uitwerkingen. 12 juni 2015

Formeel Denken. Herfst 2004

Hebzucht loont niet altijd

FLIPIT 5. (a i,j + a j,i )d i d j = d j + 0 = e d. i<j

VERZAMELINGEN EN AFBEELDINGEN

Opmerking. TI1300 Redeneren en Logica. Met voorbeelden kun je niks bewijzen. Directe en indirecte bewijzen

We beginnen met de eigenschappen van de gehele getallen.

Eigenschap (Principe van welordening) Elke niet-lege deelverzameling V N bevat een kleinste element.

4 Beschouw de volgende formuleverzameling S: {"x "y ((Rxy Æ "z (Rxz Æ y = z)), "x "y (Ryx Æ "z (Rzx Æ y = z)),

Logica. Oefeningen op hoofdstuk Propositielogica

Semantiek 1 college 10. Jan Koster

Meer oefenen. TI1300: Redeneren en Logica. Vertalen. Meerdere wegen leiden naar Rome

1 Limiet van een rij Het begrip rij Bepaling van een rij Expliciet voorschrift Recursief voorschrift 3

1.3 Rekenen met pijlen

Formeel Denken. October 20, 2004

Opdracht 1 Topics on Parsing and Formal Languages - fall 2010

Projectieve Vlakken en Codes

Logica voor Informatica. Propositielogica. Syntax & Semantiek. Mehdi Dastani Intelligent Systems Utrecht University

Verzamelingen. Hoofdstuk 5

In Katern 2 hebben we de volgende rekenregel bewezen, als onderdeel van rekenregel 4:

Uitleg van de Hough transformatie

Wie A zegt moet B zeggen

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Over Plantinga s argument voor de existentie van een noodzakelijk bestaand individueel ding. G.J.E. Rutten

RSA. F.A. Grootjen. 8 maart 2002

Logica als een oefening in Formeel Denken

Inhoud leereenheid 1. Inleiding. Introductie 13. Leerkern Wat is logica? Logica en informatica 13

Logica voor Informatica

Inleiding logica Inleveropgave 3

Maak automatisch een geschikte configuratie van een softwaresysteem;

1. Vectoren in R n. y-as

Mededelingen. TI1300: Redeneren en Logica. Metavariabelen Logica, p Minder connectieven nodig

Tentamen TI1300 en IN1305-A (Redeneren en) Logica

Netwerkdiagram voor een project. AON: Activities On Nodes - activiteiten op knooppunten

RAF belangrijk te onthouden

Opgave 1b: Toon ook aan dat meer algemeen geldt: Als het lukt met n = a munten in w keer wegen, dan lukt het voor a < n 2a in w + 1 keer wegen.

Getallenleer Inleiding op codeertheorie. Cursus voor de vrije ruimte

Bewijs door inductie

Opdracht 1 Topics on Parsing and Formal Languages - fall 2010

2 n 1. OPGAVEN 1 Hoeveel cijfers heeft het grootste bekende Mersenne-priemgetal? Met dit getal vult men 320 krantenpagina s.

I.3 Functies. I.3.2 Voorbeeld. De afbeeldingen f: R R, x x 2 en g: R R, x x 2 zijn dus gelijk, ook al zijn ze gegeven door verschillende formules.

Hier vertel je wat je hebt gedaan om informatie te vinden. Wat en waar gezocht? Wie geïnterviewd, enz.

Kennis en communicatie

Logic for Computer Science

Cover Page. The handle holds various files of this Leiden University dissertation.

Toelichting bij geselecteerde opdrachten uit Betekenis en Taalstructuur

Vorig college. IN2505-II Berekenbaarheidstheorie College 4. Opsommers versus herkenners (Th. 3.21) Opsommers

Propositionele logica

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie 9 februari 2009 BEWIJZEN

Caleidoscoop: Logica

Modulewijzer InfPbs00DT

Logica 1. Joost J. Joosten

Predikatenlogica in Vogelvlucht

Andere grote namen van wiskundigen en/of filosofen: Plato, Socrates, Descartes (Cartesius), Spinoza, Kant, Russell, Hilbert, Tarski en Brouwer

Verzamelingen, Lijsten, Functioneel Programmeren

Logica 1. Joost J. Joosten

Nieuwe redeneringen. TI1300: Redeneren en Logica. Waar gaan deze uitdrukkingen over? Een nieuwe taal

Logica 1. Joost J. Joosten

Inleiding Logica voor CKI, 2013/14

Examen G0U13 Bewijzen en Redeneren Bachelor 1ste fase Wiskunde. vrijdag 31 januari 2014, 8:30 12:30. Auditorium L.00.07

PARADOXEN 2 Dr. Luc Gheysens

Kennisrepresentatie & Redeneren. Piter Dykstra Instituut voor Informatica en Cognitie

De enveloppenparadox

Logica voor Informatici najaar 2000 Opgaven en Oplossingen Hoofdstuk 3

1 Logica a. tautologie -1-

Boommethode. TI1300: Redeneren en Logica. Oefenen, wat anders? Aanvullende regels (Logica, tabel 11.1, p. 159) A (B C),A C = B

College Logica voor CKI

Propositionele logica en predikatenlogica. 1. Noteer volgende Nederlandse uitspraken formeel m.b.v. propositionele logica :

Logic for Computer Science

Semantiek 1 college 4. Jan Koster

Diophantische vergelijkingen

Gödels theorem An Incomplete Guide to Its Use and Abuse, Hoofdstuk 3

Getal en Ruimte wi 1 havo/vwo deel 1 hoofdstuk 4 Didactische analyse door Lennaert van den Brink ( )

Oefenopgaven Grondslagen van de Wiskunde A

Predicaten. Hoofdstuk 4

Tentamen Grondslagen van de Wiskunde A Met beknopte uitwerking

Hoofdstuk 3. behandeld. In de paragrafen 3.1 en 3.2 worden de noties valuatie, model en

Een spoedcursus python

Netwerkdiagram voor een project. AOA: Activities On Arrows - activiteiten op de pijlen.

Vergelijkingen met één onbekende

De partitieformule van Euler

1 Rekenen in eindige precisie

Logica 1. Joost J. Joosten

Les B-08 Kunstmatige intelligentie en logica

Opdrachten Tarski s World

Kettingbreuken. 20 april K + 1 E + 1 T + 1 T + 1 I + 1 N + 1 G + 1 B + 1 R + 1 E + 1 U + 1 K + E + 1 N A + 1 P + 1 R + 1 I + 1

Complexiteit van berekeningen

Heron driehoek. 1 Wat is een Heron driehoek? De naam Heron ( Heroon) is bekend van de formule

Transcriptie:

Logica in actie H O O F D S T U K 5 Predikaatlogica en informatica Wanneer is een predikaatlogische formule waar? Om de gedachten te bepalen, beschouwen we nog eens de formule: x (P(x) y (P(y) y > x)) Wanneer P staat voor is priem, drukt deze formule uit dat er geen grootste priemgetal bestaat. Is deze formule waar? Wel, een kijkje in de getaltheorie leert dat er inderdaad geen grootste priemgetal is, en de formule zou dan dus waar zijn. Maar het is hier oppassen geblazen: deze waarheid steunt op het feit dat P staat voor de priemeigenschap, maar logisch gezien is er geen enkele reden waarom de formule zo opgevat moet worden. P kan net zo goed staan voor is een prijs in de trekking van de staatsloterij van 31 december 2008, en in die situatie zou de formule zeker niet waar zijn, want er is zeker een grootste prijs (de hoofdprijs). Met andere woorden, dat we volgens de vertaalsleutel geneigd zouden zijn een formule waar te noemen, is een neiging die we moeten onderdrukken. Dit is in feite niet anders dan bij de propositielogica: na de vertaling van een uitspraak, keken we ook los van die vertaalsleutel naar de omstandigheden waaronder een formule waar is. Maar omdat de predikaatlogica ontegenzeggelijk dichter bij de wiskunde (en bij de gewone taal, of zelfs het denken...) staat dan de propositielogica, is het bespeurde gevaar hier zeker niet denkbeeldig. In dit hoofdstuk gaan we, wat informeel, betekenis geven aan predikaatlogische formules door invoering van het begrip predikaatlogisch model, en op basis daarvan analyseren we ook logisch gevolg voor redeneren met objecten, predikaten en kwantoren. Als we dat alles eenmaal begrijpen, dan kunnen we ook laten zien hoe de predikaatlogica verrassende toepassingen kent in de studie van informatie en rekenen. We kunnen er gewoon informatief taalgebruik mee beschrijven over de wereld om ons heen zoals zij is, maar zelfs ook, veel minder voor de hand liggend, het gewenste gedrag van rekenprogrammaʹs in de informatica die doelbewust toestanden van een rekenautomaat veranderen. 1

5.1 Modellen voor de predikaatlogica Precies aangeven wanneer een formule waar is, is in de predikaatlogica minder eenvoudig dan in de propositielogica. Hoewel de waarheidstabellen van de connectieven nog steeds een rol spelen, kunnen we de waarheidswaarden van een formule niet in een overzichtelijke tabel weergeven. Dit komt omdat anders dan in de propositielogica in de predikaatlogica de waarheidswaarde van een formule niet altijd te berekenen is uit de waarheidswaarden van de deelformules. Wel kunnen we situaties aangeven waarin formules waar zijn. We illustreren dit aan de hand van een eenvoudig geval. VOORBEELD 5.1 De figuur hierna is een graaf: een verzameling objecten, namelijk a en b, met een binaire relatie daartussen. De atomaire formule R(a, b) is waar in een situatie als de met a en b aangeduide objecten in een relatie staan die met R overeenkomt. De (binaire) relatie R is met pijlen weergegeven. In dit geval is R(a, b) waar: er gaat een pijl van a naar b. Ook kunnen we kijken of samengestelde formules waar zijn in deze structuur: y R(a, y) is waar, want de keuze van b voor y voldoet. x R(x, x) is onwaar, want (a, a) behoort niet tot de pijlrelatie. y x R(x, y) is waar, want neem voor y eens b, dan gaat zowel van a als van b een pijl naar b. Er is een verschil tussen de objecten a en b in de figuur, waarvan we kunnen zien dat ze verschillen, en de constanten a en b in de logische taal, die best hetzelfde object zouden kunnen aanduiden. De constanten in de taal zijn de namen die we aan de objecten toekennen. (Net zoals in de propositielogica propositieletters proposities uitdrukken, en in de predikaatlogica predikaatsymbolen predikaten aangeven.) We hadden best a en b hetzelfde object kunnen laten aanduiden. Dit zou dan net als bij pseudoniemen zijn: Paul Haenen, Margreet Dolman en Dominee Gremdaat zijn namen voor dezelfde persoon. In de logica zijn constanten namen voor objecten, en hetzelfde object kan met verschillende namen worden aangeduid. Met connectieven kan nog steeds gerekend worden zoals in de propositielogica. Zo is in de situatie van voorbeeld 5.1 de formule R(a, b) R(b, b) waar, omdat R(a, b) en R(b, b) beide waar zijn, terwijl R(a, b) R(b, a) onwaar is: er gaat immers wel een pijl van a naar b, maar niet eentje van b naar a. Vervolgens kunnen we kwantoren en connectieven weer in formules combineren: y ( x R(x, y) R(y, y)) is waar in de situatie van voorbeeld 5.1, want als y = a, dan is x R(x, y) onwaar en dus de implicatie 2

waar, en als y = b, dan zijn x R(x, y) en R(y, y) beide waar en ook dan is de implicatie waar. Model Waarheid in een predikaatlogisch model VOORBEELD 5.2 Een situatie als in voorbeeld 5.1 heet in de logica een model. We kunnen deze notie zien als de generalisering van het begrip waardering in de propositielogica (en het is net als in de propositielogica gebruikelijk model relatief ten opzichte van een formule, of een verzameling formules, te gebruiken: een situatie is model van een formule als de formule daarin waar is). Een model bestaat uit een verzameling objecten waarop een aantal relaties en bewerkingen zijn gegeven die overeenkomen met de predikaaten functiesymbolen. Ook moeten we aangeven welk object uit de gegeven verzameling staat voor welke constante. We laten door middel van een aantal voorbeelden zien hoe modellen werken, en geven geen echte definitie. Een atomaire formule zoals R(a,b) is waar in een model als, gegeven de vertaalsleutel voor a, b en R, de met R in het model corresponderende relatie geldt tussen de in het model met a en b corresponderende objecten (en net zo voor variabele objecten x en y). Een formule x ϕ is waar als er een object in het model is zodat ϕ waar is als we de voorkomens van x in ϕ over dat object laten gaan. En een formule x ϕ is waar als dat voor alle objecten in het model zo is. De modellen waarin we predikaatlogica interpreteren kunnen heel abstract zijn maar ook tamelijk concreet. Beschouw bijvoorbeeld het model hierna. Dit is eigenlijk hetzelfde model als in voorbeeld 5.1. Alleen is het linkerobject hier Arch en het rechterobject Fonz. Maar Arch en Fonz hadden we net zo goed a en b kunnen noemen. De binaire relatie R(x, y) staat nu voor persoon x kent persoon y. De drie andere formules in voorbeeld 5.1 kunnen we nu ook een wat concretere interpretatie geven: y R(a, y): Arch kent iemand. Dit is waar, want Arch kent Fonz. x R(x, x): iedereen kent zichzelf. Dit is onwaar, want Arch kent zichzelf niet, alleen Fonz kent zichzelf. y x R(x, y): er is iemand die door iedereen gekend wordt. Dit is waar, want het gaat op voor Fonz. Wanneer er ook nog sprake is van een eenplaatsig predikaatsymbool P (een eigenschap), dan geven we behalve pijlen ook gebieden in het model aan (waarin de objecten liggen die de eigenschap hebben) of we markeren de punten die aan een bepaalde eigenschap voldoen afzonderlijk. 3

VOORBEELD 5.3 We gaan van een aantal formules na of ze waar of onwaar zijn in het model hierna. Dit model verbeeldt twee objecten, een eigenschap en een relatie. Object a heeft de eigenschap P, wat we aangeven met een open rondje, en de relatie {(a, a), (a, b)} komt met R overeen. x (P(x) R(x, x)) Dit is waar. Ken aan x a toe, dan zien we dat P(a) geldt (object a heeft de eigenschap P) en dat (a, a) R (de relatie R bestaat tussen a en zichzelf). x y R(x, y) Dit is onwaar. Ken aan x b toe. Er is geen uitgaande pijl van b (er is geen pijl van b naar b, en er is ook geen pijl van b naar a). Kennelijk is y R(x, y) onwaar als x gelijk aan b is. Het geldt dus niet voor alle x dat y R(x, y) waar is. Dus x y R(x, y) is eveneens onwaar. x (P(x) y R(x, y)) Dit is waar. We moeten iets aantonen voor alle x. Aan x kunnen we a toekennen, maar ook b. In het eerste geval heeft het object de eigenschap P, en moeten we laten zien dat er een y is zodat R(x, y). En die is er: ken b aan y toe. In het tweede geval geldt de implicatie omdat het object de eigenschap P niet heeft: P(b) is immers onwaar. x (R(x, x) (P(x) y (R(x, y) P(y)))) Dit is eveneens waar. U kunt zelf de verificatie uitvoeren. Het grappige is dat in deze vier formules a en b nergens genoemd worden, maar dat we er toch betekenis aan kunnen geven. Dit zien we vaak in de predikaatlogica. VOORBEELD 5.4 Ook in het geval van voorbeeld 5.3 kunnen we een iets beeldender interpretatie kiezen. Kijk maar eens naar figuur hierna, die verbeeldt dat: Arch heeft haar, Arch kent zichzelf, en Arch kent Fonz. De formules van voorbeeld 5.3 zijn hier natuurlijk eveneens waar/onwaar. Voor de interpretatie kunnen we bedenken (voor object nemen we nu gemakshalve man ): x (P(x) R(x, x)) Er is een behaarde man die zichzelf kent. Dit is waar: Arch. x y R(x, y) Iedereen kent iemand. Dit is onwaar. Fonz kent niemand. 4

x (P(x) y R(x, y)) Iedere behaarde man kent iemand. Dit is ook waar. Arch heeft haar en kent Fonz. x (R(x, x) (P(x) y (R(x, y) P(y)))) Iedereen met zelfkennis is behaard en kent een kale. Vervulbaar VOORBEELD 5.5 Tot nu gaven we een model en bekeken dan welke formules waar waren. Soms zijn we meer in een andere vraag geïnteresseerd: gegeven een formule, verzin een model dat deze formule waar (of juist onwaar) maakt. Als dit lukt, noemen we de formule vervulbaar. Dit gaat dus net als in de propositielogica: een formule is vervulbaar als ze een model heeft. De formule x y R(x, y) is waar in het model van voorbeeld 5.1 en onwaar in het model van voorbeeld 5.3. Voor de formule x y (R(x, y) R(x, x)) is het omgekeerde het geval: deze is onwaar in het model van voorbeeld 5.1 en waar in het model van voorbeeld 5.3. Ze is onwaar in het eerste model, want neem namelijk x = a en y = b, dan is R(a, b) R(a, a) onwaar. Maar ze is waar in het laatste model, want neem namelijk x = a dan zijn R(a, a) R(a, a) en R(a, b) R(a, a) beide waar en voor x = b zijn ook R(b, a) R(b, b) en R(b, b) R(b, b) beide waar. Beide formules zijn dus vervulbaar. Tot nu toe hebben we het alleen over modellen voor gesloten formules gehad. Wat te doen met vrije variabelen? Anders dan voor een constante, ligt de waarde van een (vrije) variabele niet vast door het model. Om te kunnen vaststellen of de formule in zo n geval waar is, moeten de waarden van de vrije variabelen expliciet worden aangegeven. Zo is P(x) y R(x, y) waar in het model van voorbeeld 5.3 als x = a, maar onwaar als x = b. VOORBEELD 5.6 Beschouw het volgende model. Het bestaat uit de getallen 2, 3, 4, en 5 met de kleiner dan relatie en de priemgetaleigenschap. De constanten 2, 3, 4, en 5 zijn gewoon door die getallen weergegeven. De eigenschap P staat voor priemgetal. Neem nu de formule x < 5 P(x). Deze is waar als x = 3, omdat 3 < 5 en 3 een priemgetal is. De formule is daarentegen onwaar als x = 4, omdat 4 < 5 maar 4 geen priemgetal is. Maar als x = 5 is de formule waar: 5 is immers niet (echt) kleiner dan 5. Voor de waarheid van de implicatie maakt het verder niet uit dat 5 een priemgetal is. VOORBEELD 5.7 Hoewel de nadruk tot zover heeft gelegen op eindige modellen, zijn ook oneindige modellen mogelijk. De verzameling van de natuurlijke getallen = {0, 1, 2, 3, 4,...} is het schoolvoorbeeld van een oneindige verzameling. 5

Vat in dit model het predikaatsymbool P op als de verzameling priemgetallen {2, 3, 5, 7, 11,...}, het predikaatsymbool E als de verzameling even natuurlijke getallen {0, 2, 4, 6, 8,...}, en de tweeplaatsige predikaatsymbolen > en als de groter dan relatie respectievelijk kleiner dan of gelijk relatie. Op dit model zijn bijvoorbeeld de volgende formules waar: x (E(x) y ((y > x) E(y))) x (P(x) y ((y > x) P(y))) Onwaar zijn: x (E(x) P(x)) x (P(x) P(x + 2)) Het functiesymbool + wordt hier opgevat als gewone optelling. Ten slotte zijn er nog formules waarvan de waarheid onbekend is, zoals het vermoeden van Goldbach: x ((E(x) x > 2) y z (P(y) P(z) x = y + z)) Zoals eerder gezegd staan we in de predikaatlogische taal ook uitdrukkingen als x + y toe als term. 5.2 Predikaatlogische wetten en logisch gevolg Net als voor de propositielogica kunnen we ook voor de predikaatlogica logisch gevolg en logische equivalentie definiëren met letterlijk dezelfde formuleringen als in hoofdstuk 3. We kunnen dan laten zien dat, bijvoorbeeld, alle vier de volgende formuleringen precies hetzelfde uitdrukken, namelijk dat er geen grootste priemgetal is (zie het voorbeeld aan het van dit hoofdstuk): x (P(x) y (P(y) y > x)) x y (P(x) (P(y) y > x)) x y ( P(x) (P(y) y > x)) x y ((P(x) P(y)) ((P(x) y > x)) Een voorbeeld van een algemene predikaatlogische wet, die we informeel inmiddels al wel toegepast hebben, is dat x ϕ equivalent is met x ϕ. Met zo n regel, en nog een variatie erop, kunnen we ook aantonen dat x y x < y, voor er is geen grootste getal, logisch equivalent is met de formule x y x y we gebruiken daarin tevens dat (x < y) equivalent is met x y. Met de notie van predikaatlogisch gevolg kunnen we formeel laten zien dat een eeuwenoude redenering inderdaad geldig is: 6

x (M(x) S(x)), M(s) S(s) Deze formule formaliseert de redenering Alle mensen zijn sterfelijk. Socrates is een mens. Dus Socrates is sterfelijk. Een volgend voorbeeld van een standaard predikaatlogisch gevolg is x y ϕ y x ϕ. Maar in de andere richting is dit nu juist ongeldig: neem bijvoorbeeld voor ϕ de atomaire formule y > x en als model de natuurlijke getallen, dan is y x x > y het geval want bij ieder natuurlijk getal is er nog een groter natuurlijk getal, bijvoorbeeld dat getal plus 1. Maar x y x > y is onwaar, want er is geen grootste natuurlijk getal. Dus y x ϕ / x y ϕ. 5.3 Correctheidsbeweringen We besluiten dit hoofdstuk met een wellicht verrassende toepassing. Logische systemen beschrijven niet alleen onveranderlijke situaties, zoals eeuwige wiskundige structuren, maar ze zijn ook heel geschikt om veranderingen te beschrijven, zowel informatieveranderingen (die in het volgende hoofdstuk aan bod komen) als feitelijke veranderingen in de wereld (waarbij de waardering van atomaire beweringen telkens verschuift). Een mooi en belangrijk voorbeeld daarvan zijn rekenprocessen, waarbij geheugentoestanden van een computer stapsgewijs veranderen door het uitvoeren van opeenvolgende instructies van een programmeur. Tijdens de uitvoering van een programma kan eerst de bewering x = 2 waar zijn, en op een later moment de bewering x = 3, zodat daarmee de bewering x = 2 onwaar moet zijn geworden. Kunnen we het gedrag van een computerprogramma systematisch onderzoeken, en is logica daarbij behulpzaam? De beschrijving van het gedrag van een programma bestaat uit stukken commentaar dat, net als het gewone commentaar dat de programmeur toevoegt, tussen accolades wordt gezet. We illustreren dit aan de hand van zogenaamde toekenningsopdrachten. In programmeertalen als Pascal of Java komen we eenvoudige opdrachten tegen als x := x + 1. Het effect van deze opdracht is dat de waarde van x met 1 verhoogd wordt. VOORBEELD 5.8 Als x eerst 3 was, dan is de waarde van x na het uitvoeren van de opdracht x := x + 1 gelijk aan 4. We noteren dit nu als: {x = 3} x := x + 1 {x = 4} Iets algemener: als x voor het uitvoeren van het programma de waarde a had, dan is x na afloop a + 1, kortom: {x = a} x := x + 1 {x = a + 1} 7

Correctheidsbewering VOORBEELD 5.9 Dit heet een correctheidsbewering; de stukken tussen de accolades worden wel specificaties genoemd: ze specificeren de toestanden van de computer. Die specificaties worden gegeven met predikaatlogische formules. Meestal doet het programma nog wel meer dan in de correctheidsbewering wordt vermeld daarin staat slechts datgene waarin we geïnteresseerd zijn. In het algemeen heeft een correctheidsbewering de vorm {ϕ} π {ψ}, waarbij ϕ en ψ formules van de predikaatlogica zijn en π (de Griekse letter pi ) een programma is. Zo n correctheidsbewering is dus juist, indien in alle gevallen waarin vóór het uitvoeren ϕ het geval is, het programma na uitvoeren in een toestand komt waarin ψ geldt. Wanneer het programma meerdere regels telt, zetten we de specificaties onder en boven het programma. Dit zien we in een volgend programma, waaraan we een kleine anekdote vooraf laten gaan. Stel Marie en Jan hebben op een feestje al een drankje op, Marie een whisky en Jan een berenburg. Ze lusten er nog wel eentje, maar per ongeluk verwisselt de gastheer voor het inschenken de glazen. Jan en Marie willen niet uit elkaars glas drinken. Kunnen we de inhoud van deze glazen verwisselen? Dat kan niet zonder meer, want als we de whisky bij de berenburg gieten, hebben we de drankjes vermengd, en dat was niet de bedoeling. Moeten we dan twee schone glazen pakken, of kan het met minder? Ja, het kan met slechts één extra glas: giet achtereenvolgens de whisky in het extra glas, dan de berenburg in het zojuist geleegde whiskyglas, en ten slotte de whisky in het lege berenburgglas. VOORBEELD 5.10 Eenzelfde truc kan bij het programmeren worden gebruikt om de waarden van twee variabelen om te wisselen: ook dan is een hulp variabele handig. z := x; x := y; y := z Het uitlijke effect van dit programmaatje kan nu als volgt gespecificeerd worden: {x = a, y = b} z := x; x := y; y := z {x = b, y = a} In de waarde van z zijn we niet geïnteresseerd. Aan het criterium voor een correctheidsbewering wordt voldaan: als x en y vooraf respectievelijk de 8

waarden a en b hebben, dan zijn die waarden achteraf inderdaad omgewisseld. De gegeven programmaspecificatie is daarom juist en het programma de correcte implementatie van deze specificatie. We kunnen de correctheidsbewering ook stapsgewijs opbouwen, en het programma op die manier controleren. Door per regel commentaar toe te voegen, kunnen we de juistheid van de correctheidsbewering hiervoor inzien. Om ruimte te besparen, schrijven we het effect van een programmaregel steeds achter de opdracht: {x = a, y = b} z := x; {x = a, y = b, z = a} x := y; {x = b, y = b, z = a} y := z {x = b, y = a, z = a} {x = b, y = a} VOORBEELD 5.11 Het volgende programma heeft niet hetzelfde omwisseleffect als dat van voorbeeld 5.10. x := y; y := x Wat gebeurt hier namelijk: eerst wordt de nieuwe waarde van x de oude waarde van y. Daarna wordt de nieuwe waarde van y de waarde die x inmiddels heeft aangenomen. Aangezien dat al de waarde van y was, verandert de waarde van y dus niet. Bij dit programma hoort de correctheidsbewering: {x = a, y = b} x := y; {x = b, y = b} y := x {x = b, y = b} {x = b, y = b} VOORBEELD 5.12 Hoewel het zeker makkelijk is een derde variabele te gebruiken om de waarden van twee andere variabelen te verwisselen, is dit strikt genomen niet nodig. Een programma dat slechts x en y als variabelen gebruikt en de waarden van x en y verwisselt is bijvoorbeeld: 9

x := x + y; y := x - y; x := x - y Stel x = 3 en y = 5. Eerst tellen we y bij x op: 3 + 5 = 8. Daarna trekken we (nog steeds de oude waarde van) y van deze nieuwe waarde van x af: 8 5 = 3. Dit is de oude waarde van x, die nu de waarde van y geworden is. Ten slotte trekken we de nieuwe waarde van y (dus de oude waarde van x) van de nieuwe waarde van x af: 8 3 = 5. Hiermee hebben we x dus de oude waarde van y gegeven, en we zijn klaar. Dit annoteren van programma s zou een tamelijk zinloze hobby zijn als het slechts commentaar over het effect van een programma zou inhouden; vaak zouden we dit commentaar net zo goed of zelfs beter in gewone taal kunnen geven. Maar de belangrijkste reden voor de informaticus C.A.R. Hoare om correctheidsbeweringen op te voeren, is dat men zich zo voor eens en altijd kan vergewissen van de juistheid van een programma. Hoare heeft namelijk een methode ontwikkeld om de correctheid van een programma te kunnen bewijzen. In deze methode leiden we correctheidsbeweringen van hele programma s af door de correctheidsbeweringen van opvolgende opdrachten aan elkaar te koppelen, zoals we bij de voorbeelden hiervoor al informeel hebben gedaan. Predikaatlogica en Tijdens de uitvoering van een computerprogramma speelt dus ten eerste programma een rol welke beweringen over de toekenning van waarden aan variabelen correctheid op een gegeven moment waar en onwaar zijn. Dit komt overeen met het bepalen van het predikaatlogisch model voor die gegeven situatie. Net iets anders dan de modeleliminatie uit paragraaf 3.3, waarbij in iedere stap het aantal modellen werd ingeperkt, is er nu zelfs sprake van echte verandering van modellen; maar het idee van sequentiële, achtereenvolgende update is gelijkgebleven. De correctheidsbewering zelf zegt als het ware iets over de logische gevolgen van bepaalde stappen tijdens welke programmaverwerking dan ook opnieuw een ons reeds bekende logische notie die in net iets andere vorm weer terugkeert. Zo zijn er verschillende manieren waarop programmacorrectheid stevig in de logica verankerd is. En eigenlijk is dat ook geen modieuze nieuwlichterij. Het samenbrengen van bewijzen en algoritmes is de moderne versie van de alleroudste traditie waarmee we dit boek begonnen: de meetkunde van Euclides, waar bewijzen en constructies van figuren hand in hand gingen. Uiteraard zijn er vele andere toepassingen van de logica in de informatica. Zo zouden we ook veel kunnen vertellen over de zogenaamde logische programmeertaal Prolog. Vanuit een abstracter gezichtspunt is een belangrijk overlappingsgebied de studie van de complexiteit van berekeningen. Hierover gaat hoofdstuk 7. 10

Samenvatting Voor het bepalen van de waarheidswaarde van een formule spelen in de predikaatlogica modellen dezelfde rol als waarderingen in de propositielogica. Een model is een structuur die bestaat uit een verzameling objecten waarop relaties (en in het bijzonder: eigenschappen) zijn gedefinieerd. De relaties komen overeen met de predikaatsymbolen van de formules waaraan we een waarheidswaarde willen toekennen. Objecten kennen we aan de constanten in de predikaatlogische taal toe. Verschillende constanten kunnen in een model hetzelfde object aanduiden, en een constante kan in verschillende modellen door verschillende objecten worden weergegeven. Voor variabelen kunnen we in een gegeven model verschillende waarden kiezen. Een formule x ϕ is waar als ϕ geldt voor elk object dat we aan x kunnen toekennen; x ϕ is waar als er ten minste één zo n object bestaat. Wiskundige talen weerspiegelen de (abstracte) realiteit zoals zij is, en de predikaatlogica past goed bij dit statische beeld. Maar dit systeem heeft ook een verrassend dynamisch aspect. Een informaticatoepassing van predikaatlogica is het gebruik van correctheidsbeweringen die het effect van een programma op logische wijze omschrijven. In het stapsgewijs annoteren van programma s met predikaatlogische formules die na zo n gegeven stap waar zijn, zien we het idee van modeleliminatie in enigszins andere vorm als modelverandering terugkomen. Dit document bevat hoofdstuk 5 van de cursus Logica in actie. De volledige cursus is beschikbaar op http://www.spinoza.ou.nl. Open Universiteit Nederland; Uitgeverij: Sdu Uitgevers, s Gravenhage. Dit materiaal is gelicentieerd onder een Creative Commons Licentie. Zie de licentie voor details. The content on this site is licensed under a Creative Commons Licentie. See licence for more details. 11

Opgaven OPGAVE 5.1 OPGAVE 5.2 OPGAVE 5.3 Stel we gebruiken het functiesymbool voor de bewerking aftrekken. Als E staat voor is even en P voor is een priemgetal, wat drukken de volgende formules dan uit? x ((E(x) x > 2) y (P(y) P(x y))) x (P(x) y (P(y) y x)) Beschouw de formule x y z ((R(x, y) R(y, z)) R(x, z)). Is deze formule waar in een model met de natuurlijke getallen als objecten, waarin R overeenkomt met de gewone kleiner dan relatie (<)? En in een model met dezelfde verzameling objecten, maar nu met de relatie D gedefinieerd door: D(x, y) precies dan als x y + 1? Is de formule waar in het model uit voorbeeld 5.1? Is de formule waar in elk model met precies twee objecten? Zo ja, bewijs dit, zo nee, geef een voorbeeld van een model met twee objecten waarop de formule niet waar is. Geef bij het volgende programma de specificaties die gelden na iedere opdracht. Wat is de specificatie die geldt na uitvoering van dit programma en wat is de correctheidsbewering? {x = a, y = b, z = c} u := x; x := y; y := z; z := u OPGAVE 5.4 Bewijs de correctheid van het volgende omwisselprogramma uit voorbeeld 5.12. {x = a, y = b} x := x + y; y := x - y; x := x - y {x = b, y = a} 12

Uitwerkingen van de opgaven bij hoofdstuk 5 5.1 E staat voor is even, P voor is een priemgetal, en voor aftrekken. De formule x ((E(x) x > 2) y (P(y) P(x y))) drukt uit voor alle even getallen x groter dan 2 is er een priemgetal y zodat x y eveneens priem is. Dit zegt met andere woorden dat alle even getallen groter dan twee de som zijn van twee priemgetallen: het vermoeden van Goldbach, zie voorbeeld 5.7. Het is dus niet bekend of dit waar is! De formule x (P(x) y (P(y) y x)) drukt uit er is geen priemgetal x zodat alle priemgetallen kleiner dan of gelijk zijn aan x. Met andere woorden: er is geen grootste priemgetal. En dit is waar. 5.2 Gegeven de formule x y z ((R(x, y) R(y, z)) R(x, z)). Natuurlijke getallen met R als <: ja, de formule is waar. Als k < m en m < n, dan zeker ook k < n, voor alle natuurlijke getallen k, m en n. Natuurlijke getallen met D gedefinieerd als D(x, y) precies dan als x y + 1 : nee, want kies maar x = 2, y = 1 en z = 0. Dan geldt D(2, 1) en D(1, 0), maar er geldt niet D(2, 0). Model uit voorbeeld 5.1: ja, er zijn dus zeker geen drie objecten nodig om de formule waar te laten zijn op een model! R(x, y) R(y, z) kan alleen maar waar zijn in twee gevallen: (i) x = a en y = z = b en (ii) x = y = z = b. In beide gevallen is dan ook R(x, z) waar, zodat de implicatie waar is, welke objecten we ook voor x, y en z kiezen. Elk model met precies twee objecten? Nee, een model met twee objecten waarop de formule onwaar is, is bijvoorbeeld: Dan behoren (a, b) en (b, a) wel tot de pijlrelatie, maar (a, a) niet. Dus kiezen we voor x en z object a, en voor y object b, dan is de implicatie onwaar. 5.3 We specificeren het programma regel voor regel. {x = a, y = b, z = c} u := x; {x = a, y = b, z = c, u = a} x := y; {x = b, y = b, z = c, u = a} y := z; {x = b, y = c, z = c, u = a} z := u {x = b, y = c, z = a, u = a} {x = b, y = c, z = a} We zien hier een zogenaamde cyclische permutatie van de waarden van x, y en z. 13

5.4 Stap voor stap de specificaties uitschrijven levert onderstaande, waarmee de correctheid is aangetoond. {x = a, y = b} {x = a, y = b} x := x + y; {x = a + b, y = b} y := x - y; {x = a + b, y = a} x := x - y {x = b, y = a} {x = b, y = a} 14