|Did you know ...||Search Documentation:|
|[Warning: Clauses of (-)/2 are not together in the source-file|
Novices, especially with a Lisp background assume that this-is-an-identifier is a valid Prolog identifier. It is not. Using the display/1 primitive, we can see that:
?- display(this-is-an-identifier). -(-(-(this, is), an), identifier)
Of course, it is is prolog term and therefore no syntax error is raised. Even for the most common operations such as test for equivalence or `unify' the result is generally as expected. Some go wrong, such as sorting or breaking the identifier into its characters (atom_chars/2).
Simple programs actually still work (although much slower). However, if you mix proper Prolog identifiers with identifiers with a minus, things go wrong:
bruce-lee. godzilla. chuck-norris.
Now you get the warning Clauses of (-)/2 are not together in the source-file because there are two clauses of the term (-)/2 with one of godzilla/0 in between. SWI-Prolog (any many others) anticipate you might be re-using the same predicate name for a different definition and warns you (if you want a `discontiguous' predicate, use the discontiguous/1 declaration).
In Prolog, multi-word identifiers are written as this_is_an_identifier or thisIsAnIdentifier. As we have variables and constants, it is good and quite widely accepted practice to write