Semantyka i weryfikacja programów/Ćwiczenia 15: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Dorota (dyskusja | edycje)
Nie podano opisu zmian
Linia 24: Linia 24:




{{rozwiazanie||roz1|


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<div class="mw-collapsible-content" style="display:none">


Intuicyjnie, pownniśmy wskazać wyrażenie, którego wartość maleje w każdym obrocie pętli i jest zawsze nieujemna.
Intuicyjnie, pownniśmy wskazać wyrażenie, którego wartość maleje w każdym obrocie pętli i jest zawsze nieujemna.
Linia 120: Linia 121:


</div></div>
</div></div>
}}




Linia 159: Linia 159:




{{rozwiazanie| (poprawność częściowa)|roz1.1|


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (poprawność częściowa)</span>
<div class="mw-collapsible-content" style="display:none">


Zacznijmy od niezmiennika dla pętli zewnętrznej: <math>N_1 \, \equiv \, s = i^3 \land 1 \leq i \leq n</math>.
Zacznijmy od niezmiennika dla pętli zewnętrznej: <math>N_1 \, \equiv \, s = i^3 \land 1 \leq i \leq n</math>.
Linia 379: Linia 380:


</div></div>
</div></div>
}}


{{rozwiazanie| (poprawność calkowita)|roz1.2|


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (poprawność calkowita)</span>
<div class="mw-collapsible-content" style="display:none">


Własność stopu pętli zewnętrznej łatwo jest pokazać, gdyż w każdym obiegu rośnie wartość zmiennej <math>i</math>, czyli maleje wartość wyrażenia <math>n - i</math>.
Własność stopu pętli zewnętrznej łatwo jest pokazać, gdyż w każdym obiegu rośnie wartość zmiennej <math>i</math>, czyli maleje wartość wyrażenia <math>n - i</math>.
Linia 433: Linia 435:


</div></div>
</div></div>
}}
 


== Zadania domowe ==
== Zadania domowe ==

Wersja z 13:38, 1 cze 2020

Zawartość

Ostatnie ćwiczenia poświęcone będa dowodzeniu poprawności całkowitej programów.


Poprawność całkowita

Ćwiczenie 1 (potęgowanie binarne)

Przeprowadź dowód poprawności całkowitej (poprawność częściowa plus własność stopu) potęgowania binarnego:


[y0]
z := 1; p := x; q := y;
while q <> 0 do
  if odd(q) then
    z := z * p;
  q := q div 2;
  p := p * p
[z=xy]


Rozwiązanie


Ćwiczenie 2

Przeprowadź dowód poprawności całkowitej poniższego programu.


{n0}

s := 1; i := 1;
while i < n do
  k := 1; l := 0; p := 1;
  while p < i do
    k := k + 1;
    if l < p then
      l := l + 1;
      p := 1
    else
      p := p + 1;
  s := s + 6 * k + p - l;
  i := i + 1;
 
{s=n3}


Wskazówka

(m+1)3=m3+3m2+3m+1

Σj=1mj=m(m+1)2


Rozwiązanie (poprawność częściowa)


Rozwiązanie (poprawność calkowita)

Zadania domowe

Ćwiczenie 1

Przeprowadź dowód poprawności całkowitej poniższego programu.


[(x.1x<nA[x]A[x+1])(x.n+1x<2nA[x]A[x+1])]
i := 1; j := 2 * n;
while A[i] < A[j] do
  ,,zamień A[i] i A[j]";
  i := i + 1;
  j := j - 1;
[x,y.1xn<y2nA[x]A[y]]