Programkonstruktion och datastrukturer. Formell verifiering eller hur man bevisar att program gör rätt utan att testa dem

Relevanta dokument
Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad

Summera godtyckligt antal tal. Programkonstruktion. Moment 4 Om rekursion. Fullständigt resonemang för summeringen. Analys av summeringsproblemet

Kontraktsprogrammering

Programkonstruktion. Tentamen,

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Programkonstruktion. Tentamen,

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Programkonstruktion. Tentamen,

Tentamen 1 (6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Programmeringsmetodik DV1, Programkonstruktion del 1 Tentamen,

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2011/12 moment 9 Sida 1 Uppdaterad

Övningshäfte 2: Induktion och rekursion

Algoritmer, datastrukturer och komplexitet

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Mängder. 1 Mängder. Grunder i matematik och logik (2015) 1.1 Grundläggande begrepp. 1.2 Beskrivningar av mängder. Marco Kuhlmann

Programkonstruktion och Datastrukturer

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 2 Introduktion till funktioner och programutveckling

Block 1 - Mängder och tal

DD1361 Programmeringsparadigm. Carina Edlund

SI-möte #10, Programkonstruktion och Datastrukturer

1. (a) Formulera vad som skall bevisas i basfallet och i induktionssteget i ett induktionsbevis av påståendet att. 4 5 n för alla n = 0, 1, 2, 3,...

Explorativ övning 7 KOMPLEXA TAL

Förra gången: Primitiva data

Block 1 - Mängder och tal

1. Inledning, som visar att man inte skall tro på allt man ser. Betrakta denna följd av tal, där varje tal är dubbelt så stort som närmast föregående

Tentamen i kurserna Beräkningsmodeller (TDA181/INN110) och Grundläggande Datalogi (TDA180)

Bakgrund. Bakgrund. Bakgrund. Håkan Jonsson Institutionen för systemteknik Luleå tekniska universitet Luleå, Sverige

Programkonstruktion och Datastrukturer, lektion 7

DD1350 Logik för dataloger. Fö 7 Predikatlogikens semantik

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

"Referentiell transparens"

Former av rekursion. Programkonstruktion. Moment 5 Mera om rekursion. Fakultetsfunktionen. Största gemensamma delare (repris!

2 (6) k 0 2 (7) n 1 F k F n. k F k F n F k F n F n 1 2 (8)

Kvalificeringstävling den 30 september 2008

Föreläsning 2 Programmeringsteknik och C DD1316

Algebra I, 1MA004. Lektionsplanering

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Programspråk. Programkonstruktion. Moment 1 Introduktion till programmering och programspråket Standard ML. Användning av funktionell programmering

Induktionsprincipen Starka induktionsprincipen Välordningsprincipen Divisionsalgoritmen

INDUKTION OCH DEDUKTION

Programkonstruktion och datastrukturer. Moment 5 Om generella datastrukturer och träd. PKD 2011/12 moment 5 Sida 1 Uppdaterad

Läsanvisning till Discrete matematics av Norman Biggs - 5B1118 Diskret matematik

Pascal... Pascal. Pascal... Pascal...

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

KTHs Matematiska Cirkel. Reella tal. Joakim Arnlind Tomas Ekholm Andreas Enblom

Övningshäfte 6: 2. Alla formler är inte oberoende av varandra. Försök att härleda ett par av de formler du fann ur några av de övriga.

Uppsala Universitet Matematiska Institutionen Bo Styf. Sammanfattning av föreläsningarna 11-14, 16/11-28/

Övningsuppgifter #11, Programkonstruktion och datastrukturer

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Återanvändning av kod? Programkonstruktion. Moment 2 Introduktion till funktioner och programutveckling. Funktionsdefinitioner. Egna funktioner i ML

LMA033/LMA515. Fredrik Lindgren. 4 september 2013

Logik och kontrollstrukturer

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

Övningshäfte 1: Induktion, rekursion och summor

Övning log, algebra, potenser med mera

Kontrakt baserad design. Design by contract

Föreläsning 5: Kardinalitet. Funktioners tillväxt

Utvidgad aritmetik. AU

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Kontinuitet och gränsvärden

Programmering A. Johan Eliasson

Pythons standardbibliotek

Programmering = modellering

(N) och mängden av heltal (Z); objekten i en mängd behöver dock inte vara tal. De objekt som ingår i en mängd kallas för mängdens element.

Lektion 1. Förenklingar. Valentina Chapovalova. vårterminen IT-Gymnasiet. Valentina Chapovalova Lektion 1

Programmering II (ID1019) :00-11:00

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Hur man skriver matematik

Explorativ övning 5 MATEMATISK INDUKTION

DD1314 Programmeringsteknik

inte följa någon enkel eller fiffig princip, vad man nu skulle mena med det. All right, men

Föreläsning 9: Talteori

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Procedurer och villkor

Modul 3 - Modularisering

LOGIK, MÄNGDER OCH FUNKTIONER

Algoritmer och interaktiv Python

Introduktion till programmering SMD180. Föreläsning 8: Listor

Programkonstruktion och datastrukturer

PASS 2. POTENSRÄKNING. 2.1 Definition av en potens

Tentamen i kurserna Beräkningsmodeller (TDA181/INN110) och Grundläggande Datalogi (TDA180)

Något om medelvärden

Föreläsning 3-4 Innehåll

Algoritmer, datastrukturer och komplexitet

Vektorgeometri för gymnasister

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Föreläsning 9: Talteori

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Extra övningar på SDD:er/SDT:er

Formell Verifiering. Hur vet man att ett system fungerar korrekt? Lisa Kaati

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 9 Om högre ordningens funktioner. PK1&PM1 HT-06 moment 9 Sida 1 Uppdaterad

Explorativ övning 5 MATEMATISK INDUKTION

Transkript:

Programkonstruktion och datastrukturer Formell verifiering eller hur man bevisar att program gör rätt utan att testa dem PKD 2012/13 Formell verifiering Sida 1 Uppdaterad 2008-11-28

Formell verifiering: Idé Skriv för- och eftervillkoren som matematiska uttryck (den formella specifikationen). Ge en matematisk tolkning av programmet (programmets formella semantik). Bevisa matematiskt att under antagandet att förvillkoret gäller (och att argumenten har typer som ges av MLs typkontroll) så är eftervillkoret lika med den matematiska tolkningen av programmet. Ett sådant bevis garanterar att programmet alltid uppfyller eftervillkoret dvs det gör alltid rätt. Förutsättningar: Den formella specifikationen är riktigt uttryckt, den formella semantiken är riktig, våra bevis är riktiga... PKD 2012/13 Formell verifiering Sida 2 Uppdaterad 2008-11-28

Programspråksemantik Vi antar att det finns en (matematisk) funktion från program till matematiska objekt (t.ex. tal, mängder etc.). Funktionen skrivs [[ ]]. T.ex. gäller [[size "abcd"]] = 4. Definitionen av [[ ]] beskriver innebörden av programspråket. Jag använder en begränsad del av ML (t.ex. utan matchning) för att hålla nere storleken på semantiken. Allt som skrivs mellan [[ och ]] är programkod. Allt som skrivs utanför [[...]] är matematik. Exempel: I uttrycket [[3+5]]+7 är plustecknet mellan [[ ]] en MLoperator, medan plustecknet utanför är den matematiska operationen addition. PKD 2012/13 Formell verifiering Sida 3 Uppdaterad 2008-11-28

Semantik för en del av ML [[if B then E1 else E2]] = [[E1]] om [[B]] = true [[if B then E1 else E2]] = [[E2]] om [[B]] = false [[E1+E2]] = [[E1]]+[[E2]], etc. för andra räkneoperationer [[E1=E2]] = true om [[E1]]=[[E2]] [[E1=E2]] = false om [[E1]] [[E2]] [[E1>E2]] = true om [[E1]]>[[E2]] [[E1>E2]] = false om [[E1]] [[E2]] [[F A]] = [[F]]([[A]]) En funktionsdefinition fun F A = E utvidgar definitionen av [[ ]] med ekvationen [[F]](A) = [[E]] (Här antas B, E1, etc. vara godtyckliga deluttryck.) PKD 2012/13 Formell verifiering Sida 4 Uppdaterad 2008-11-28

En konvention Om samma identifierare förekommer både innanför och utanför [[ ]] så förutsätter vi att de betecknar samma värde innanför [[ ]] som ett ML-värde, utanför [[ ]] som ett matematiskt objekt. Exempel: Det gäller alltid att [[x]]=x, om x är ett tal. Antag att x=3. I så fall gäller [[x+1]]=4. Detta kan synas självklart men identifierare i programkoden och matematiska variabler är helt olika saker. Det hela är matematiskt rätt intrikat och man kan egentligen inte göra det så lättvindigt som det verkar här. Skall man göra det riktigt så krävs en hel del matematisk apparatur som inte tillför något i den här föreläsningen. Jag kommer alltså att förbigå problemet i tysthet... PKD 2012/13 Formell verifiering Sida 5 Uppdaterad 2008-11-28

Exempel på användning av semantik fun sign x = if x=0 then 0 else if x>0 then 1 else ~1 Detta ger ekvationen [[sign]](x) = [[if x=0 then 0 else if x>0 then 1 else ~1]] Vad ger semantiken för värde till programmet sign(2)+3? [[sign(2)+3]] = [[sign(2)]]+[[3]] = [[sign]]([[2]])+3 = [[if 2=0 then 0 else if 2>0 then 1 else ~1]])+3 = [[if 2>0 then 1 else ~1]])+3 (ty [[2=0]]=false om [[2]] [[0]]) = [[1]]+3 (ty [[2>0]]=true om [[2]]>[[0]]) = 1+3 = 4 PKD 2012/13 Formell verifiering Sida 6 Uppdaterad 2008-11-28

