Reputation: 616
I'm wondering how to go about adding error checking in Prolog. For instance I have a program that will find how long a list is:
listlen([],0).
listlen([_|T],N) :-
listlen(T,X),
N is X+1.
How would I print out an error like "The 1st argument has to be a list" when it happens?
Upvotes: 6
Views: 1284
Reputation:
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.
Upvotes: 3