В чем разница между abolish/1 и retractall/1?
Прочитав руководство, я не могу найти разницу между ними.
В руководстве сказано:
Рекомендуется использовать retractall/1 для удаления всех предложений динамического предиката.
Поэтому я решил использовать retractall/1
в моей программе; Однако мне интересно, в чем разница.
3 ответа
retractall/1
Стандартный встроенный предикат может использоваться для удаления всех предложений для динамического предиката, но предикат все равно будет известен во время выполнения. abolish/1
Стандартный встроенный предикат, с другой стороны, не только удаляет все предложения предиката, но и делает предикат неизвестным во время выполнения. Если вы попытаетесь вызвать динамический предикат после удаления всех его предложений, используя retractall/1
, вызов просто не удается. Но если вы отмените динамический предикат, его вызов после приведет к ошибке существования предиката.
По аналогии с SQL:
retractall(table_name(_,_,_))
может быть delete from table_name
, в то время какabolish(table_name/3)
будет играть как drop table_name
Прежде чем я прочитал твой вопрос и прекрасный ответ @PauloMoura, я тоже не знал ответа.
С этим ответом я не хочу копировать ответ Пауло. Вместо этого я предлагаю вам рассмотреть возможность поиска / поиска альтернативных источников, связанных с Прологом:
Директивы ISO, управляющие конструкции и встроенные функции- изопрогнозирование SO
4.12.5 Удаление статей из базы данных- руководство по sicstus-prolog
8.7 Динамическое управление предложениями- руководство по gnu-prolog
Глава 9. Динамические предложения и глобальные переменные- руководство по bprolog
6.14 Утверждение, удаление и другие модификации базы данных- руководство по xsb
Обратите внимание, что вышеперечисленное может непосредственно соответствовать или не соответствовать используемой вами системе Prolog.
Тем не менее, наличие нескольких источников является хорошей вещью: это может удержать вас от застревания!