Пролог - обновить значение в списке списка - PullRequest
1 голос
/ 11 марта 2020

У меня есть факт:

available_resources([[r1, 0], [r2, 0]]).

Мне нужно, когда указанное условие истинно, увеличить ноль на 1. как:

release(X):-
        allocated(X , R1):-
        increase r1 by one 

Я не знаю, как обновить факт.

1 Ответ

2 голосов
/ 11 марта 2020

Вы спрашиваете об «изменяемом состоянии». Как и в функциональных языках (например, 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)).

Но если вам не нужно, чтобы термин «ресурсы» выживал при выполнении программы (т. е. через возврат к верхнему уровню), вы просто создадите новые термины и передадите их из предиката в предикат без сохранения их в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...