What does the s() predicate do in Prolog?

okin33 picture okin33 · Nov 19, 2011 · Viewed 7.1k times · Source

I have been trying to learn Prolog, and am totally stumped on what the predicate s() does. I see it used often and there is so little resources on the internet about Prolog that I cannot find an answer.

Ex.

    /* sum(Is,S) is true if S is the sum of the list of integers Is.           */
    sum([],0).
    sum([0|Is],S):-sum(Is,S).
    sum([s(I)|Is], s(Z) ):-sum([I|Is],Z).

Answer

Giulio Piancastelli picture Giulio Piancastelli · Nov 19, 2011

s/1 does not do anything in itself, and it's not really a predicate. They are just terms, a representation of the successor of their argument. So, s(0) is used to represent the successor of 0 (i.e. 1), s(s(0)) is used to represent the successor of s(0) (i.e. 2), and so on and so forth. They are so widespread in Prolog because Prolog is quite fine a language to perform symbolic computation, whereas even simple arithmetic operations feel clunky, meaning that they are not seamlessly integrated with the programming paradigm.