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

4k views Asked by At

From reading the manual, I can't seem to find the difference between the two.

The manual says:

It is advised to use retractall/1 for erasing all clauses of a dynamic predicate.

So I chose to use retractall/1 in my program; however, I wonder what the difference is.

3

There are 3 answers

0
Paulo Moura On BEST ANSWER

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.

0
repeat On

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:

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!

1
CapelliC On

In analogy to SQL:

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