Presentation is loading. Please wait.

Presentation is loading. Please wait.

Requirements from EX 4.3  R1. Clerk can display the current state of reservations on screen.  R2. To book, client chooses a free seat and then gets a.

Similar presentations


Presentation on theme: "Requirements from EX 4.3  R1. Clerk can display the current state of reservations on screen.  R2. To book, client chooses a free seat and then gets a."— Presentation transcript:

1 Requirements from EX 4.3  R1. Clerk can display the current state of reservations on screen.  R2. To book, client chooses a free seat and then gets a ticket.  R3. Can’t double book.  R4. Clients must have choice of all seats available, e.g., can’t divide seats between clerks.  R5. Seat can appear to be free although being booked by another clerk. Strange note? How does this fit with R1? Inconsistent with textbook solution!

2 range Seats = 1..2 range Clerks = 1..2 CLERK = (request[i:Seats]->{cancel,{s[i]}.reserve}->CLERK |s[i:Seats].release->CLERK). SEAT = (reserve->release->SEAT). ||BOOKING = (c[j:Clerks]::s[i:Seats]:SEAT || c[j:Clerks]:CLERK). Megen solution ? I kind of like it. A clerk has a lock on a seat until he releases it. Cleaner than textbook? You can judge in a minute. Requirements inconsistencies:  !R1: clerk does not *always* show current seat states.  !R2: client chooses but may not get seat/ticket: kind of put on queue.  And can lock up system waiting for cancel. ?

3 const M = 5 //number of seats range P = 1..M //seat numbers const N = 3//number of terminals range T = 1..N//terminal numbers SEAT = (book -> BOOKED), BOOKED = (na -> BOOKED).//na = not available ||SEATS = ([x:P]:SEAT)\{[x:P].na}. //hide the na's TERMINAL = (book[P] -> TERMINAL). ||TERMINALS = ([x:T]:TERMINAL). ||TERM_SEATS = (TERMINALS||SEATS)/{[y:T].book[x:P]/[x].book}\{[y:T].book[x:P].[x:P]}. ||CINEMA = (TERM_SEATS). //deadlocks when all of the seats are booked Daniel/Anthony solution

4 const M = 5 //number of seats range P = 1..M //seat numbers const N = 3//number of terminals range T = 1..N//terminal numbers SEAT = (book -> BOOKED), BOOKED = (na -> BOOKED).//na = not available ||SEATS = ([x:P]:SEAT)\{[x:P].na}. //hide the na's TERMINAL = (book[P] -> TERMINAL). ||TERMINALS = ([x:T]:TERMINAL). ||TERM_SEATS = (TERMINALS||SEATS)/{[y:T].book[x:P]/[x].book}\{[y:T].book[x:P].[x:P]}. ||CINEMA = (TERM_SEATS). //deadlocks when all of the seats are booked Daniel/Anthony solution Requirements inconsistencies:  None that I can see R1-R4.  R5. At abstraction level where it’s instantaneous?

5 const N = 4 range T = 0..N //Modeled for five seats set VarAlpha = {value.{read[T],write[T], acquire[T],release[T]} } SEAT = (read[u:T]->SEAT | write[v:T]->SEAT). LOCK = (acquire[w:T]->release[w]->LOCK). ||LOCKSEAT = (LOCK || SEAT). TERMINAL = (go -> RUN), RUN = (chooses -> BOOK |close -> TERMINAL), BOOK = (value.acquire[x:T] -> value.read[x] -> value.write[x] -> value.release[x] -> RUN )+VarAlpha. ||GARDEN = (east:TERMINAL || west:TERMINAL || north:TERMINAL || south:TERMINAL || {east,west,north,south}::value:LOCKSEAT) /{go /{east,west,north,south}.go}. Raihan solution

6 SEAT = (read[u:T]->SEAT | write[v:T]->SEAT). LOCK = (acquire[w:T]->release[w]->LOCK). ||LOCKSEAT = (LOCK || SEAT). TERMINAL = (go -> RUN), RUN = (chooses -> BOOK |close -> TERMINAL), BOOK = (value.acquire[x:T] -> value.read[x] -> value.write[x] -> value.release[x] -> RUN )+VarAlpha. ||GARDEN = (east:TERMINAL || west:TERMINAL || north:TERMINAL || south:TERMINAL || {east,west,north,south}::value:LOCKSEAT) /{go /{east,west,north,south}.go}. Raihan solution Requirements inconsistencies:  !R1. does not show status.  !R2. Don’t get ticket for seat.  !R3. Can double book I believe.  R5. Supports this.  In general, has no memory of what tickets have been sold? Need SEAT[u:T]?

7 const SeatNumber = 3 range Seats = 1..SeatNumber set Terminals = {t1,t2} // If the concert starts, we allow dropins // A TAKEN seat can be released, a person can sit down or the concert can start // If a person sits down, they can leave anytime, but the seat will not become free until the concert ends (SEATED). // If the concert starts, we allow for late-comers that already have a ticket (STARTED) // If a person drops in, he/she cannot release his/her ticket. Therefore, "book" goes directly to STARTED. SEAT = FREE, FREE = ( book->TAKEN | concertStarts->DROPIN | concertEnds->FREE), TAKEN = ( release->FREE | sit -> SEATED | concertStarts->STARTED), SEATED = ( concertEnds->FREE), STARTED = ( sit->SEATED | concertEnds->FREE), DROPIN = ( book->STARTED | concertEnds->FREE)\{sit}. CONCERT = ( concertStarts->concertEnds->CONCERT | cancel->CONCERT)\{cancel}.//Why this? TERMINAL = (book->TERMINAL). ||BOOKING = (CONCERT || Terminals:TERMINAL || Terminals::s[Seats]:SEAT) /{concertStarts/Terminals.s[Seats].concertStarts, concertEnds/Terminals.s[Seats].concertEnds, Terminals.s[Seats].book/Terminals.book}. // A note: The concert can start without anyone reserving a seat. I don't know if this is normal practice. // Maybe the orchestra can use it as a rehearsal if there is no one to watch them :-) // Another note: If a ticket is booked at terminal 1, it can still be release at e.g. terminal 2. David solution

