Naloge za ogrevanje

  • Kako deluje logična implikacija $\implies$?
  • (Komentar) Dokazujemo, da iz izjave $A$ sledi izjava $D$. Pri tem si pomagamo z vmesnimi izjavami $B$ in $C$. Zapisali smo $A \implies B \implies C \implies D$. V tem zapisu ne mislimo na $A \implies (B \implies (C \implies D))$ ampak na $A \implies B \wedge B \implies C \wedge C \implies D$.
  • Dokaži, da velja: $\forall x,y\in \mathbb{Z}:\ x < y \implies x \leq y$. Poišči proti-primer, ko obrat ne velja ($x \leq y \implies x < y$).
  • Dokaži, da velja: $\forall x, y\in \mathbb{Z}:\ x < y \implies x + 1 \leq y$.

Dokazovanje pravilnosti

Pri dokazovanju pravilnosti si lahko pomagamo z naslednjimi splošnimi nasveti.

  • Po stavku x := N vedno velja { x = N }. Formalno to dokažemo tako: { N = N } x := N { x = N }.
  • Pravilo za prireditveni stavek je { P[x ↦ e] } x := e { P }. Pri izpeljevanju najprej vse x-e v predpogoju izrazimo z e, nato pa e-je zamenjamo z x.
  • V zančni invarianti se zančni pogoj in lokalne spremenljivke ne pojavljajo, saj mora invarianta veljati tudi po izstopu iz zanke. Ko invarianto »peljemo« čez telo zanke, se nam v njej lahko pojavijo lokalne spremenljivke. Teh se želimo znebiti, ko dosežemo konec zanke.
  • Na koncu zanke se lahko izkaže, da je invarianta prešibka in iz nje ne moremo izpeljati končnega pogoja. V tem primeru lahko v invarianto dodamo še kak pogoj in ga ločeno peljemo čez zanko. To ne bo nikoli pokvarilo obstoječe izpeljave: če velja $A \implies C$, potem velja tudi $A \wedge B \implies C$.

Naloga 1

Dokažite parcialno in popolno pravilnost programa glede na dano specifikacijo.

{ x = m ∧ y = n }
x := x + y;
y := x - y;
x := x - y
{ x = n ∧ y = m }

Naloga 2

Dokažite parcialno in popolno pravilnost programa glede na dano specifikacijo.

{ }
if y < x then
  z := x;
  x := y;
  y := z
else
  skip
end
{ x ≤ y }

Naloga 3

Sestavite program c, ki zadošča specifikaciji

[ n ≥ 0 ]
c
[ s = 1 + 2 + ... + n ]

in dokažite njegovo pravilnost.

Naloga 4

Dokažite parcialno in popolno pravilnost programa glede na dano specifikacijo.

{ x ≥ 0 }
y := 0;
z := x;
while 1 < z - y do
  s := (y + z)/2;
  if s * s < x then
    y := s
  else
    z := s
  end
done
{ y² ≤ x ≤ (y+1)² }

Naloga 5

Dokažite popolno pravilnost spodnjega programa.

[ y > 0 ]
x := 0 ;
c := 0 ;
while y > c do
  x := x + 1 ;
  c := x * x * x
end
if y < c then
  x := 0 ;
  y := 0
else
  skip
end
[ x = ∛y ]
Zadnja sprememba: nedelja, 12. marec 2023, 06.11