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 ) &