(* LIB of B new: --> LIB add: LIB x B --> LIB rem: LIB x B --> LIB cko: LIB x B x P --> LIB cki: LIB x B x P --> LIB wait: LIB x B x P --> LIB nah: LIB x B x P --> LIB has: LIB x B --> boolean num: LIB x B --> int avail: LIB x B --> int variables book: i,j,k person: m,n,p lib: S,T *) datatype lib = new | add of lib * string | cko of lib * string * int | wait of lib * string * int ; fun has(new,j) = false | has(add(S,i),j) = if i=j then true else has(S,j) | has(cko(S,i,m),j) = if i=j then true else has(S,j) | has(wait(S,i,m),j) = if i=j then true else has(S,j) ; fun avail(new,i) = 0 | avail(add(S,i),j) = if i=j then avail(S,j)+1 else avail(S,j) | avail(cko(S,i,m),j) = if i=j then avail(S,j)-1 else avail(S,j) | avail(wait(S,i,m),j) = if i=j then 0 else avail(S,j) ; fun num(new,i) = 0 | num(add(S,i),j) = if i=j then num(S,j)+1 else num(S,j) | num(cko(S,i,m),j) = num(S,j) | num(wait(S,i,m),j) = num(S,j) ; exception remCheckedOut; exception remNewLib; fun remove(new,i) = raise remNewLib | remove(add(S,i),j) = if i=j then remove(S,j) else add(remove(S,j),i) | remove(cko(S,i,m),j) = if i=j then raise remCheckedOut else cko(remove(S,j),i,m) | remove(wait(S,i,m),j) = wait(remove(S,j),i,m) ; (* functions used for managing wait list *) exception topwaitNewLib; fun topwait(new,i) = raise topwaitNewLib | topwait(add(S,i),j) = topwait(S,j) | topwait(cko(S,i,m),j) = topwait (S,j) | topwait(wait(S,i,m),j) = topwait(S,j) ; fun numWList(new,i)=0 | numWList(add(S,i),j) = if i=j then numWList(S,j)-1 else numWList(S,j) | numWList(cko(S,i,m),j) = numWList(S,j) | numWList(wait(S,i,m),j) = if i=j then numWList(S,j)+1 else numWList(S,j) ; (* end of functions used for managing wait list *) exception nahCkoLib; fun nah(new,i,m) = new | nah(add(S,i),j,m) = if i=j then S else add(nah(S,j,m),i) | nah(cko(S,i,m),j,n) = if numWList(S,j)>0 then raise nahCkoLib else cko(nah(S,j,n),i,m) | nah(wait(S,i,m),j,n) = S ; fun cki(new,i,m) = new | cki(add(S,i),j,m) = if numWList(S,j)>0 then cko(S,j,topwait(S,j)) else add(cki(S,j,m),i) | cki(cko(S,i,m),j,n) = if numWList(S,j)>0 then cko(S,j,topwait(S,j)) else add(cki(S,j,m),i) | cki(wait(S,i,m),j,n) = if numWList(S,j)>0 then cko(S,j,topwait(S,j)) else wait(cki(S,j,n),i,m) ; val lib1 = add(new,"Scarlet Letter"); val lib2 = add(new,"Hardy Boys"); val lib3 = add(new,"Moby Dick"); val lib4 = add(new,"Moby Dick"); val a = num(lib4, "Moby Dick"); val b = has(lib4, "Moby Dick"); val c = has(lib4, "Core Java 2"); val lib5 = cko(lib4, "Moby Dick",5); val d = avail(lib4,"Moby Dick"); val lib6 = cko(lib4, "Moby Dick",4); val lib7 = cko(lib4, "Moby Dick",9); val lib8 = cki(lib4, "Moby Dick",5);