Правила Пролога не «возвращают» значения, и шаблон со стрелкой и точкой с запятой не самый идиоматичный способ сделать это Вместо этого вы должны использовать два правила, по одному для каждого случая Sx. Я не уверен, что вы пытаетесь представить своим примером. Какое значение вы ожидаете от Sy, если Sx не больше нуля? Предполагая, что вы хотите, чтобы Sy был Sx в этом случае:
prog(Sx, Sy) :- Sx > 0, update(Sx,10,S1), update(S1,10,S2), prog(S2,Sy).
prog(Sx, Sx) :- Sx <= 0.
Чтобы использовать это с другим предикатом, вы должны сделать что-то вроде этого:
prog(40, V),
write(V),
prog(V, Z),
write(Z).
И так далее, со вторым параметром, связанным с «ответом» в каждом случае.