Räkna ut potenser av heltal (* exp(n,e) TYPE: int*int->int PRE: e 0, n>0 POST: n e EXAMPLE: exp(2,3) = 8 *) (* VARIANT: e *) fun exp(n,e) = if e = 0 then 1 else n * exp(n,e-1) Funktionen beräknar potenser genom upprepad multiplikation. Under antagande att funktionsdefinitionen finns och att n,e Z (typvillkor) samt e 0 och n > 0 (förvillkor) skall bevisas att [[exp(n,e)]] = n e (eftervillkor) PKD 2012/13 Formell verifiering Sida 7 Uppdaterad 2008-11-28

Början på beviset Funktionsdefinitionen ger ekvationen: [[exp]](n,e) = [[if e=0 then 1 else n*exp(n,e-1)]] Ifrån typvillkoret e Z och förvillkoret e 0, får vi e N. Välj ett godtyckligt n och bevisa [[exp]](n,e) = n e med induktion över e. Basfall: Antag e = 0. [[exp]](n,e) = [[exp]](n,0) = [[if 0=0 then 1 else n*exp(n,0-1)]] = 1 (eftersom [[0=0]] = true) = n 0 (egenskap hos potenser då n>0 förvillkor) = n e (eftersom e = 0) PKD 2012/13 Formell verifiering Sida 8 Uppdaterad 2008-11-28

