What is the difference between abolish/1 and retractall/1?
Asked Answered
D

3

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.

Dip answered 27/12, 2015 at 21:19 Comment(0)
C
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.

Chavira answered 27/12, 2015 at 23:45 Comment(0)
P
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

Pyelitis answered 28/12, 2015 at 8:2 Comment(1)
Excellent analogy, thank you!Philender
F
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!

Forsaken answered 28/12, 2015 at 7:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.