Вопрос

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

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

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

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

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

Это было полезно?

Решение

Вставить

общий

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top