Пролог - как очистить память и начать с нуля?
Я разрабатываю алгоритм в файле. pl и рассматриваю его с запросами в командном окне. Я использую динамические переменные и предикаты retract/assert. И когда я изменяю файл pl и нажимаю на кнопку "Перезагрузить измененные файлы", у меня есть дополнительные факты, которые мне не нужны.
Например, в начале у меня есть счетчик (0).
И я что-то делаю, убираю и утверждаю этот счетчик, он становится счетчиком(7). Затем, когда я перезагружаю измененный файл pl, у меня есть оба счетчик (0). и счетчик (7).
Как я могу предотвратить это и иметь только счетчик (0). в самом начале?
Заранее благодарю.
3 ответа:
Если вы используете только эти динамические факты для реализации счетчиков, вы должны подумать о том, является ли это лучшим способом сделать это. Использование
assert/1
иretract/1
делает код довольно медленным.Вы можете либо сделать переменную счетчика еще одним аргументом предиката, который вы передаете в своем коде (вам может потребоваться различать входные и выходные данные, поэтому у вас есть два дополнительных аргумента), либо использовать глобальные переменные (которые, однако, не являются логическими функциями, что иногда не работает).
Это зависит от того, какую систему вы используете. В YAP, B, GNU, SICStus, the директива
:- dynamic(counter/1).
имеет такой эффект. То есть, только в факты из файла присутствуют после перезагрузки.В SWI динамические предикаты сохраняются так, как вы их описываете. Вы должны удалить их непосредственно с помощью
retractall/1
, который сохраняет информацию о том, что предикат является динамическим.