В чем разница между 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, я тоже не знал ответа.

С этим ответом я не хочу копировать ответ Пауло. Вместо этого я предлагаю вам рассмотреть возможность поиска / поиска альтернативных источников, связанных с Прологом:

Обратите внимание, что вышеперечисленное может непосредственно соответствовать или не соответствовать используемой вами системе Prolog.

Тем не менее, наличие нескольких источников является хорошей вещью: это может удержать вас от застревания!

Другие вопросы по тегам