Как избежать использования assert и retractall в Prolog для реализации глобальных (или состояний) переменных

Я часто заканчиваю тем, что пишу код на Прологе, который включает в себя некоторое арифметическое вычисление (или информацию о состоянии, важную для всей программы), сначала получая значение, сохраненное в предикате, затем пересчитывая значение и, наконец, сохраняя значение, используяretractall а такжеassert потому что в Прологе мы не можем присвоить значения переменной дважды, используяis (таким образом делая почти каждую переменную, которая требует модификации, глобальной). Я узнал, что это не очень хорошая практика в Прологе. В связи с этим я хотел бы спросить:

Почему это плохая практика в Прологе (хотя я сам не люблю проходить вышеупомянутые шаги, чтобы иметь какую-то гибкую (модифицируемую) переменную)?

Каковы общие способы избежать этой практики? Маленькие примеры будут с благодарностью.

Постскриптум Я только начал изучать Пролог. У меня есть опыт программирования на таких языках, как C.

Отредактировано для дальнейшего уточнения

Плохой пример (в win-прологе) того, что я хочу сказать, приведен ниже:

:- dynamic(value/1).
:- assert(value(0)).

adds :- 
   value(X),
   NewX is X + 4,
   retractall(value(_)),
   assert(value(NewX)).

mults :-
   value(Y),
   NewY is Y * 2,
   retractall(value(_)),
   assert(value(NewY)).

start :-
   retractall(value(_)),
   assert(value(3)),
   adds,
   mults,
   value(Q),
   write(Q).

Тогда мы можем запросить как:

?- start.

Здесь это очень тривиально, но в реальной программе и приложении показанный выше метод глобальной переменной становится неизбежным. Иногда приведенный выше список вродеassert(value(0))... растет очень долго с большим количеством предикатов assert для определения большего количества переменных. Это сделано для того, чтобы сделать возможной передачу значений между различными функциями и сохранить состояния переменных во время выполнения программы.

Наконец, я хотел бы знать еще одну вещь: когда упомянутая выше практика становится неизбежной, несмотря на различные решения, предложенные вами, чтобы ее избежать?

Ответы на вопрос(2)

Ваш ответ на вопрос