What is the difference between abolish/1 and retractall/1?

In analogy to SQL:

retractall(table_name(_,_,_)) could be delete from table_name, while abolish(table_name/3) would play as drop table_name


Before I read your question and @PauloMoura's fine answer, I didn't know the answer either.

With this answer I don't want to copy Paulo's answer. Instead, I suggest you consider reading/searching alternative Prolog-related sources:

  • The ISO directives, control constructs and builtins—iso-prolog on SO

  • 4.12.5 Removing Clauses from the Database—sicstus-prolog manual

  • 8.7 Dynamic clause management—gnu-prolog manual

  • Chapter 9 Dynamic Clauses and Global Variables—bprolog manual

  • 6.14 Asserting, Retracting, and Other Database Modifications—xsb manual

  • 6.10.1 Modification of the Data Base—part of the yap manual

Note that the above may or may not directly fit the Prolog system you use.

Still, having multiple sources is a good thing: It can keep you from getting stuck!


The retractall/1 standard built-in predicate can be used to remove all clauses for a dynamic predicate but the predicate will still be known by the runtime. The abolish/1 standard built-in predicate, in the other hand, not only removes all predicate clauses but also makes the predicate unknown to the runtime. If you try to call a dynamic predicate after removing all its clauses using retractall/1, the call simply fails. But if you abolish a dynamic predicate, calling it after will result in a predicate existence error.