Success: not_unify(atom, neutron). not_unify(1.0, 1). Fail: not_unify(X, Y). not_unify(X, 1). Note the difference: coroutine, X > 1, X \= 1. % succeeds because the delayed goal X>1 is % taken into account coroutine, X > 1, not_unify(X, 1). % fails because the delayed goal X>1 is % ignored by the test_unify handler