Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- First prove the invariant holds when entering the loop:
- Q ==> wp(res:=1;i:=2, I)
- n > 0 ==> wp(res:=1;i:=2, res == fact(i - 1) && (i <= n + 1))
- //sequential followed by assignments
- n > 0 ==> 1 == fact(2 - 1) && (2 <= n + 1)
- n > 0 ==> 1 == 1 && (n => 1)
- n > 0 ==> n > 0
- true
- Second prove that the invarinat is preserved by the loop:
- I && B ==> wp(res := res * i; i := i + 1, I)
- ((res == fact(i - 1) && (i <= n + 1)) && (i <= n)) ==> wp(res := res * i; i := i + 1, (res == fact(i - 1) && (i <= n + 1))
- //sequential followed by assignments
- ((res == fact(i - 1) && (i <= n + 1)) && (i <= n)) ==> (res * i == fact(i + 1 - 1) && (i + 1 <= n + 1))
- ((res == fact(i - 1) && (i <= n)) ==> (res * i == fact(i) && (i <= n))
- ((res == fact(i - 1) && (i <= n)) ==> (res == fact(i)/i && (i <= n))
- ((res == fact(i - 1) && (i <= n)) ==> (res == fact(i - 1) && (i <= n))
- true
- Third prove that the postcondition hold after loop exits:
- I && !B ==> R
- (res == fact(i - 1) && (i <= n + 1)) && (i > n) ==> (res == fact(n))
- (res == fact(i - 1)) && (i <= n + 1) && (i => n + 1) ==> (res == fact(n))
- (res == fact(i - 1)) && (i == n + 1) ==> (res == fact(n))
- (res == fact(n + 1 - 1)) ==> (res == fact(n))
- (res == fact(n)) ==> (res == fact(n))
- true
- Fourth prove that the variant is bounded form below by 0, as long as the loop has not terminated:
- I && B ==> D > 0
- (res == fact(i - 1) && (i <= n + 1)) && (i <= n) ==> ((n - i) + 1) > 0
- (res == fact(i - 1) && (i <= n) ==> (n - i >= 0)
- (res == fact(i - 1) && (0 <= n - i) ==> (n - i >= 0)
- //implication rule
- !((res == fact(i - 1) && (0 <= n - i)) || (n - i >= 0)
- //de Morgan rule
- !(res == fact(i - 1)) || !(0 <= n - i) || (n - i >= 0)
- //inverse rule
- !(res == fact(i - 1)) || true
- //annihilation
- true
- Fifth prove that the variant decrease on each loop iteration.
- I && B ==> wp(tmp := D; S, tmp > D)
- (res == fact(i - 1) && (i <= n + 1)) && (i <= n) ==> wp(tmp := n - i + 1; res:= res * i; i := i + 1, tmp > n - i + 1)
- //sequentials followed by assignments
- (res == fact(i - 1) && (i <= n + 1)) && (i <= n) ==> n - i + 1 > n - i + 2
- (res == fact(i - 1) && (i <= n + 1)) && (i <= n) ==> true
- trivially true
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement