Вы спрашиваете об «изменяемом состоянии». Как и в функциональных языках (например, LISP и др.), В Прологе это сложнее! (Для функционального представления в контексте Clojure см. Значения и изменения: подход Clojure к идентичности и состоянию )
То, что вы можете сделать, это указать значение c для «времени» ». Тогда вы можете иметь факты в базе данных Prolog , подобные этим:
available_resources(10, [this, and, that]).
available_resources(20, [hither, and, yon]).
Здесь мы утверждаем, что в момент времени 10 ресурсы были [this, and, that]
, а в момент времени 20 ресурсы были [hither, and, yon]
.
Затем вы можете использовать assertz для добавления фактов в базу данных и убрать для удаления старых.
release(X) :- available_resources(Tprev, Rprev),
compute_new_resource_term(X,Rprev,Rcur),
% get current time from an extralogical oracle
get_time(Tcur),
retract(available_resources(Tprev, Rprev)),
assertz(available_resources(Tcur,Rcur)).
Но если вам не нужно, чтобы термин «ресурсы» выживал при выполнении программы (т. е. через возврат к верхнему уровню), вы просто создадите новые термины и передадите их из предиката в предикат без сохранения их в базе данных.