Пролог - как очистить память и начать с нуля? - PullRequest
7 голосов
/ 07 декабря 2011

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 07 декабря 2011

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

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

4 голосов
/ 07 декабря 2011

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

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

3 голосов
/ 07 декабря 2011

Вставьте

:- abolish(counter/1).

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

...