/// A single term in a Datalog predicate.
///
/// Variables start with an uppercase letter (e.g. `X`, `Name`), atoms start
/// with a lowercase letter (e.g. `alice`, `edge`), and `_` is the anonymous
/// placeholder that matches anything without binding.
/// A Datalog predicate application, e.g. `edge(X, Y)`.
/// A parsed Datalog join query of the form `Head :- Body1, Body2, ... .`
///
/// For example: `path(X, Z) :- edge(X, Y), edge(Y, Z).`
///
/// Implements [`FromStr`](std::str::FromStr) for parsing from a string.