Induktionsfallet Funktionsdefinitionen ger ekvationen: [[exp]](n,e) = [[if e=0 then 1 else n*exp(n,e-1)]] Induktionsfall: För godtyckligt e N antar vi [[exp]](n,e) = n e och skall visa [[exp]](n,e+1) = n e+1. [[exp]](n,e+1) = [[if e+1=0 then 1 else n*exp(n,e+1-1)]] = [[n*exp(n,e+1-1)]] (eftersom [[e+1=0]] = false om e 0) = [[n*exp(n,e+1-1)]] = n [[exp(n,e+1-1)]] = n [[exp]]([[n]],[[e+1-1]]) = n [[exp]](n,e+1-1) = n [[exp]](n,e) = n n e (induktionshypotes) = n e+1. Alltså gäller [[exp]](n,e) = n e för alla e N. QED! PKD 2012/13 Formell verifiering Sida 9 Uppdaterad 2008-11-28

Ett bättre program (* exp(n,e) TYPE: int*int->int PRE: e 0, n>0 POST: n e EXAMPLE: exp(2,3) = 8 *) (* VARIANT: e *) fun exp(n,e) = if e = 0 then 1 else if e mod 2 = 0 then exp(n*n,e div 2) else n * exp(n*n,e div 2) Hur fungerar denna funktion? På vilket sätt är den bättre? Samma antaganden från typer och förvillkor som med förra exp, men bevis genom fullständig induktion. PKD 2012/13 Formell verifiering Sida 10 Uppdaterad 2008-11-28

Bevis Bevisa [[exp]](n,e) = n e med fullständig induktion över e. Induktionshypotes: (n omdöpt för att undvika namnkonflikter senare) [[exp]](n,e ) = n e för alla e < e, n > 0 och n,e N. Eftersom e Z (typvillkor) och e 0 (förvillkor) vet vi att e N. Vi delar upp beviset i tre fall motsvarande de tre alternativen ifuttrycken ger. Fall 1: e = 0. Fall 2a: e > 0 och e jämn. Fall 2b: e > 0 och e udda. Eftersom e N täcker dessa fall alla värden på e! PKD 2012/13 Formell verifiering Sida 11 Uppdaterad 2008-11-28

