37.4.8 Dynamic Methods

To be able to change a method with functor F/N in a static object, the method has to be declared dynamic by storing the following fact in the object:

     some_object :: {
             dynamic F/N &
             :
             }.

Each book in a library can be represented as an object, in which the name of the book is stored, the authors, and a borrowing history indicating when a book is borrowed and when it is returned. A history item may have the form history_item(Person,Status,Date) where Status is either borrowed or returned, and Date has the form YY-MM-DD, for YY year, MM month, DD day.

A typical book book_12 could have the following status. Note that history_item/3 is dynamic:

     book_12 :: {
             super(book) &
     
             title('The Art of Prolog') &
             authors(['Leon Sterling', 'Ehud Shapiro']) &
     
             dynamic history_item/3 &
     
             history_item('Dan Sahlin', returned, 92-01-10) &
             history_item('Dan Sahlin', borrowed, 91-06-10) &
             :
             }.

Dynamic methods that are stored in an object can be updated, as in usual Prolog programs, by sending assert and retract messages directly to the object.

For example, to borrow a book the following method could be defined in the object book. We assume that the top most history_item fact is the latest transaction, and there is an object date from which we can get the current date.

     borrow(Person) :-
             history_item(_Person0, Status, _Date0), !,
             (   Status = returned ->
                 date::current(Date),
                 asserta(history_item(Person, borrowed, Date))
             ;   :display('book not available'), :ttynl
             ) &