Как избежать использования 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 для определения большего количества переменных. Это сделано для того, чтобы сделать возможной передачу значений между различными функциями и сохранить состояния переменных во время выполнения программы.
Наконец-то я'Хотелось бы знать еще одну вещь: когда упомянутая выше практика становится неизбежной, несмотря на различные решения, предложенные вами, чтобы ее избежать?