Predicates and functions can be used in three distinct ways in Alchemy: user-defined, linked-in or internally implemented. For most applications, the user provides a finite set of predicates and functions along with some true/false groundings (user-defined); however, Alchemy also allows for the user to define his/her own functions and predicates as C++ code (linked-in) and supplies the user with the most commonly used functions and predicates (internal), as discussed in the previous section. The internal handling of functions and predicates is essentially the same, as predicates can be treated as boolean functions.
In Alchemy, atoms (predicates applied to a tuple of terms) can be certain or uncertain. An atom is certain if it appears in a .db (database) file. If a closed-world assumption is made and the atom does not appear, then the atom is assumed to be false. The equality predicate is always treated as an uncertain predicate. In the current version of Alchemy, functions must be certain. In future versions it will be possible to implement uncertain functions and perform inference on them.