% Library Model % Borrower's View print(A) :- prin(A),nl. get_book(Card_ID,Call_ID) :- print(["Borrower-> ",Card_ID," wants to check out book: ",Call_ID]), check_out(Card_ID,Call_ID),!. return_book(Call_ID) :- print(["Borrower-> Book: ",Call_ID," is returned to library"]), check_in(Call_ID),!. % Clerk's View check_out(Card_ID,Call_ID) :- card_OK(Card_ID), call_ID_OK(Call_ID), book_OK(Call_ID), print(["Clerk-> Book ",Call_ID," checked out by: ",Card_ID]), catalog_out(Card_ID,Call_ID),!. check_out(_,_) :- print("Incomplete checkout"). check_in(Call_ID) :- print(["Clerk-> Book ",Call_ID," returned to library"]), catalog_in(Call_ID), shelve(Call_ID),!. card_OK(Card_ID) :- borrower(Card_ID),!. card_OK(Card_ID) :- print(["Clerk-> Invalid card"]), fail. book_OK(Call_ID) :- book_status(Call_ID,in,_), book_info(Call_ID,circulating,_),!. book_OK(Call_ID) :- book_status(Call_ID,out,_), print(["Clerk-> Requested book is out"]), fail,!. book_OK(Call_ID) :- book_info(Call_ID,reference,_), print(["Clerk-> Requested book does not circulate"]), fail. %Librarian's View shelve(Call_ID) :- print(["Librarian-> Book is returned to shelf. Call Number: ",Call_ID]). % Book Catalog View catalog_out(Card_ID,Call_ID) :- retract(book_status(Call_ID,_,_)), assert(book_status(Call_ID,out,Card_ID)), print(["Catalog-> Book ",Call_ID," is signed out to: ",Card_ID]). catalog_in(Call_ID) :- retract(book_status(Call_ID,_,_)), assert(book_status(Call_ID,in,0)), print(["Catalog-> Book ",Call_ID," returned to library."]). call_ID_OK(Call_ID) :- book_info(Call_ID,_,_),!. call_ID_OK(Call_ID) :- print(["Catalog-> Invalid call number"]), fail. % Knowledge-base % book information book_info(1111,circulating,"Mystery"). book_info(2222,reference,"English-German dictionary"). % book status book_status(1111,in,_). book_status(2222,in,_). % Borrowers borrower(joe). borrower(jane). % test test :- get_book(joe,1111), get_book(jane,2222), return_book(1111), get_book(jane,1111), get_book(joe,3333).