assert((zero(X) :- X = 0)).
the following query fails:
clause(zero(1), Body1), clause(zero(2), Body2).
because after the first call to clause, X is bound to 1 and the same X variable is used when matching the second call the clause. But clause should use copy_term to return the body.