The procedure must be declared to be dynamic using the dynamic/1 built-in. If the procedure is undefined an exception is raised. However, the default error handler for this exception simply declares the procedure dynamic and asserts the clause.
The asserted clause is NOT removed from the database on backtracking through the call to assert/1.
assert/1 satisfies the logical update semantics. Asserting a clause to a procedure will not, in any way, affect previous calls to it when backtracking.
Success: assert(city(munich)). assert((likes(X,Y):-man(X),woman(Y)). Error: assert(X). - gives error 4. assert("the man"). - gives error 5. assert(1). - gives error 5. assert((my_static(X):-write(X))). - gives error 63. if my_static/1 is not dynamic. Logical semantics : If the following clauses are in the database : p :- assert(p), fail. p :- fail. q :- fail. q :- assert(q), fail. The queries p. and q. will both fail.