Пролог - как очистить память и начать с нуля?


Я разрабатываю алгоритм в файле. pl и рассматриваю его с запросами в командном окне. Я использую динамические переменные и предикаты retract/assert. И когда я изменяю файл pl и нажимаю на кнопку "Перезагрузить измененные файлы", у меня есть дополнительные факты, которые мне не нужны.

Например, в начале у меня есть счетчик (0).

И я что-то делаю, убираю и утверждаю этот счетчик, он становится счетчиком(7). Затем, когда я перезагружаю измененный файл pl, у меня есть оба счетчик (0). и счетчик (7).

Как я могу предотвратить это и иметь только счетчик (0). в самом начале?

Заранее благодарю.

3 7

3 ответа:

Вставить

:- abolish(counter/1).

В начале файла. Когда вы закончите тестирование, удалите его.

Если вы используете только эти динамические факты для реализации счетчиков, вы должны подумать о том, является ли это лучшим способом сделать это. Использование assert/1 и retract/1 делает код довольно медленным.

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

Это зависит от того, какую систему вы используете. В YAP, B, GNU, SICStus, the директива :- dynamic(counter/1). имеет такой эффект. То есть, только в факты из файла присутствуют после перезагрузки.

В SWI динамические предикаты сохраняются так, как вы их описываете. Вы должны удалить их непосредственно с помощью retractall/1, который сохраняет информацию о том, что предикат является динамическим.