8 SEAT = FREE, FREE = ( book->TAKEN | concertStarts->DROPIN | concertEnds->FREE), TAKEN = ( release->FREE | sit -> SEATED | concertStarts->STARTED), SEATED = ( concertEnds->FREE), STARTED = ( sit->SEATED | concertEnds->FREE), DROPIN = ( book->STARTED | concertEnds->FREE)\{sit}. CONCERT = ( concertStarts->concertEnds->CONCERT | cancel->CONCERT)\{cancel}. TERMINAL = (book->TERMINAL). ||BOOKING = (CONCERT || Terminals:TERMINAL || Terminals::s[Seats]:SEAT) /{concertStarts/Terminals.s[Seats].concertStarts, concertEnds/Terminals.s[Seats].concertEnds, Terminals.s[Seats].book/Terminals.book}. David solution Requirements inconsistencies:  R1-R4 ok.  !R5. Obvious given R1 != R5 and R1 is true.  Nice that either can release.

9 range Bool = 0..1 const False = 0 const True = 1 const N = 3 range T = 1..N SEAT = SEAT[True], SEAT[x:Bool] = ( check[x] -> SEAT[x] |book -> SEAT[False] |when (x==False) book -> ERROR ). ||SEATS = (seat[T]:SEAT). LOCK = (acquire -> release -> LOCK). TERMINAL = (choose[s:T] -> acquire -> seat[s].check[x:Bool] -> if (x==True) then (seat[s].book -> release -> ticket -> TERMINAL) else (release -> TERMINAL)). ||RESERVATION = (a:TERMINAL || b:TERMINAL || {a,b}::SEATS || {a,b}::LOCK). Fan solution

10 const N = 3 range T = 1..N SEAT = SEAT[True], SEAT[x:Bool] = ( check[x] -> SEAT[x] |book -> SEAT[False] |when (x==False) book -> ERROR ). ||SEATS = (seat[T]:SEAT). LOCK = (acquire -> release -> LOCK). TERMINAL = (choose[s:T] -> acquire -> seat[s].check[x:Bool] -> if (x==True) then (seat[s].book -> release -> ticket -> TERMINAL) else (release -> TERMINAL)). ||RESERVATION = (a:TERMINAL || b:TERMINAL || {a,b}::SEATS || {a,b}::LOCK). Fan solution Requirements inconsistencies:  !R1. Shows seats that are not available.  !R2. Can choose seat and not get ticket.  R5. Does support this (anti-R1).  System locks while in booking phase.

11 const False = 0 const True = 1 range Bool = False..True SEAT = SEAT[False], SEAT[reserved:Bool] = ( reserve -> SEAT[True] | query[reserved] -> SEAT[reserved] | when (reserved) reserve -> ERROR //error if reserved twice ). range Seats = 0..1 ||SEATS = (seat[Seats]:SEAT). LOCK = (acquire -> release -> LOCK). BROKENLOCK = ({acquire,release}->BROKENLOCK). TERMINAL = (choose[s:Seats] -> acquire -> seat[s].query[reserved:Bool] -> if (!reserved) then (seat[s].reserve -> release-> TERMINAL) else (release -> TERMINAL) ). set Terminals = {a,b} ||CONCERT = (Terminals:TERMINAL || Terminals::SEATS || Terminals::LOCK). Textbook solutionRequirements inconsistencies:  !R1: clerk does not show current seat states. Always shows all seats as choosable.  !R2: client chooses but may not get seat/ticket. Frustrating!

12 const False = 0 const True = 1 range Bool = False..True SEAT = SEAT[False], SEAT[reserved:Bool] = ( reserve -> SEAT[True] | query[reserved] -> SEAT[reserved] | when (reserved) reserve -> ERROR //error if reserved twice ). range Seats = 0..1 ||SEATS = (seat[Seats]:SEAT). LOCK = (acquire -> release -> LOCK). BROKENLOCK = ({acquire,release}->BROKENLOCK). TERMINAL = (choose[s:Seats] -> acquire -> seat[s].query[reserved:Bool] -> if (!reserved) then (seat[s].reserve -> release-> TERMINAL) else (release -> TERMINAL) ). set Terminals = {a,b} ||CONCERT = (Terminals:TERMINAL || Terminals::SEATS || Terminals::LOCK). /* use this system to demonstrate how lack of mutual exclusion leads to double reservation */ ||UNSAFECONCERT = (Terminals:TERMINAL || Terminals::SEATS || Terminals::BROKENLOCK). Textbook solution – broken lock


Download ppt "Requirements from EX 4.3  R1. Clerk can display the current state of reservations on screen.  R2. To book, client chooses a free seat and then gets a."

Similar presentations


Ads by Google