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

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

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

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

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

спасибо заранее.

3 ответов


вставить

:- abolish(counter/1).

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


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

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


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

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