10

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.

repeat
  • 18,496
  • 4
  • 54
  • 166
Kevin Van Ryckegem
  • 1,915
  • 3
  • 28
  • 55

3 Answers3

12

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.

Paulo Moura
  • 18,373
  • 3
  • 23
  • 33
8

In analogy to SQL:

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

CapelliC
  • 59,646
  • 5
  • 47
  • 90
3

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!

Community
  • 1
  • 1
repeat
  • 18,496
  • 4
  • 54
  • 166