There is an efficiency advantage in using conditionals whose test part
consists only of arithmetic comparisons or type tests. Consider the
following alternative definitions of the predicate type_of_character/2
.
In the first definition, four clauses are used to group characters on
the basis of arithmetic comparisons.
type_of_character(Ch, Type) :- Ch >= "a", Ch =< "z", !, Type = lowercase. type_of_character(Ch, Type) :- Ch >= "A", Ch =< "Z", !, Type = uppercase. type_of_character(Ch, Type) :- Ch >= "0", Ch =< "9", !, Type = digit. type_of_character(_Ch, Type) :- Type = other.
In the second definition, a single clause with
a conditional is used. The compiler generates optimized code for the
conditional; the second version of type_of_character/2
runs faster than
the first and uses less memory.
type_of_character(Ch, Type) :- ( Ch >= "a", Ch =< "z" -> Type = lowercase ; Ch >= "A", Ch =< "Z" -> Type = uppercase ; Ch >= "0", Ch =< "9" -> Type = digit ; otherwise -> Type = other ).
Following is a list of builtin predicates that are compiled efficiently in conditionals:
atom/1
atomic/1
callable/1
compound/1
db_reference/1
float/1
integer/1
nonvar/1
number/1
simple/1
var/1
</1
=</1
=:=/1
=\=/1
>=/1
>/1
@</1
@=</1
==/1
\==/1
@>=/1
@>/1