SWI-Prolog has ISO-compliant exception handling, so you can actually throw errors as defined in the standard.
?- throw(error(type_error(list, foo), context(foo/0, 'Must be a list'))).
ERROR: foo/0: Type error: `list' expected, found `foo' (an atom) (Must be a list)
This is not only difficult to type/use: it is also implementation dependent. Instead, you can (and should) use library(error), which provides the must_be/2
predicate (sadly, it is very difficult to find this on the SWI-Prolog website if you don't know what you are looking for):
?- must_be(list, [foo]).
true.
?- must_be(list, foo).
ERROR: Type error: `list' expected, found `foo' (an atom)
I assume that other Prolog implementations that support exception handling provide very similar facilities.