Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

FEN 2013-05-01KbP/seminar2: LoopsReview1 Kontraktbaseret programmering Seminar 2 Udvikling af løkker: Checklisten for løkker “Hånd-i-hånd” udvikling.

Lignende præsentationer


Præsentationer af emnet: "FEN 2013-05-01KbP/seminar2: LoopsReview1 Kontraktbaseret programmering Seminar 2 Udvikling af løkker: Checklisten for løkker “Hånd-i-hånd” udvikling."— Præsentationens transcript:

1 FEN 2013-05-01KbP/seminar2: LoopsReview1 Kontraktbaseret programmering Seminar 2 Udvikling af løkker: Checklisten for løkker “Hånd-i-hånd” udvikling

2 FEN 2013-05-01KbP/seminar2: LoopsReview2 Udvikling af løkker Loop-struktur: {Q} S 0 do {P} B  S od {R} Checklisten: 1. {Q} S 0 {P} (initiering) 2. {P  B} S {P}(bevarelse af invariant) 3. terminering af løkken(t: nedadtil begrænset - termineringsfunktion) 4. P   B  R(korrekthed)

3 FEN 2013-05-01KbP/seminar2: LoopsReview3 Vi står med Q og R, og skal skrive en løkke: Vi skal udvikle: invarianten P vagten B “programmerne” S 0 og S Beviset er vores guide: Checklisten giver os: Find P og B ud fra: P   B  R (pkt. 4) Find initiering, så P etableres ({Q} S 0 {P}) (pkt. 1) Find et termineringsudtryk og sætninger, så der tages skridt mod terminering. (pkt. 3) Hermed brydes invarianten måske, i så fald findes sætninger som genetablerer invarianten: {P  B} S {P} (pkt. 2) {Q} S 0 do {P} B  S od {R} Checklisten: 1. {Q} S 0 {P} (initiering) 2. {P  B} S {P}(bevarelse af invariant) 3. terminering af løkken (t: nedadtil begrænset - termineringsfunktion) 4. P   B  R(korrekthed)

4 FEN 2013-05-01KbP/seminar2: LoopsReview4 Udledning af invarianten fra postbetingelsen ”Ballon-teorien” (Gries 1981) Tilstandene, som tilfredsstiller P, er den oppustede ballon. Ballonen pustes op ved at afsvække R. Termineringsudtrykket er ventilen, som lukker luft ud af ballonen. Når al luft er ude af ballonen, så er sluttilstanden R nået. Hver iteration lukker lidt luft ud af P, som igen nærmer sig R mere og mere. Terminating State R er sand Invariant P Skal omfatte alle tilstande, som tilfredsstiller Q og R IS: Initial State Q er sand og S 0 er udført IS: Initial State Q er sand og S 0 er udført Terminating State R er sand

5 FEN 2013-05-01KbP/seminar2: LoopsReview5 Afsvækkelse af postbetingelsen P kan findes ved passende afsvækkelse af R: –Slet en konjunkt –Erstat en konstant med en variabel –(Udvid værdimængden for en variabel) –(Tilføje en disjunkt) Kun de tre første er praktisk interessante, og vi begrænser os til de to første. Eller er det en adjunkt?

6 FEN 2013-05-01KbP/seminar2: LoopsReview6 Afsvækkelse af postbetingelsen Figur fjernet pga. Copyright (fra Meyer 1990)

7 FEN 2013-05-01KbP/seminar2: LoopsReview7 Slet en konjunkt Eksempel: Lineær søgning. Omgivelse: [var N: int; b:array [0..N) of int; i, x: int;] Ramme: i:[N>0  x  b[0..N), 0  i  N  (  j| 0  j < i: x  b[j])  x=b[i]]

8 FEN 2013-05-01KbP/seminar2: LoopsReview8 Slet en konjunkt i R: 0  i  N  (  j| 0  j < i: x  b[j])  x=b[i] Hvilken skal slettes? Slet den der er sværest at etablere initialt: - pkt. 4 og 1 x=b[i] Negation heraf anvendes som vagt: - pkt. 4 x  b[i] Etabler invarianten initialt: - pkt. 1 i:=0 Checklisten: 1. {Q} S 0 {P} 2. {P  B} S {P} 3. terminering af løkken 4. P   B  R {Q} S 0 do {P} B  S od {R}

9 FEN 2013-05-01KbP/seminar2: LoopsReview9 Vi har nu: i:=0; do {0  i  N  (  j| 0  j < i: x  b[j])} x  b[i]  S od Det ses, at t= N-i er en passende termineringsfunktion. Vi mangler at bestemme S: Invarianten skal bevares, og der skal tages skridt mod terminering. Begge dele opnås ved S:i:= i+1 Pre-betingelsen siger, at x findes i arrayet, invarianten at x ikke findes i den allerede undersøgte del, så på et eller andet tidspunkt vil vi møde x og terminere. {Q} S 0 do {P} B  S od {R} Checklisten: 1. {Q} S 0 {P} 2. {P  B} S {P} 3. terminering af løkken 4. P   B  R

10 FEN 2013-05-01KbP/seminar2: LoopsReview10 Programmet bliver: {N>0  x  b[0..N)} i:=0; do {0  i  N  (  j| 0  j < i: x  b[j])} x  b[i]  i:= i+1 od {0  i  N  (  j| 0  j < i: x  b[j])  x=b[i]} {Q} S 0 do {P} B  S od {R} Checklisten: 1. {Q} S 0 {P} 2. {P  B} S {P} 3. terminering af løkken 4. P   B  R Korrekthed?

11 FEN 2013-05-01KbP/seminar2: LoopsReview11 Erstat en konstant med en variabel. Eksempel: Summering af elementerne i et array. Ramme:sum:[N>0, sum=(  j| 0  j<N : b[j])] Vi kan afsvække postbetingelsen ved at erstatte konstanten N med variablen n og tilføje en begrænsning på n. Invarianten bliver: sum = (  j | 0  j<n : b[j])  0  n  N Vagten findes udfra kravet P  ¬B  R. Dvs. hvad mangler P i at medføre R? (n=N): B: n  N Vi skal finde en initialisering af sum og n, som etablerer invarianten: sum, n := 0, 0 {Q} S 0 do {P} B  S od {R} Checklisten: 1. {Q} S 0 {P} 2. {P  B} S {P} 3. terminering af løkken 4. P   B  R

12 FEN 2013-05-01KbP/seminar2: LoopsReview12 Hermed har vi følgende skabelon for løkken: n, sum := 0, 0; do {0  n  N  sum = (  j | 0  j<n : b[j])} n  N  S(?) od Begrænsningsfunktionen må være t= N-n. Skridt mod terminering sikres ved kommandoen n:= n+1: n, sum := 0, 0; do {0  n  N  sum = (  j | 0  j<n : b[j])} n  N  (?) n:= n+1 od {Q} S 0 do {P} B  S od {R} Checklisten: 1. {Q} S 0 {P} 2. {P  B} S {P} 3. terminering af løkken 4. P   B  R

13 FEN 2013-05-01KbP/seminar2: LoopsReview13 Invarianten skal bevares. Sum skal være summen af elementerne op til n. Når n tælles op, så må summen forøges med næste element. Det færdige loop: n, sum := 0, 0; do {0  n  N  sum = (  j | 0  j<n : b[j])} n  N  n, sum:= n+1, sum+b[n] od {Q} S 0 do {P} B  S od {R} Checklisten: 1. {Q} S 0 {P} 2. {P  B} S {P} 3. terminering af løkken 4. P   B  R

14 FEN 2013-05-01KbP/seminar2: LoopsReview14 Afsvækkelse af postbetingelsen Figur fjernet pga. Copyright (fra Meyer 1990)

15 FEN 2013-05-01KbP/seminar2: LoopsReview15 Øvelser Udvikl programmet til summering af et array ved at erstatte konstanten 0 med en variabel i stedet for konstanten N. Udvikl en algoritme med følgende specifikation: OddCount:[N: int; b: array[0..N) of int; r: int; r: [N  0, r = (#i | 0  i<N : Odd(b[i]))] ] Udled invarianten ved at erstatte konstanten N med en variabel Udvikl en algoritme til bestemmelse af heltalsapproksimationen af kvadratroden af et heltal. Specifikation: SquareRootAppr:|[ n, r: int; r : [n  0, 0  r 2  n < (r+1) 2 ] ]| Vink: Find en invariant ved at slette en konjunkt. {Q} S 0 do {P} B  S od {R} Checklisten: 1. {Q} S 0 {P} 2. {P  B} S {P} 3. terminering af løkken 4. P   B  R

16 FEN 2013-05-01KbP/seminar2: LoopsReview16 JML /*@ requires n>=0; @ ensures \result>=0 && (\result)*(\result) <= n @ && n < (\result + 1)*(\result + 1); @*/ public static int root(int n) { int r= 0; while(n>=(r+1)*(r+1)) { r++; } return r; }

17 FEN 2013-05-01KbP/seminar2: LoopsReview17 Andre opgaver: Øvelser uge 2: –AllZeros –Bin2Dec –JML


Download ppt "FEN 2013-05-01KbP/seminar2: LoopsReview1 Kontraktbaseret programmering Seminar 2 Udvikling af løkker: Checklisten for løkker “Hånd-i-hånd” udvikling."

Lignende præsentationer


Annoncer fra Google