Como evitar o uso de assert e retractall no Prolog para implementar variáveis ​​globais (ou de estado)

Muitas vezes acabo escrevendo código no Prolog que envolve algum cálculo aritmético (ou informações de estado importantes em todo o programa), primeiro obtendo o valor armazenado em um predicado, depois recalculando o valor e finalmente armazenando o valor usandoretractall eassert porque no Prolog não podemos atribuir valores à variável duas vezes usandois (fazendo assim quase todas as variáveis ​​que precisam de modificação, global). Eu cheguei a saber que isso não é uma boa prática no Prolog. A este respeito, gostaria de perguntar:

Por que é uma prática ruim no Prolog (embora eu mesmo não goste de passar pelas etapas acima mencionadas apenas para ter um tipo de variável (modificável) flexível)?

Quais são algumas maneiras gerais de evitar essa prática? Pequenos exemplos serão muito apreciados.

P.S. Eu comecei a aprender Prolog. Eu tenho experiência em programação em linguagens como C.

Editado para mais esclarecimentos

Um mau exemplo (em win-prolog) do que eu quero dizer é dado abaixo:

:- 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).

Então podemos consultar como:

?- start.

Aqui, é muito trivial, mas no programa e na aplicação reais, o método mostrado acima de variável global torna-se inevitável. Às vezes a lista dada acima comoassert(value(0))... cresce muito tempo com muito mais predicados para definir mais variáveis. Isso é feito para tornar possível a comunicação dos valores entre as diferentes funções e para armazenar os estados das variáveis ​​durante o tempo de execução do programa.

Por fim, gostaria de saber mais uma coisa: quando é que a prática mencionada acima se torna inevitável, apesar de várias soluções sugeridas por você para evitá-la?

questionAnswers(2)

yourAnswerToTheQuestion