I am writing this answer, because the best answer yet was in a comment by lurker. I want to have it show up as an actual answer.
Your code is not working, because you’re doing R1 is R+1
when R
isn’t instantiated in the case not_number([X|T], R)
. Your recursive case is strung a little backwards. You want to do this:
not_number([X|T],R):- not(number(X)), not_number(T,R1), R is R1+1.
Now the right side of the is
is instantiated when it is called.