retract/[1,2]

Module: builtins

retract/1 — removes a clause from the database
retract/2 — removes a clause specified by a database reference
erase/1 — removes a clause from the database

ISO Standard Predicate

FORMS

retract(Clause)

retract(Clause, DBRef)

erase(DBRef)

DESCRIPTION

When Clause is bound to an atom or a structured term, retract/1 searches the current module for a clause that will unify with Clause. When a matching clause is found in the database, Clause is unified with the structure corresponding to the clause. The clause is then removed from the database.

retract/2 additionally unifies DBRef with the database reference of the clause.

erase/1 removes the clause associated with DBRef from the database. Note that erase(DBRef) should never be called following retract(Clause, DBRef) since at that point DBRef is no longer a valid database reference.

retract/1 and retract/2 will repeatedly generate and remove clauses upon backtracking. :/2 can be used to specify which module should be searched.

EXAMPLES

The following example shows how retract/1 and retract/2 can be used to get rid of all the comic book heroes that live in our modules. First we create all the heroes by consulting user, typing in facts from the console. Then we get rid of hero(spiderman) by using a simple call to retract/1:

?- [user].
hero(spiderman).
hero(superman).
hero(batman).
module women.
hero(superwoman).
endmod.
^D
yes.

?- retract(hero(spiderman)).

yes.

Continuing the example, we show what heroes are left by using the listing/1 procedure. After that, we remove hero(superman) with a retract/2 call. The old database reference to the man of steel is instantiated to Ref.

?- listing(hero/1).
%user:hero/1
hero(superman).
hero(batman).
%women:hero/1
hero(superwoman).
yes.

?- retract(hero(superman),Ref).

Ref='$dbref'(5208,15,2384,1)

yes.

Next, we use clause/3 to find the database reference of hero(batman). With this, we use the database reference in a retract/2 call to remove hero(batman) from the database. Note that when the call to retract/2 is made, the Clause argument is uninstantiated. After the call to retract/2 has succeeded, Clause is instantiated to the clause that was removed.

?- clause(hero(batman),Body,Ref).
Body=true
Ref='$dbref'(5052,15,2384,2)

yes.

?- retract(Clause,'$dbref'(5052,15,2384,2)).
Clause=hero(batman)

yes.

Now, we list the heroes left in the database. Only hero(superwoman) is left, but she’s in a different module. However, using the Mod:Goal construct, we can remove her too:

?- listing(hero/1).
%women:hero/1
hero(superwoman).

yes.

?- women:retract(hero(X)).
X=superwoman
yes.

?- listing(hero/1).
yes.

As the last call to listing/1 shows, there are no more heroes left in the database. (Who knows what evil may be lurking in the garbage collector though!)

SEE ALSO