Fall 1 Funktionsdefinitionen ger ekvationen: [[exp]](n,e) = [[if e = 0 then 1 else if e mod 2 = 0 then exp(n*n,e div 2) else n * exp(n*n,e div 2)]] Fall 1: Antag e = 0. [[exp]](n,e) = [[exp]](n,0) = [[if 0=0 then 1 else ]] = 1 (eftersom [[0=0]] = true) = n 0 (egenskap hos potenser då n>0 förvillkor) = n e (eftersom e = 0) Fall 1 klart! PKD 2012/13 Formell verifiering Sida 12 Uppdaterad 2008-11-28

Fall 2a Funktionsdefinitionen ger ekvationen: [[exp]](n,e) = [[if e = 0 then 1 else if e mod 2 = 0 then exp(n*n,e div 2) else n * exp(n*n,e div 2)]] Fall 2a. Antag e > 0 och e jämn. Eftersom e jämn är [[e mod 2]] = 0 [[exp]](n,e) = [[if e = 0 then 1 else ]] = [[if e mod 2 = 0 then ]] (ty e > 0) = [[exp(n*n,e div 2)]] (ty [[e mod 2]] = 0) = [[exp]]([[n*n]],[[e div 2]]) = [[exp]](n n,e/2) (eftersom [[e div 2]]=e/2 om e jämn) = (fortsätter) PKD 2012/13 Formell verifiering Sida 13 Uppdaterad 2008-11-28

Induktionshypotes: Fall 2a (induktionshypotes) [[exp]](n,e ) = n e för alla e < e, n > 0 och n,e N. Eftersom e>0 är e/2<e, eftersom e jämn gäller e/2 N. Eftersom n>0 är n n>0, eftersom n N (visat förut) gäller n n N. Alltså är induktionshypotesen tillämplig med e =e/2 och n =n n. = [[exp]](n n,e/2)]] = (n n) e/2 (induktionshypotesen!) = n e. Fall 2a klart! PKD 2012/13 Formell verifiering Sida 14 Uppdaterad 2008-11-28

Fall 2b Funktionsdefinitionen ger ekvationen: [[exp]](n,e) = [[if e = 0 then 1 else if e mod 2 = 0 then exp(n*n,e div 2) else n * exp(n*n,e div 2)]] Fall 2b. Antag e > 0 och e udda. Eftersom e udda är [[e mod 2]] = 1 [[exp]](n,e) = [[if e = 0 then 1 else ]] = [[if e mod 2 = 0 then ]] (ty e > 0) = [[n*exp(n*n,e div 2)]] (ty [[e mod 2]] = 1) = n [[exp(n*n,e div 2)]] = n ([[exp]]([[n*n]],[[e div 2]])) = n ([[exp]](n n,(e-1)/2)) (eftersom [[e div 2]]=(e-1)/2 om e udda) = (fortsätter) PKD 2012/13 Formell verifiering Sida 15 Uppdaterad 2008-11-28

Induktionshypotes: Fall 2b (induktionshypotes) [[exp]](n,e ) = n e för alla e < e, n > 0 och n,e N. Eftersom e>0 är (e-1)/2<e, eftersom e udda gäller (e-1)/2 N. Eftersom n>0 är n n>0, eftersom n N (visat förut) gäller n n N. Alltså är induktionshypotesen tillämplig med e =(e-1)/2 och n =n n. = n ([[exp]](n n,(e-1)/2)) = n (n n) (e-1)/2 (induktionshypotesen!) = n n e-1 = n e. Fall 2b och hela beviset klart. QED! (QED = quod erat demonstrandum vilket skulle bevisas) PKD 2012/13 Formell verifiering Sida 16 Uppdaterad 2008-11-28

Andra typer av data Program som behandlar andra typer av data (t.ex. tupler, strängar, listor) kan också verifieras om man på lämpligt sätt kan beskriva dem matematiskt. En sträng s kan t.ex. beskrivas som en funktion från naturliga tal mindre än strängens längd till teckenkoder. Exempel. "Hej" kan beskrivas matematiskt som en funktion f, definierad som f(0) = 72, f(1) = 101, f(2) = 106, i övrigt odefinierad. Bevis med sådana data uppfattas ofta som svåra eftersom vi inte är vana vid räknereglerna för sådana matematiska objekt För vanliga tal tillämpar vi regler som n n e-1 =n e, x y = y x eller x (y+z) = x y+x z utan att tänka på det, men man måste lära sig t.ex. att för strängar gäller [[size(x^y)]]=[[size(y^x)]] och [[size(x^y)]]=[[size x]]+[[size y]] PKD 2012/13 Formell verifiering Sida 17 Uppdaterad 2008-11-28