Presentation is loading. Please wait.

Presentation is loading. Please wait.

Www.eschertech.com Fundamentals of Perfect Developer A one-day hands-on tutorial Answers to Exercises.

Similar presentations


Presentation on theme: "Www.eschertech.com Fundamentals of Perfect Developer A one-day hands-on tutorial Answers to Exercises."— Presentation transcript:

1 www.eschertech.com Fundamentals of Perfect Developer A one-day hands-on tutorial Answers to Exercises

2 www.eschertech.com Suggested answers to Exercise 1 const zeroToOneHundred: seq of int ^= 0..100; property assert 42 in zeroToOneHundred, 101 ~in zeroToOneHundred; function divides(i, j: int): bool pre j > 0 ^= i % j = 0; const squaresOfPrimes: seq of int ^= for those i::2..100 :- forall j::2..<i :- ~divides(i, j) yield i ^ 2; function max(S: set of int): int pre ~S.empty ^= that x::S :- forall y::S :- y <= x;

3 www.eschertech.com Suggested answers to Exercise 4 A recursive solution to the first problem is: function numLeadingSpaces(s: string): nat decrease #s ^= ( [s.empty | s.head ~= ` `]: 0, []: 1 + numLeadingSpaces(s.tail) ); A non-recursive solution to the first is: function numLeadingSpaces(s: string): nat ^= that j::0..#s :- (j = #s | s[j] ~= ` `) & (forall k::0..<j :- s[k] = ` `); The following member functions may be useful: take drop findFirst prepend

4 www.eschertech.com Suggested answers 4 (cont’d) function removeLeadingSpaces(s: string): string ^= s.drop(numLeadingSpaces(s)); function firstWord(s: string): string ^= ( let n ^= s.findFirst(` `); [n < 0]: s, []: s.take(n) );

5 www.eschertech.com Suggested answers 4 (cont’d) function splitIntoWords(s: string): seq of string decrease #s ^= ( let stripped ^= removeLeadingSpaces(s); [stripped.empty]: seq of string{}, []: ( let w ^= firstWord(stripped); splitIntoWords(stripped.drop(#w)).prepend(w) ) );

6 www.eschertech.com Suggested answers to Exercise 5 function min2a(x, y: int): int satisfy result <= x, result <= y, result = x | result = y via if [x > y]: value y; []: value x fi end; function min2b(x, y: int): int satisfy result <= x, result <= y, result = x | result = y via value ([x > y]: y, []: x) end;

7 www.eschertech.com Suggested answers 5 (cont’d) function findFirst1(s: seq of int, x: int): int satisfy 0 <= result <= #s, result = #s | s[result] = x, forall j::0..<result :- s[j] ~= x via loop var i: (nat in 0..#s)! = 0; keep forall j::0..<i' :- s[j] ~= x until i' = #s decrease #s - i'; if [s[i] = x]: value i; [] fi; i! + 1 end; value #s end;

8 www.eschertech.com Suggested answers 5 (cont’d) function findFirst1(s: seq of int, x: int): int satisfy 0 <= result <= #s, result = #s | s[result] = x, forall j::0..<result :- s[j] ~= x via var i: (nat in 0..#s)! = 0; loop change i keep forall j::0..<i' :- s[j] ~= x until i' = #s | s[i']= x decrease #s - i'; i! + 1 end; value i end;

9 www.eschertech.com Suggested answers 5 (cont’d) function numLeadingSpaces(s: string): nat ^= that j::0..#s :- (j = #s | s[j] ~= ` `) & (forall k::0..<j :- s[k] = ` `) via var i: (nat in 0..#s)! = 0; loop change i keep forall j::0..<i':- s[j] ~= ` ` until i'= #s | s[i'] = ` ` decrease #s - i'; i! + 1 end; value i end;

10 www.eschertech.com Suggested answers 5 (cont’d) function splitIntoWords(s: string): seq of string decrease #s ^= ( let stripped ^= removeLeadingSpaces(s); [stripped.empty]: seq of string{}, []: ( let w ^= firstWord(stripped); assert ~w.empty; splitIntoWords(stripped.drop(#w)).prepend(w) )...

11 www.eschertech.com Suggested answers 5 (cont’d) via var rslt: seq of string ! = seq of string{}; loop var i: (nat in 0..#s)! = 0; change rslt keep splitIntoWords(s) = rslt' ++ splitIntoWords(s.drop(i')) until i'= #s decrease #s - i'; i! + numLeadingSpaces(s.drop(i)); if [i < #s]: let w ^= firstWord(s.drop(i)); rslt! = rslt.append(w), i! + #w; [] fi end; value rslt end;

12 www.eschertech.com Suggested answers to Exercise 6 function longest(s: seq of string): string decrease #s ^= ( [s.empty]: "", []: ( let temp ^= longest(s.front); [#s.last >= #temp]: s.last, []: temp ) );

13 www.eschertech.com Suggested answers 6 (cont’d) class ListOfStrings ^= abstract var list: seq of string; internal var long: string; invariant long = longest(list); interface build{} post list! = seq of string{} via list! = seq of string{}, long! = "“ end; …

14 www.eschertech.com Suggested answers 6 (cont’d) … schema !add(s: string) post list! = list.append(s) via list! = list.append(s); if [#s >= #long]: long! = s; [] fi end; function longest: string ^= longest(list) via value long end; end;


Download ppt "Www.eschertech.com Fundamentals of Perfect Developer A one-day hands-on tutorial Answers to Exercises."

Similar presentations


Ads by Google