1 / 12

Programmu korektība II

Programmu korektība II. Datorzinātnes pamati. Daļējā un pilnā korektība: atkārtojums.

terri
Télécharger la présentation

Programmu korektība II

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programmu korektība II Datorzinātnes pamati

  2. Daļējā un pilnā korektība: atkārtojums Matemātiski precīzi: programma P  Prog(programmas darbību uzdod ar dabisko un/vai operacionālo semantiku) specifikācija S  Spec, (specifikācija ir predikātu pārisp, q , kurp, q – loģiskas formulas noteiktā valodā (pirmās kārtas predikātu loģika), kas var saturēt programmas mainīgos) atbilstības attiecība: Sat  Prog  Spec (daļējās un pilnās korektības jēdzieni). Definīcija: Programma c ir daļēji korekta attiecībā pret specifikāciju p, q, ja katrai funkcijai I no ,I p un c,    ’ seko, ka ’,I q (ja p bija spēkā pirms programmas izpildes, tad q būs spēkā pēc tās). I : Params  Z, funkcija, kas piešķir katram loģiskajam mainīgajam veselu vērtību. Definīcija:,I , ja   [(x1) / x1, … (xn) / xn , I(X1) / X1, … I(Xm) / Xm ] , kurx1, …xn ir visi apgalvojumā  sastopamie programmas mainīgie un X1, …Xm ir visi apgalvojumā  sastopamie loģiskie mainīgie . Pilnā korektība determinētām programmām: (I: Params  Z)ja,I p , tad eksistē’ , kamc,    ’un’,I q Pilnā korektība (vispārīgais gadījums):Ija,I p , tad (,I (c) un katram ’, jac,    ’,tad’,I q ).

  3. Daļējās korektības pierādījumi: Hoara loģika c ir daļēji korekts pret p,q : rakstām {p} c {q} Aksiomu sistēma{ p } c { q } tipa apgalvojumu pierādīšanai dažādiem c un dažādiem p,q: Aksiomas daļējai korektībai (Hoara loģika): 1. {p} skip {p} 2. {q [e/x]} x := e {q} Piemērs: { x + 3 = 16 } x := x + 3 { x = 16 } q [e/x] – formulā q visas x ieiešanas vietas aizstātas ar e (sintaktiski) 3.Ja {p} c1 {r} un {r} c2 {q},tad {p} c1; c2 {q}. 4.Ja {pb} c1 {q} un {p b} c2 {q}, tad {p} if b then c1 else c2 fi {q} 5.Ja {rb} c1 {r},tad {r} while b do c1 od {rb} r – cikla invariants 6.Ja p  p’, {p’} c {q’} un q’  q, tad {p} c {q} 5a.Ja p  r, {rb} c1 {r}, un rb  q, tad {p} while b do c1 od {q} 2a.Ja p  q [e/x], tad {p} x := e {q}. Kā veidot pierādījumus, izmantojot šīs aksiomas?

  4. Kā veikt pierādījumus: atkārtojums {n = N  0  m = M  0}s:=0; while (m>0) do s := s+n; m := m-1 od {s = M*N} Kā pierādīt? 1) Atrast ciklu invariantus: 5a.Ja(1) p  r, (2) { rb } c1 { r }, un(3) rb  q, tad {p} while b do c1 od {q} Radošais darbs: cikla invarianta r atrašana. Saturiski – atrast apgalvojumu r, kas labi un pilnīgi raksturo sakarību starp programmas mainīgajiem visā cikla izpildes laikā. Labi raksturo: spēkā (1) – r spēkā programmai pirmo reizi nonākot uz ciklu un (2) – r patiesums saglabājas katru reizi, kad programma iziet cauri ciklam (apgalvojums 2 = 2, vai x = x labi raksturo katru ciklu …) Pilnīgi raksturo: spēkā (3) – programmai izejot no cikla, varēsim garantēt, ka q spēkā. Intuīcija: atrast r, kas spēkā vienmēr pirms un pēc cikla, un kas atļauj secināt (3). {n = N  0  m = M  0}s:=0; while {r-?} (m>0) do s := s+n; m := m-1 od {s = M*N} Piedāvājums: r  [ (n = N  m  0  s = n * (M - m) ](a) Ja kāds mainīgais nemainās programmas izpildes laikā, to iekļaujam r(b) Ja kādam mainīgajam varam konstatēt maiņas intervālu, to iekļaujam r(c) Mēģinām atrast, kāda ir ciklu raksturojošā sakarība (var domāt – ja būtu pašiem jāpierāda ar indukciju, ka beigu apgalvojums spēkā: kāda būtu induktīvā pāreja?)

  5. s:=0 ; while (m>0) do s := s+n ; m := m-1 od c0 c c1 c3 r  (m>0)  r1 [ s+n / s ] r1  r [ m-1 / m ] c4 c2 { r  (m>0) } c3 { r1 } { r1 } c4 { r } p  p1 [ 0 / s ] p1  r { r  (m>0) } c2 { r } r  (m>0)  q { p } c0 { p1 } { p1 } c1 { q } { p } c { q } Kā veikt pierādījumus? {n = N  0  m = M  0}s:=0; while (m>0) do s := s+n; m := m-1 od {s = M*N} Kā pierādīt? 2) Noformēt pierādījumu. Apzīmējam: p  [ n = N  0  m = M  0 ] q  [ s = M * N ] r  [ n = N  0  m  0  s = n * (M - m) ] p1  p  ( s = 0 ) (spēkā pēc c0 izpildes) r1  r [ m-1 / m ]  n = N  0  m-1  0  s = n * (M – (m-1)) (izveidots tā, lai būtu spēkā pēc c3 izpildes katrā ciklā) 5a.: Ja(1) p  r, (2) { rb } c1 { r }, un(3) rb  q, tad {p} while b do c1 od {q}

  6. Kā veikt pierādījumus? r == (z * n! = N!  n >= 0) r == (gcd(x,y) = gcd(X,Y)  x>0  y>0) r == (X = k*Y+z  0<=z  y=Y>=0) r == (z * xy = XY  y>=0) “Radošais” darbs – atrast ciklu invariantus. Kādus apgalvojumus varam likt r vietā? {n = N  1} z:=1; while {r-?} (n>0) do z := z*n; n := n-1 od {z = N!} {x = X > 0  y = Y > 0} while {r-?} not(x=y) do if x<y then y := y-x else x := x-y fi od {x = y = gcd(X,Y)} {x = X  0  y = Y  0} z := x; k := 0; while {r-?} z >= y do z := z-y; k := k+1 od {X = k*Y+z  0  z < Y} {x = X  0  y = Y  0} z := 1; while {r-?} y>0 do if even(y) then x := x*x; y := y/2 else z := z*x; y := y-1 fi od {z = XY}

  7. Pilnās korektības pierādījumi: cikla varianti Pilnā korektība: I : ja,I p , tad eksistē’ , kamc,    ’un’,I q c ir pilnā nozīmē korekts pret p,q : rakstām p c q Pilnā korektība = daļējā korektība + garantēta apstāšanās Apstāšanās:definētas visas izteiksmes (programma neizdod kļūdu izteiksmes aprēķināšanas gaitā) un neviens cikls netiek izpildīts bezgalīgi. Valodā IMP: izteiksmes ir vienmēr definētas (IMP netiek iekļauta dalīšana). Aplūkosim vispirms šo vienkāršāko gadījumu (pierādījuma likumus varēs pēc tam papildināt). n = N  1 z:=1; while (n>0) do z := z*n; n := n-1 od z = N! Kāpēc programma noteikti izies no cikla? 1) Katrā cikla apgriezienā nvērtība stingri samazinās. 2) n vērtība nevar kļūt mazāka par 0. 3) Naturālo (veselo nenegatīvo) skaitļu kopā neeksistē bezgalīgas dilstošas virknes (fundamentāla naturālo skaitļu īpašība) n– cikla variants Cikla variants – noteikts no programmas stāvokļa atkarīgs lielums ar veselām vērtībām (arī tad, ja programmā izmantoti citi datu tipi), kas (1) sākumā ir nenegatīvs(2) katrā cikla apgriezienā strikti samazinās un (3) cikla apgrieziena izpildes gaitā nevar kļūt mazāks par 0.

  8. Pilnās korektības pierādījumi: cikla varianti (2) Pilnā korektība: I : ja,I p , tad eksistē’ , kamc,    ’un’,I q Cikla variants – noteikts no programmas stāvokļa atkarīgs lielums ar veselām vērtībām (arī tad, ja programmā izmantoti citi datu tipi), kas (1) sākumā ir nenegatīvs(2) katrā cikla apgriezienā strikti samazinās un (3) cikla apgrieziena izpildes gaitā nevar kļūt mazāks par 0. Atrast cikla variantus: n = N  0  m = M  0 s:=0; while (m>0) do s := s+n; m := m-1 od s = M*N x = X > 0  y = Y > 0 while not(x=y) do if x<y then y := y-x else x := x-y fi odx = y = gcd(X,Y) x = X  0  y = Y  0 z := x; k := 0; while z >= y do z := z-y; k := k+1 odX = k*Y+z  0  z < Y Novērojums: lai varētu konstatēt, ka kāds lielums ir cikla variants, var būt nepieciešams izmantot zināšanas par cikla invariantu. Tādēļ apstāšanās faktu var būt labi pierādīt vienlaicīgi ar daļējās korektības pierādīšanu.

  9. Pilnās korektības pierādījumi: aksiomas Aksiomas pilnajai korektībai (visur definētu izteiksmju gadījums): 1. p  skip  p  2. q [e/x]  x := e  q  3.Ja p  c1  r un r  c2  q ,tad p  c1; c2  q . 4.Ja pb  c1 q unp b  c2 q , tad p  if b then c1 else c2 fi  q  5.Ja r  b  f = N 0  c1  r  0  f < N ,tad r  f 0  while b do c1 od  r  b r – cikla invariants, f – cikla variants 6.Ja p  p’,  p’  c  q’ un q’  q, tad p  c  q  5a.Ja p  r  f 0,  r  b  f = N 0  c1  r  0  f < N , un r  b  q, tad p  while b do c1 od  q  2a.Ja p  q [e/x], tad p x := e  q . Kā veidot pierādījumus, izmantojot šīs aksiomas?

  10. s:=0 ; while (m>0) do s := s+n ; m := m-1 od c0 c c1 c3 ra  r1 [ s+n / s ] (*) r1  (r  (0 m<X)) [ m-1/ m] c4 c2  rac3 r1   r1c4 r  (0 m<X)  p  p1 [ 0 / s ] p1  r  (m0)  ra c2  r  (0m<X)  r  (m>0)  q  p c0 p1   p1 c1 q   p c q  Pilnās korektības pierādījums: piemērs n = N  0  m = M  0s:=0; while (m>0) do s := s+n; m := m-1 od s = M*N Apzīmējam: p  [ n = N  0  m = M  0 ] q  [ s = M * N ] r  [ n = N  0  m  0  s = n * (M - m) ] p1  p  ( s = 0 )(spēkā pēc c0 izpildes) r1  (r  (0m<X)) [ m-1 / m ]  n = N  0  m-1  0  s = n * (M – (m-1))  0 m-1<X (spēkā pēc c3 izpildes) ra  r  (m>0)  (m=X  0) (*)n = N  0  m  0  s = n * (M - m)  (m > 0)  (m = X  0)  n = N  0  m-1  0  (s + n) = n * (M – (m-1))  0 m-1< X

  11. Pilnās korektības aksiomas: vispārīgais gadījums def(e) – predikāts, kas raksturo tos stāvokļus, kurosizteiksme eir definēta. Aksiomas: 1. p  skip  p  2. q [e/x]  def(e)  x := e  q  3.Ja p  c1  r un r  c2  q ,tad p  c1; c2  q . 4.Japb c1 qunp b  c2q, tadp  def(b) if b then c1 else c2 fi q 5.Ja r  def(b) un r  b  f = N 0  c1  r  0  f < N ,tad r  f = N 0  while b do c1 od  r  b r – cikla invariants, f – cikla variants 6.Ja p  p’,  p’  c  q’ un q’  q, tad p  c  q  5a.Ja(1) p  r  f 0, (2) rdef(b) , (3) r  b  f = N 0  c1  r  0  f < N , un(4) r  b  q, tad p  while b do c1 od  q  2a.Ja p  q [e/x]  def(e), tad p x := e  q .

  12. Mājas darbs 1. Dota programma i := 1 ; s := 0 ; while i <= n do     s := s + 2 * i - 1;     i := i + 1 od Pierādīt tās daļējo korektību attiecībā pret specifikāciju { n = N  0, s = N2 }, izmantojot Hoara loģiku. 2. Pierādīt 1.uzdevumā dotās programmas pilno korektību attiecībā pret doto specifikāciju, izmantojot pilnās korektības aksiomu sistēmu. Norādījums: 1. un 2. uzdevumā jāzīmē katram pierādījumam savs izveduma koks atbilstoši dotajai aksiomu sistēmai. 3. Atrast cikla variantu dotai programmai ar sākuma nosacījumu x=X0  y=Y0 : while not(x=y) do if x<y then y := y-x else z:=x; x:=y; y:=z fi od

More Related