ASSIGNMENT 10

CS 245, Winter 2015
A. Lubiw
ASSIGNMENT 10
Due Wednesday, April 1, 4:30pm, in the drop box near MC 4065.
Surname:
Personal name:
ID#:
Which tutorial do you attend:
F 10:30am
F 12:30pm
F 1:30pm
Assignment guidelines:
• Attach this sheet as a cover page, fill in your name and ID# above, and include
your name and ID# on every page of your assignment.
• Staple your pages together.
• Please type your assignment or write neatly in ink.
• The work you hand in must be your own. Acknowledge any sources you have
used. You may discuss the assignment questions verbally with others, but you
should come away from these discussions with no written or electronic records.
Write your solutions in your own words, from your own head.
Mark
Marker
Q1:
Q2:
total:
1
CS 245, Winter 2015
A. Lubiw
ASSIGNMENT 10
In this assignment you will prove partial correctness of some code fragments. To do that,
annotate the program with the proof rules for partial correctness. Include a justification beside
each condition. Add proofs for any “implied” rules afterwards—in these proofs you may freely use
algebra, but you should use natural deduction when the premise and/or conclusion involve logical
connectives.
1. [8 marks] Program Verification Part I
(a) [3 marks] Prove partial correctness for the following Hoare triple.
{
x
y
{
x=y
= x +
= y +
x=y
}
1;
1;
}
(b) [5 marks] Prove partial correctness for the following Hoare triple.
{ true }
if (x < y) {
min = x;
} else {
min = y;
}
{ (x < y ∧ min = x) ∨ (x ≥ y ∧ min = y)
}
2. [12 marks] Program Verification Part II
(a) [7 marks] This question is about the downward factorial example.
{ x ≥ 0 ∧ x = x0 }
y = 1;
while (x != 0) {
y = y * x;
x = x - 1;
}
{ y = x0 ! }
i. [5 marks] Prove partial correctness. Hint: Try the invariant y · x! = x0 ! and note
that 0! = 1.
ii. [2 marks] What variant could you use to prove total correctness? Argue (just in
English) why your variant is always non-negative, and why it decreases each time
through the while-loop.
2
P
(b) [5 marks] Prove partial correctness of the following code to compute ni=0 2i . Clearly
state your choice of invariant before your proof (you do not need to show any work
involved in your choice).
{ n≥1 }
x = 1;
y = 0;
for i = 0 to n {
y = y + x;
x = 2 * x;
}
{ y = 2n+1 − 1 }
3