>> p(X) :- p(Y), X is Y + 1.
is/2 is not Datalog though- it takes an arithmetic function as an argument;
+/2 in your example. So the above would not terminate because it's Prolog, not
because it's a Datalog program evaluated by Prolog.
>> Datalog doesn't even allow terms as predicate arguments so of course you
can't construct them of infinite size.
Usual confusion: I think you mean "terms" as in Prolog terms, i.e. atoms of
predicates (as opposed to terms in logic programming, i.e. variables,
constants and functions). Datalog accepts constants and variables so with a
finite vocabulary you can't create infinite atoms. I don't think that has to
do with bottom-up or top-down evaluation.
To be honest, I haven't read any Datalog papers, but I'd be surprised if the
termination guaranteed rested upon a specific implementation rather than the
language semantics. Maybe not surprised- but it would be less interersting if
you can only guarantee termination if you implement the language just so, vs.
if it's a property of the language.